Tildom is a family of local-first personal web applications. The current apps are:
mark: bookmark and note manager.do: task manager.kin: personal relationship manager.
Each app runs as a Solid/Vite application and stores product data locally in browser SQLite/OPFS. Server APIs are optional and used only for features that require network access, such as bookmark metadata fetching or AI task breakdown.
For architecture, deployment direction, sync planning, and maintenance rules, read PROJECT.md.
apps/
mark/
do/
kin/
packages/
services/packages/ and services/ are intentionally light for now. Shared packages should be extracted only after real reuse pressure exists.
- Node.js 22+
- pnpm 11.10+
- Docker, optional for container deployment
pnpm installRun one app at a time from the repository root:
pnpm dev:mark
pnpm dev:do
pnpm dev:kinThe Vite dev server defaults to http://localhost:5173.
Run all app checks:
pnpm typecheck
pnpm test
pnpm buildRun a single app:
pnpm typecheck:mark
pnpm test:do
pnpm build:kinThe root Compose file currently runs Mark and the sync service by default:
docker compose up --buildMark is exposed on http://localhost:3000. Sync is exposed on http://localhost:8787.
do is available through the optional apps profile:
docker compose --profile apps up --buildWith that profile, do is exposed on http://localhost:3001.
GitHub Actions publishes Mark and sync images to GHCR on pushes to main, version tags, and manual runs:
ghcr.io/bart-jaskulski/tildom/mark
ghcr.io/bart-jaskulski/tildom/syncDeployment compose files are intentionally kept outside this application repo. The current homelab deployment lives at ../homelab/tildom/compose.yaml. Set MARK_SYNC_BASE_URL as a GitHub Actions repository variable before building Mark if sync is not served from https://sync.tildom.app.
pnpm workspaces are configured in pnpm-workspace.yaml. Future local packages should be consumed with the workspace protocol:
{
"dependencies": {
"@tildom/ui": "workspace:*"
}
}This keeps local package resolution explicit and prevents accidentally using a registry package when a workspace package is expected.