Personal website and portfolio for Florian Pellet, aka @sheraff. It is a Solid/Vite app served by a Hono/Node server, with live GitHub data, articles, code experiments, a browser terminal, optional SSH/finger/git protocol servers, generated OpenGraph images, and resume exports.
- Renders a terminal-inspired portfolio page with links, identity details, GitHub profile imagery, contribution activity, open-source repository contributions, TanStack articles, code experiments, live public logs, and a decorative generated git graph.
- Provides an interactive in-page terminal backed by
just-bashand the virtual filesystem infs/. It supports common shell commands plus custom commands such asportfolio,mask,help,git,ll,whoami,hostname,history, and tab completion. - Serves the same toy terminal over SSH when the SSH server is enabled.
- Serves a small finger service with public user responses when the finger server is enabled.
- Serves a cloneable generated portfolio repository over the git protocol when the git server is enabled.
- Exposes structured JSON APIs for GitHub contributions, contributed repositories, TanStack articles, and lab projects.
- Streams a machine-readable
/llms.txtsummary for crawlers and LLMs. - Maintains public, anonymous-ish activity logs over
/eventsand/events/stream, shown in the side rail of the page. - Generates resume Markdown/PDF exports and social preview images.
- SolidJS with SSR/hydration
- Vite multi-environment build for client and server bundles
- Hono on Node for HTTP routing
- SQLite with Drizzle ORM for persisted GitHub data
- TypeScript, Valibot,
just-bash,ssh2 - pnpm for package management
- Node
26.3.1or compatible with this repo's direct TypeScript execution - pnpm
11.7.0 - Git
- A GitHub token for GitHub-backed endpoints: set
GITHUB_TOKENorGH_TOKEN - Google Chrome for
resume:pdfand OpenGraph image generation
Use pnpm, not npm, for project commands.
pnpm installStart the web app in development mode:
pnpm dev --port 5743Then open http://localhost:5173.
The web server only starts when PORT or --port is provided. Optional protocol servers can be started too:
pnpm dev --port=5173 --ssh=2222 --finger=7979 --git=9418Build the app:
pnpm buildStart the production HTTP server:
pnpm start --port 3000Run pnpm git:build before a production build when the generated git graph or cloneable git repository needs to be refreshed:
pnpm git:build
pnpm buildEnable optional production protocol servers with CLI flags:
pnpm start --port=3000 --ssh=22 --finger=79 --git=9418Production SSH requires .ssh_host_ed25519_key in the project root. Development mode generates an ephemeral key if that file is missing.
GitHub snapshots and query windows are stored in SQLite. The default database is
$XDG_STATE_HOME/minifolio/development.sqlite in development and
$XDG_STATE_HOME/minifolio/production.sqlite in production, falling back to
~/.local/state. Set MINIFOLIO_DATABASE_PATH to override it. Production
startup runs the migrations in drizzle/, so deployments must include that
directory alongside dist/.
/serves the portfolio app./resume.html,/resume.pdf, and/resume.mdserve resume exports frompublic/./llms.txtstreams a text summary with identity, resume links, and live site data./uptimereturns process uptime as plain text./eventsreturns recent public log history as text or JSON, depending onAccept./events/streamstreams public logs using Server-Sent Events./og.pngserves the default OpenGraph image, with Bluesky and Twitter variants selected by crawler user agent./api/healthreturns{ "ok": true }./api/github/contributionsreturns the GitHub contribution calendar forsheraff./api/github/repositoriesreturns repositoriessheraffhas contributed to, excluding owned repositories./api/articles/tanstackreturns Florian Pellet's TanStack RSS articles./api/projectsreturns lab project metadata fromhttps://sheraff.github.io/vite-labs/projects.json./api/brew?drink=teareturnsSteeping.;/api/brew?drink=coffeereturns HTTP418.
API responses are schema-validated. GitHub data is persisted in SQLite and refreshes daily; TanStack articles and lab projects are cached in memory and refresh hourly.
- Browser terminal: type on the portfolio page, then press Enter. Try
help,ls,portfolio,cat contact.txt,cat stack.txt, orgit log. - SSH terminal:
ssh florianpellet.comin production, orssh -p 2222 localhostin local development when--ssh=2222is enabled. - Git clone:
git clone git://florianpellet.com/in production, orgit clone git://localhost:9418/when--git=9418is enabled andpnpm git:buildhas createddist/minifolio.git. - Finger:
finger @florianpellet.comin production, or query the local finger port when enabled.
pnpm git:buildcreatesdist/minifolio.gitand updatessrc/generated/minifolio.graph.jsonfrom the scripted portfolio timeline inscripts/build-git.ts.pnpm og:imagerenderspublic/og.pngusing Chrome andog.html.pnpm og:image:allrenders the default, Bluesky, and Twitter OpenGraph images.pnpm resume:mdconvertspublic/resume.htmltopublic/resume.md.pnpm resume:pdfprintspublic/resume.htmltopublic/resume.pdfusing Chrome.
pnpm check
pnpm test
pnpm db:checkTests cover the browser/SSH terminal core, GitHub response transformations, rate-limit handling, adaptive query splitting, and SQLite snapshot persistence.
src/contains the Solid app, sections, terminal core, styles, OpenGraph renderer, and generated git graph JSON.server/contains the Hono web server, APIs, public log streaming, prerender runtime, SSH server, finger server, and git protocol server.drizzle/contains the SQLite migration history used at server startup.fs/is the virtual filesystem exposed inside the browser and SSH terminals.public/contains static assets, resume exports, OpenGraph images,humans.txt,robots.txt, andsecurity.txt.scripts/contains generators for the git timeline/repository, OpenGraph screenshots, resume Markdown, CSS inlining, prerender manifests, and git log assets.