PC-first Mastodon client (Web + Desktop) with a custom UI kit and workspace packages.
@ghostodon/core— API client, types, streaming discovery, PKCE helpers@ghostodon/ui— design system + shared components@ghostodon/state— Zustand stores + persistence@ghostodon/plugins— plugin registry + extension points@ghostodon/desktop— Tauri helper wrappers (safe runtime checks)@ghostodon/web— React app shell (3-pane)@ghostodon/desktop-app— Tauri wrapper app
This repo includes a minimal baseline you can hand to CODEX:
- Stories in the feed (synthetic): a horizontal rail above the timeline.
- Avatar story ring: accounts with recent media in the fetched chunk show a ring.
- Story viewer overlay: Instagram-like viewer that plays recent media posts.
- Thread + profile navigation: open post thread (inspector) or profile from cards / viewer.
- Paged loading: timelines and profile posts load 20 items first, then +10 (button + scroll sentinel). Comment preview expands with a lightweight prefetch on hover.
Note: Mastodon has no native stories API. Ghostodon derives “stories” from recent media posts (
accounts.statuses?only_media=true).
Install pnpm (once):
npm i -g pnpmInstall dependencies (root):
pnpm installRun web app:
pnpm dev
# or
pnpm --filter @ghostodon/web devRun Tauri desktop:
pnpm dev:desktopmkdir -p packages/foo/srcCreate packages/foo/package.json:
{
"name": "@ghostodon/foo",
"private": true,
"version": "0.0.0",
"type": "module",
"exports": {
".": {
"types": "./src/index.ts",
"import": "./src/index.ts"
}
}
}Then depend on it from the web app:
pnpm --filter @ghostodon/web add @ghostodon/foo@workspace:*Create apps/myapp with its own package.json (name it @ghostodon/myapp) and it will be picked up automatically via pnpm-workspace.yaml.
Notes:
.npmrcusesnode-linker=hoistedto reduce Windows/TAURI friction.- Internal deps use
workspace:*for zero-version-drift.
- Cross-platform (recommended):
pnpm setup- Or run a platform script:
# Linux/macOS
./scripts/setup.sh
# Windows PowerShell
./scripts/setup.ps1If you want dependencies downloaded into this repo folder (useful for moving the project between machines or preparing for an offline install), this repo is configured with:
.npmrc:store-dir=.pnpm-store
Commands:
pnpm fetch:deps # downloads packages into .pnpm-store
pnpm install:offline # installs using only .pnpm-storeOr run setup with fetching:
pnpm setup -- --fetch