tskr makes household tasks fair and visible by assigning chores, logging completions, and turning points into rewards. Recognize hard work with perks like pocket money, reduced rent, or a shared flatmate pool.
Built for families, roommates, and shared houses that want a simple points-based chore loop.
More screenshots: Assignments, Household
- Assign tasks and log completions with an approval flow.
- Track points, streaks, and reward progress on a shared dashboard.
- Keep an audit trail and leaderboard to stay aligned.
- Organize by household with role-based access.
- Next.js 16 + React 19
- NextAuth (credentials + Google OAuth)
- Prisma + SQLite (default)
- Tailwind CSS + Radix UI
Translations live in src/locales/<lang>/translation.json. Locale folders must be lowercase (e.g., en, pt-br).
Add a new language:
- Create
src/locales/<lang>/translation.json. - Run
pnpm i18n:syncto regeneratesrc/locales/supported.json, enforce static translation keys, and update locale keys from the codebase.
i18next-scanner is configured to prune unused keys (removeUnusedKeys: true).
CI runs pnpm i18n:check to ensure locale files are up to date and dynamic translation keys are not used.
Translation workflow:
- Run
pnpm prepbefore opening a PR. This is the primary local quality gate. prepincludes i18n sync, lint fixes, TypeScript compile, and tests.- Run
pnpm i18n:syncwhen you only want to refresh locale files while working. - CI runs
pnpm i18n:check, which fails if locale files would change.
- Email + password credentials.
- Optional Google OAuth via
GOOGLE_CLIENT_IDandGOOGLE_CLIENT_SECRET.
Prereqs:
- Node 24 (matches
flake.nix) or use the Nix dev shell - pnpm 10 (via
corepack enable)
If you have Nix + direnv installed, entering the repo will automatically load the dev shell:
direnv allow- Copy the example env file:
cp .env.example .env-
Update
.envas needed. At minimum setNEXTAUTH_SECRETandNEXTAUTH_URL.DATABASE_URLdefaults tofile:./prisma/dev.db. Google OAuth reads fromprocess.env.GOOGLE_CLIENT_IDandprocess.env.GOOGLE_CLIENT_SECRET(leave blank to disable the Google button). SetSUPER_ADMIN_EMAILto bootstrap the first super admin account if none exists; a temporary password is generated and logged on first bootstrap (password reset required on first login). SetSUPER_ADMIN_FORCE_PASSWORD=1to rotate the password on the next bootstrap. Push notifications need the VAPID variables. -
Install dependencies and prepare Prisma:
pnpm install
pnpm db:generate
pnpm db:setup- Start the dev server:
pnpm devOpen http://localhost:3000 with your browser to see the result.
Releases are tag-driven. The release script creates and optionally pushes a semver tag.
Check what is not released yet:
pnpm release:pendingCreate a release tag from main:
pnpm release patch --push
# or minor / major / --version x.y.zPreview the release flow without changing git state:
pnpm release patch --dry-runNotes:
- Tag format is
x.y.z(novprefix). releasemust run frommainand verifiesHEADmatchesorigin/mainbefore tagging.- Deployment is triggered by pushing a semver tag (
*.*.*). package.jsonversion is intentionally fixed at1.0.0; release versions come from git tags.
Pull the image:
docker pull ghcr.io/<owner>/tskr:latestRun the container (persists the SQLite db and generated secrets under /data):
docker run --rm \
-p 3000:3000 \
-v tskr-data:/data \
-e NEXTAUTH_URL="http://localhost:3000" \
ghcr.io/<owner>/tskr:latestBuild and run locally instead:
docker build -t tskr .
docker run --rm -p 3000:3000 -v tskr-data:/data --env-file .env tskrNotes:
DATABASE_URLis optional; the entrypoint defaults tofile:/data/dev.db.- Migrations run on container start when Prisma migrations are present.
- Set
NEXTAUTH_SECRETfor stable sessions. If unset, the entrypoint generates one and stores it in/data/tskr-secrets.env. - Google OAuth reads
GOOGLE_CLIENT_IDandGOOGLE_CLIENT_SECRET(leave them blank to disable the Google button). - Set
VAPID_PUBLIC_KEY,VAPID_PRIVATE_KEY, andVAPID_SUBJECTto enable push notifications; otherwise the entrypoint will generate keys on first run.
