- TypeScript 78.5%
- CSS 17.5%
- HTML 2.6%
- JavaScript 1.4%
| public | ||
| scripts | ||
| src | ||
| .gitignore | ||
| index.html | ||
| LICENSE | ||
| package-lock.json | ||
| package.json | ||
| README.md | ||
| tsconfig.json | ||
| vite.config.ts | ||
| wrangler.jsonc | ||
rikki.moe
A personal homepage built around a playful, simulated terminal. A single home directory links to Rikki’s blog, Git forge, GitHub, and email reveal. Everything runs in the browser.
Development
Use Node.js 22.12+ (Node.js 24 recommended) and npm.
npm ci
npm run dev
The development server listens on http://127.0.0.1:5173. Run the regression tests with npm test or use npm run test:watch while editing.
npm run build
npm run preview
The build type-checks TypeScript, bundles the app, and prerenders the initial terminal and destination links into dist/index.html. React hydrates that HTML in the browser. Production remains a static site with no runtime server. The preview server defaults to http://127.0.0.1:4173 and is for local verification.
Static deployment
The existing Cloudflare Pages project is rikki-moe-landing, with master as its production branch and rikki.moe as its custom domain. With Wrangler installed and authenticated, publish with:
npm run build
wrangler pages deploy dist --project-name rikki-moe-landing --branch master
Upload the contents of dist/ to the static document root for rikki.moe, including assets/, static/, and favicon.svg. Build locally or in CI; production needs no Node.js process or backend. The site assumes it is hosted at the domain root. Serve it over HTTPS so the browser can reveal the email address using Web Crypto.
The application has a single page and no client-side routes; no SPA rewrite rules are required. public/404.html makes unknown paths return an actual 404 on Pages instead of serving the homepage at every URL. public/robots.txt allows crawling and points to the one-page sitemap. Keep index.html, robots, and sitemap revalidated on deployments, and cache hashed assets/ files for a long lifetime. The prerendered homepage provides the three external destination links without JavaScript. No analytics or remote font requests are included.
Editing
src/site.tsis the shared destination configuration for the directory and terminal commands, including the prerendered links.src/commands.tsdefines command behavior and structured outputs. React renders entered text literally, including HTML-like strings.src/Refinement.tsxis an original number puzzle inspired by Severance’s macrodata refinement. Select four horizontal triples of matching digits and archive them to unlock thewafflereward. Progress is local to the open puzzle; the earned reward lasts for the current page visit, including after Home orclear.src/styles.cssdefines Tailwind theme tokens and the full-page blue terminal layout, with an original Rikki insignia and framed destination keys. The display uses system Courier and Georgia fonts. There are no CRT filters, scanlines, glow, or jitter animations.
The interface uses React and TypeScript, built by Vite with Tailwind CSS. Command history and transcript are session-only; no settings are written to local storage. No terminal command affects the host filesystem, starts a real shell, or contacts a backend. Fira Code’s font license is distributed in public/licenses/.
Commands and controls
help, blog, git, github, email, clear, su, sudo, shutdown, reboot, echo, df, pwd, cat, top, rm, ls, oiia, and rainbow are supported.
help lists only destinations and distinctive commands. Familiar simulated shell commands still work and remain available through Tab completion.
Severance easter eggs: refine opens the interactive file, wellness offers original observations about your outie, and waffle unlocks an entirely fictional waffle party after completing a file. They are also listed by help and available through Tab completion. The home screen links to refinement and wellness.
- Home cancels any running command and restores the welcome directory without reloading. The
clearcommand leaves an empty terminal. Both preserve command history. - Enter submits; Up/Down browse command history and restore the current draft.
- Tab completes a matching command at the input. Empty or unmatched input, and Shift+Tab, retain normal focus navigation. Escape closes suggestions.
- Ctrl+C or the Cancel control stops a running command. Clear also stops audio and delayed output.
oiiaplays the bundled audio only after a user action.rainbowtoggles its effect.- Email is revealed in the transcript using the original obfuscation scheme. This is bot friction, not a secrecy or security boundary.
Only one command runs at a time. Reading older output suspends auto-scroll; the “New output” button returns to the latest output. The prompt remains below the scrollable transcript, and the layout follows the visual viewport when a mobile keyboard opens. Mobile pages do not focus the input or open the software keyboard automatically.