A terminal-inspired portfolio for Alexandre Gossard (@hakkaofdev) β Software Engineer & Digital Nomad.
Type commands, explore projects, browse skills, sign the guestbook, and even check what's playing on Spotify.
| Feature | Details | |
|---|---|---|
> |
Terminal UI | Command input, history navigation, autocomplete, fuzzy did-you-mean |
> |
18+ commands | help projects skills experiences education about contact guestbook cv repo theme stats echo clear reset spotify |
> |
Spotify integration | "Now Playing" header widget + spotify now / spotify top / spotify history |
> |
Guestbook | Public sign & read, honeypot + per-IP rate-limiting, moderation-ready |
> |
Dynamic CV | Server-rendered PDF via @react-pdf/renderer β preview or download |
> |
Advanced Theming | 8+ built-in terminal themes (Dracula, Nord, Solarized, etc.) + custom theme support with preview & WCAG validation |
> |
SEO | Sitemap, robots.txt, JSON-LD, dynamic OG image |
> |
Analytics | Vercel Speed Insights + Supabase page-view tracking |
Prerequisites β Node.js 22+ Β Β·Β pnpm 9+
# clone & install
git clone https://github.com/hakkaofdev/hakkaofdev.fr.git
cd hakkaofdev.fr
pnpm install
# develop
pnpm dev # β http://localhost:3000
# production
pnpm build && pnpm startCopy .env.example to .env.local and fill in the values you need:
# Required
NEXT_PUBLIC_SITE_URL=http://localhost:3000
# Spotify (optional β enables widget + commands)
SPOTIFY_CLIENT_ID=
SPOTIFY_CLIENT_SECRET=
SPOTIFY_REFRESH_TOKEN=
# Supabase (optional β enables analytics + guestbook)
NEXT_PUBLIC_SUPABASE_URL=
SUPABASE_SERVICE_ROLE_KEY=
APP_IP_SALT=
GUESTBOOK_AUTO_APPROVE=true
GUESTBOOK_RATE_LIMIT_MAX_PER_HOUR=3| Command | Description |
|---|---|
help |
List all available commands |
projects |
Show projects grid |
skills |
Show categorized skills |
about |
Personal details, languages, hobbies |
education |
Education timeline |
experiences |
Experience timeline |
guestbook |
List & sign guestbook entries |
contact |
Contact methods & social profiles |
cv |
Open CV preview / download |
repo |
Repository details & clone command |
theme |
Manage themes: theme list, theme set <name>, theme preview <name>, theme create, theme delete <name> |
stats |
Coding & GitHub activity stats |
echo <msg> |
Print custom text |
clear |
Clear terminal output |
reset |
Reset to the welcome screen |
spotify |
Spotify sub-command help |
spotify now |
Currently playing track |
spotify top |
Top tracks |
spotify history |
Recently played tracks |
app/
βββ api/ # Route handlers (cv, guestbook, spotify, views)
βββ layout.tsx # Root layout, providers, fonts
βββ page.tsx # Home (terminal shell)
βββ sitemap.ts # Dynamic sitemap
βββ robots.ts # Robots config
components/
βββ commands/ # Command descriptors, registries, renderers
βββ cv-pdf/ # React-PDF sections for CV generation
βββ ui/ # Reusable UI primitives
βββ Terminal.tsx # Main terminal component
βββ WelcomeHero.tsx # Initial greeting block
lib/
βββ constants/ # Site, resume, skills, terminal, guestbook config
βββ cv/ # CV data mapping & PDF styles
βββ schemas/ # Zod validation schemas
βββ services/ # Analytics, guestbook, Supabase clients
βββ themes/ # Theme engine: palettes, provider, storage, contrast validation
βββ utils.ts # Shared helpers
supabase/
βββ schema/ # SQL migrations (guestbook table, RLS policies)
The portfolio features a fully customizable theme engine with 8 built-in terminal-inspired themes and support for custom palettes.
Built-in Themes:
defaultβ Clean dark theme with cyan accentsdaylightβ Light theme with warm tonesdraculaβ Purple & pink dark themenordβ Arctic-inspired cool palettesolarizedβ Precision colors for readabilitymonokaiβ Vibrant syntax highlighting colorsgruvboxβ Retro groove with warm earth tonestokyo-nightβ Deep blue night theme
Theme Commands:
theme list # Show all available themes with color swatches
theme set dracula # Apply a theme instantly
theme preview nord # Preview for 10s, then revert
theme create # Interactive custom theme builder
theme delete <name> # Remove a custom themeCustom Themes:
- Create custom color palettes via the
theme createcommand - Automatic WCAG AA contrast validation ensures readability
- Themes persist in
localStorageacross sessions - Delete custom themes anytime (built-in themes are protected)
All theme changes apply instantly with smooth color transitions.
Content lives in lib/constants/ β edit the files there to change projects, skills, education, experiences, and social links.
Themes are in lib/themes/palettes/ β each theme exports a ThemePalette object with color definitions and metadata. See existing themes as templates.
Adding a command:
- Add it to
COMMANDSincomponents/commands/command-descriptors.ts - Create a renderer in
components/commands/renders/ - Wire it in the registry under
components/commands/registries/
Adding dynamic autocomplete parameters:
Commands can have smart autocomplete for their parameters (like theme set <themeName>). To add your own:
// 1. Create a parameter provider function
function getOptions(): string[] {
return ["option1", "option2", "option3"];
}
// 2. Register the command pattern
import { registerDynamicParamCommand } from "@/components/commands/registries/dynamic-param-registry";
registerDynamicParamCommand({
pattern: "mycommand action",
paramProvider: getOptions,
group: "Terminal",
});
// 3. Import your registry in components/providers/Providers.tsxSee components/commands/registries/EXAMPLES.ts for more patterns (localStorage, async data, context-aware, etc.)
Customizing the CV: update data in lib/cv/cv-pdf.data.ts, styles in lib/cv/cv-pdf.styles.ts, and sections in components/cv-pdf/CVSections.tsx.
Guestbook backend: SQL schema in supabase/schema/guestbook.sql, API in app/api/guestbook/route.ts, tune with GUESTBOOK_* env vars.
| Workflow | Trigger | What it does |
|---|---|---|
ci.yml |
PR / push to main |
Lint, typecheck, build |
dependency-audit.yml |
PR / weekly | pnpm audit --prod --audit-level=high |
release.yml |
Push to main |
Release-please automated versioning |
Deployed on Vercel β push to main and it ships.
pnpm lint # Biome lint
pnpm format # Biome format
pnpm typecheck # tsc --noEmit
pnpm audit # Dependency auditMIT β see LICENSE for details.
Made by Alexandre Gossard
