Skip to content

[nightshift] repo-topology: repository structure analysis of micr-dev/thinko #4

Description

@nightshift-micr

Repository Topology Report

Directory Structure

thinko-repo/
├── api/ Express backend API server
│ ├── index.js Entry point (redirect)
│ └── _lib/ Business logic
│ ├── handlers.js All route handlers (~747 lines)
│ ├── auth.js HMAC-signed cookie sessions + OAuth (~164 lines)
│ ├── config.js Env var accessors (~67 lines)
│ ├── drawings-store.js Vercel Blob storage (~243 lines)
│ ├── commissions-store.js Commission manifest + image storage (~704 lines)
│ ├── http.js Express response helpers (~99 lines)
│ └── ntfy.js ntfy.sh push notifications (~31 lines)
├── src/ React frontend (~17K lines JS/JSX)
│ ├── index.js React root mount point
│ ├── App.js Root component - route dispatcher
│ ├── app-mode.js Boot experience (desktop vs mobile vs admin)
│ ├── setupProxy.js CRA dev proxy: /api to :4748, /agentation to :4747
│ ├── admin/DrawingsAdminPage.js Admin panel (~1079 lines)
│ ├── mobile-site/ Mobile-first fallback (~582 lines)
│ ├── components/ Shared UI components
│ ├── hooks/ Custom React hooks
│ ├── WinXP/ Core WinXP desktop simulator (~1235+ lines)
│ └── utils/
├── server/ Express server entry point (49 lines)
├── public/ Static assets
│ └── custom/games/ Embedded HTML5/JS games
├── demo/demo.gif Repo preview GIF
└── package.json

Three Rendering Modes

src/App.js conditionally renders:

  1. DrawingsAdminPage - /admin/drawings route; lazy-loaded admin panel
  2. MobileSite - viewport 820px or less; lazy-loaded
  3. WinXP - default desktop experience; lazy-loaded WinXP simulator

Module Dependencies

Frontend: src/index.js -> App.js -> app-mode.js + lazy(WinXP/MobileSite/AdminPage)
WinXP/index.js -> constants/, wallpaper-registry.js, apps/index.js -> individual apps
Backend: server/index.js -> api/_lib/handlers.js -> auth.js, config.js, drawings-store.js, commissions-store.js, http.js, ntfy.js

Key WinXP Apps

Minesweeper, Paint (Canvas/Toolbar/MenuBar/PatternPalette/StrokeSettings/FiltersMenu), Winamp (webamp), InternetExplorer, My Computer, DrawingsFolder, commission-viewer, virtual-pc (game launcher), IWBTG, Nyan Cat, image-viewer

API Surface

Public: GET /api/drawings/public, GET /api/drawings/image, GET /api/commissions/public, GET /api/commissions/icon, GET /api/commissions/image, POST /api/drawings/submissions (rate-limited: 5/10min)

Admin (OAuth): GET /api/admin/session, POST /api/admin/logout, GET /api/admin/drawings/submissions, POST /api/admin/drawings/approve, POST /api/admin/drawings/reject, GET /api/admin/commissions, POST /api/admin/commissions, POST /api/admin/commissions/upload, POST /api/admin/commissions/delete, GET /api/admin/oauth/github/start, GET /api/admin/oauth/github/callback

Technology Stack

Frontend: React 18.2.0, react-scripts 5.0.1, styled-components 4.2.0, react-use 7.0.1, webamp 1.3.2-beta.2
Backend: Express 5.2.1, @vercel/blob 2.3.1, sharp 0.34.5, agentation 2.3.3, http-proxy-middleware 3.0.5
Infrastructure: Vercel Blob (storage), ntfy.sh (notifications), catbox.moe (image hosting), GitHub OAuth (admin auth)

Observations

  1. Dual-server dev: concurrently runs Express (port 4748) and CRA dev (port 3000). setupProxy.js proxies /api in development.
  2. Three rendering modes via React.lazy code-splitting based on URL and viewport width.
  3. Commission artwork dynamically added as desktop icons. Icon positions merged from API data at runtime.
  4. HMAC-signed cookies for auth (no external session library) with 7-day expiry.
  5. WinXP state machine is ~1235 lines - candidate for decomposition into smaller reducers.
  6. Games embedded as static HTML served via iframe from public/custom/games/.
  7. Total codebase: ~17K lines frontend JS/JSX + ~7K lines backend JS = ~24K lines.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions