{"id":51328379,"url":"https://github.com/devfolioco/gochi-docs","last_synced_at":"2026-07-01T20:31:48.205Z","repository":{"id":361031825,"uuid":"1252365293","full_name":"devfolioco/gochi-docs","owner":"devfolioco","description":null,"archived":false,"fork":false,"pushed_at":"2026-05-28T22:21:05.000Z","size":155,"stargazers_count":0,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-29T00:14:02.368Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://gochi-docs.vercel.app","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/devfolioco.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-28T12:56:23.000Z","updated_at":"2026-05-28T18:32:32.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/devfolioco/gochi-docs","commit_stats":null,"previous_names":["devfolioco/gochi-docs"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/devfolioco/gochi-docs","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/devfolioco%2Fgochi-docs","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/devfolioco%2Fgochi-docs/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/devfolioco%2Fgochi-docs/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/devfolioco%2Fgochi-docs/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/devfolioco","download_url":"https://codeload.github.com/devfolioco/gochi-docs/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/devfolioco%2Fgochi-docs/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35022602,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-01T02:00:05.325Z","response_time":130,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-07-01T20:31:43.136Z","updated_at":"2026-07-01T20:31:48.200Z","avatar_url":"https://github.com/devfolioco.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# tamagotchi-website\n\nThe site for **Mr. Mini Tamagotchi** — build your own tiny desk pet.\n\nA blueprint-blue landing page with a working SSD1306 face animation, plus a\nFumadocs docs site at `/docs` for the build guide. Built on Next.js 16 App\nRouter; landing is fully SSR with a single client island for the canvas.\n\n```\n                ┌─────────────────────────┐\n                │   /            (SSR)    │  ← landing: hero + animated OLED\n                │   /docs        (SSG)    │  ← fumadocs build guide\n                └─────────────────────────┘\n```\n\n---\n\n## Quick start\n\n```sh\nbun install\nbun dev\n```\n\nOpen \u003chttp://localhost:3000\u003e.\n\n| Script           | What it does                                 |\n| ---------------- | -------------------------------------------- |\n| `bun dev`        | Dev server with HMR (Turbopack)              |\n| `bun run build`  | Production build (also runs `tsc`)           |\n| `bun start`      | Serve the production build                   |\n| `bun run lint`   | Lint (next + eslint)                         |\n\nUse Bun for all install/run commands.\n\n---\n\n## What's inside\n\n```\napp/\n├── layout.tsx                root \u003chtml\u003e + Google Font links (Pixelify Sans, Geist Mono)\n├── globals.css               truly global resets only — no colors, no fonts\n├── page.tsx                  landing page (Server Component)\n├── landing.css               landing styles, all scoped to .page\n├── components/\n│   ├── CircuitBoard.tsx      static SVG of the ESP32 + OLED assembly (server)\n│   └── OledFace.tsx          'use client' — canvas + procedural face animation\n├── docs/\n│   ├── layout.tsx            wraps fumadocs in .fd-shell, hosts RootProvider\n│   ├── docs.css              scoped tailwind + fumadocs preset + font overrides\n│   └── [[...slug]]/page.tsx  catch-all docs page handler\n└── layout.config.tsx         shared nav config for fumadocs layouts\n\ncontent/\n└── docs/                     MDX source files + meta.json sidebar order\n    ├── index.mdx\n    ├── hardware/soldering.mdx\n    ├── firmware/flashing.mdx\n    └── api/serial.mdx\n\nlib/source.ts                 fumadocs source loader\nsource.config.ts              fumadocs MDX config (schemas, paths)\nmdx-components.tsx            MDX component overrides\nnext.config.ts                wraps with fumadocs createMDX()\npostcss.config.mjs            tailwind v4 pipeline (only used by docs)\n```\n\n---\n\n## How it all fits together\n\n### Landing page (`/`)\n\nA single `\u003cmain className=\"page\"\u003e` in `app/page.tsx`. The entire page is a\nServer Component except for `\u003cOledFace /\u003e`, which is the only `'use client'`\nisland. `OledFace` is fully self-contained — it owns its own expression\nstate and cycles through 12 expressions on click, no props required.\n\n`CircuitBoard.tsx` is pure SVG and ships from the server with zero JS.\nThe OLED canvas hydrates in place above it.\n\nThe pixel face is a faithful port of `firmware/src/views/procedural_face.cpp`\n— same 128×64 buffer, same primitives, same blink + gaze state machine, same\n12 expressions (neutral, happy, sad, sleepy, excited, surprised, angry,\nblink, love, flirty, shy, dead). CSS scales the canvas up with\n`image-rendering: pixelated` so each OLED pixel reads as a deliberate block.\n\n### Docs site (`/docs`)\n\n[Fumadocs](https://fumadocs.dev) reads MDX from `content/docs/`. To add\na page, drop an `.mdx` file with frontmatter and update the local\n`meta.json` to position it in the sidebar:\n\n```mdx\n---\ntitle: My new page\ndescription: One sentence that shows up under the title.\n---\n\nContent here. Standard MDX — components, code blocks, callouts.\n```\n\n```json\n// content/docs/my-section/meta.json\n{ \"title\": \"My Section\", \"pages\": [\"intro\", \"my-new-page\"] }\n```\n\nStatic params are generated at build time from the MDX tree, so every\ndocs URL prerenders to HTML.\n\n### CSS isolation\n\nEvery route's styles are scoped to a wrapper class:\n\n- Landing: `.page` (everything from tokens to backgrounds)\n- Docs: `.fd-shell` (font overrides + the fumadocs background overlay)\n\n`globals.css` does not set colors, fonts, or backgrounds — those live in\nthe route-specific stylesheets. This matters because Next App Router keeps\nstylesheets loaded across client navigation; unscoped rules leak between\npages otherwise (an `h1 { font-size: 96px }` on the landing CSS will blow\nup every heading in the docs).\n\nThe backgrounds use `position: fixed` pseudo-elements on their wrapper\nclass, so they mount and unmount with the route — no flashes, no leftover\nblue when you ping-pong between `/` and `/docs`.\n\n---\n\n## Customizing\n\n**Change brand colors** — edit the tokens at the top of `.page` in\n`app/landing.css`. Everything down to the OLED glow reads from those vars.\n\n**Change the headline / date / location** — `app/page.tsx`, the\n`.eyebrow`, `\u003ch1\u003e`, and `.tags` block.\n\n**Change the docs theme** — pick a different fumadocs preset in\n`app/docs/docs.css` (e.g. `aspen.css`, `ocean.css`, `vitepress.css`).\n\n**Change the OLED face** — `app/components/OledFace.tsx`. Each expression\nhas its own `case` block; the rendering primitives mirror the firmware's\nRenderer API, so changes here can be ported back to the C++ firmware\nverbatim.\n\n---\n\n## Tech stack\n\n- **Next.js 16** (App Router, Turbopack) — SSR + static export of docs\n- **React 19** — Server Components by default\n- **Fumadocs UI v16** + **Tailwind CSS v4** — docs site\n- **Pixelify Sans** (Google Fonts) — landing \u0026 docs chrome\n- **Geist Mono** (Google Fonts) — code, mono labels\n- **TypeScript** (strict) — across the app\n\nThe landing page intentionally does **not** depend on Tailwind. Plain CSS\nkeeps the bundle small and the OLED-themed look easy to tune.\n\n---\n\n## Deploy\n\nThis is a vanilla Next.js app. Push to a repo and deploy on Vercel,\nCloudflare Pages, Netlify, or anywhere that runs Node 20+. No env vars\nare required for the site itself.\n\nThe docs are statically generated at build time (`generateStaticParams`\nin `app/docs/[[...slug]]/page.tsx`), so every doc URL becomes an HTML\nfile on disk — zero server cost.\n\n---\n\n## Related\n\nThe firmware that actually runs on the pet lives in a sibling repo —\nESP32-C3 SuperMini, Arduino core, built with `arduino-cli`. See the\n[wiring](/docs/wiring) and [firmware](/docs/firmware) docs for the build\ninstructions, and [serial](/docs/serial) for the line-based protocol the\npet speaks over USB CDC.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdevfolioco%2Fgochi-docs","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdevfolioco%2Fgochi-docs","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdevfolioco%2Fgochi-docs/lists"}