A keyboard-first portfolio presented as a terminal workspace. It follows the supplied desktop and mobile mockups while keeping native browser semantics underneath the command-line interaction layer.
The entire UI is set in Departure Mono from the font/ folder. Spacing is one line (1lh) or one column (1ch), the same discrete grid a terminal uses.
npm install
npm run dev
Copy .env.example to .env and set ADMIN_TOKEN before using the editor.
1–9: jump directly to a sectionJ / K (or arrow keys): move down or up through archive rowsEnter: open the selected row: or /: open quick accessCtrl+O / Ctrl+I: move backward or forward in historyCtrl+D / Ctrl+U: scroll half a pageAlt+? or F1: open helpQ or Escape: close an open panelEvery destination also remains reachable using links, Tab, Shift+Tab, Enter, and standard browser navigation. Color themes and code syntax colors share the same CSS token set.
Content lives in a document store (Cloudflare D1 when bound, otherwise an in-memory store seeded from lib/content/seed.ts). Add articles, projects, pages, or a new collection without changing the layout.
| Method | Path | Auth | Purpose |
|---|---|---|---|
| GET | /api/site |
public | Assembled public site |
| GET | /api/docs/:collection/:slug |
public | One published document |
| GET | /api/docs?collection= |
admin | List documents, including drafts |
| POST | /api/docs |
admin | Create a document |
| PUT | /api/docs/:collection/:slug |
admin | Create or update |
| DELETE | /api/docs/:collection/:slug |
admin | Delete |
| POST | /api/subscribe |
public | Newsletter signup |
| POST | /api/messages |
public | Contact form |
| GET | /api/messages |
admin | Inbox |
Admin console: /admin. Send Authorization: Bearer <ADMIN_TOKEN>.
To add a new section, create documents in any collection and a nav document whose data.path points at it, for example /photos. Numbers 1–9 follow nav sort order.