(under work)
You're not lazy. Your job search system is.
Open source. Privacy-first. Self-host free, or use slothing.work weekly while you are actively searching.
Slothing is your personal job-application command center. Upload your career documents, build tailored resumes and cover letters in one workspace, track opportunities, and prepare for interviews. AI does the heavy lifting; you keep your data.
| You want… | Use… |
|---|---|
| Full control, run it on your own machine | Self-host (this repo, free forever) |
| No setup, login and go | slothing.work ($6.99/wk or $19.99/mo) |
| Try the hosted app with your own OpenAI/Anthropic key | slothing.work Free tier (bring-your-own-key) |
The hosted version is the same code as this repo plus a small proprietary billing module. See LICENSING.md for how the open-core split works.
Most job-search tools either store your résumé in their database forever or charge $30/month indefinitely for features you only need during an active search. Slothing inverts both:
- Your data is yours. Self-host and nothing leaves your machine. On the hosted version, delete your account at any time and the data goes with you.
- Pay weekly. The hosted plan is built around the assumption that you shouldn't be using Slothing forever. $6.99/wk means you can spin up during a job hunt and stop paying the moment you land an offer.
- Open source, not "source available". Real AGPL v3. You can read every line of the AI prompts, scraping logic, and scoring algorithms that touch your data.
- Document Studio — Unified resume + cover letter workspace at
/studiowith templates, version history, and a TipTap-backed editor. - Knowledge Bank — Upload résumés, cover letters, and supporting docs; AI extracts structured profile data you can reuse across applications.
- Opportunity Tracker — Jobs and hackathons in one pipeline (
/opportunities), with a review queue for scraped/extension/inbound listings. - AI Tailoring — Paste a JD, get a tailored résumé and cover letter pulled from your knowledge bank. Multi-provider: OpenAI, Anthropic, Ollama, OpenRouter.
- Interview Prep — Text and voice mock interviews with AI feedback.
- Slothing Browser Extension — Auto-fill applications, scrape job postings into your tracker, bulk import from WaterlooWorks.
- Google Integration — Calendar sync, Drive import/backup, Gmail import/send, Docs/Sheets export.
- Analytics, Calendar, Salary tools, Email templates — the rest of the command center.
| Slothing review queue | Gmail import | Job-board capture |
|---|---|---|
![]() |
![]() |
![]() |
- Framework: Next.js 14 (App Router) on a Turborepo + pnpm monorepo
- Language: TypeScript (strict)
- Database: libSQL/Turso with Drizzle (better-sqlite3 locally)
- Auth: NextAuth v5 (Google OAuth + optional Resend magic links)
- AI: OpenAI, Anthropic, Ollama (local/free), or OpenRouter — your pick
- UI: Tailwind CSS + shadcn/ui patterns, semantic-token design system
- Editor: TipTap
- Testing: Vitest (unit) + Playwright (e2e)
You'll have a fully functional Slothing running locally in about three minutes.
- Node.js 18+
- pnpm 9+
- (Optional) Ollama for free local AI — install from ollama.ai
pnpm install
cp .env.example apps/web/.env.local
pnpm devOpen http://localhost:3000.
If you just want to poke around without setting up Google OAuth, add this to
apps/web/.env.local:
NEXTAUTH_URL=http://localhost:3000
NEXTAUTH_SECRET=$(openssl rand -base64 32)
NEXT_PUBLIC_NEXTAUTH_ENABLED=false
SLOTHING_ALLOW_UNAUTHED_DEV=1
TURSO_DATABASE_URL=file:./.local.dbAll requests are served as the default user. Don't ship this in production —
it has no auth.
Option 1 — Ollama (free, local, recommended for self-host):
ollama pull llama3.2Then in Slothing → Settings, select "Ollama" and click Test connection.
Option 2 — Bring your own API key:
Settings → pick OpenAI / Anthropic / OpenRouter → paste your key → Test connection. Your key stays in your local database and is never sent anywhere except directly to the LLM provider.
For a real self-hosted deployment with Docker Compose, env vars, BYOK setup,
and backup guidance, see docs/self-hosting.md.
Connect your Google account to enable:
- Calendar Sync — interview schedules with Google Calendar
- Drive — import résumés from Drive, back up generated documents
- Gmail — import job-related emails, send emails directly
- Docs/Sheets — export interview notes to Docs, analytics to Sheets
- Contacts/Tasks — save recruiter contacts, sync reminders
Setup:
- Set
GOOGLE_CLIENT_ID,GOOGLE_CLIENT_SECRET, andNEXTAUTH_SECRETinapps/web/.env.local. - Set the Google OAuth redirect URI to
http://localhost:3000/api/auth/callback/google. - In Slothing → Settings → Google Integrations, click Connect Google Account.
See docs/google-integration/README.md for
the full guide.
The Slothing browser extension auto-fills job applications and imports listings into your opportunity tracker.
Build it:
pnpm --filter @slothing/extension build:chrome # → apps/extension/dist/
pnpm --filter @slothing/extension build:firefox # → apps/extension/dist-firefox/Load it:
- Chrome:
chrome://extensions→ Developer mode → Load unpacked → pickapps/extension/dist/ - Firefox:
about:debugging#/runtime/this-firefox→ Load Temporary Add-on → pickapps/extension/dist-firefox/manifest.json
Try the demo first:
node apps/extension/demo/launch-with-extension.mjsBoots a Chromium with the extension pre-loaded and opens a sample job-application form so you can see scraping, the badge, and popup behavior end-to-end.
Connect: click the Slothing icon → Connect Account → opens
/extension/connect on your locally-running Slothing, generates a token tied to
your session. After connecting, Cmd+Shift+F auto-fills, Cmd+Shift+I imports.
WaterlooWorks bulk import: when on waterlooworks.uwaterloo.ca, the popup
shows a Detected: WaterlooWorks section with single-posting, visible-rows,
and full-set scrape buttons (paginated, capped at 200). See
apps/extension/README.md.
New permission: Slothing requests webNavigation so it can detect user-driven step changes inside Workday and Greenhouse application flows after you start autofill. The extension does not collect browsing history and does not submit applications. If the permission is unavailable, Slothing falls back to asking before filling each new step. See docs/extension-release-followthrough-2026-05.md for the release note and verification checklist.
Full docs: apps/extension/README.md.
apps/
├── web/
│ ├── src/ # Next.js pages, components, lib, hooks
│ │ └── cloud/ # Proprietary hosted-only code (see LICENSING.md)
│ ├── drizzle/ # Database migrations
│ ├── e2e/ # Playwright tests
│ └── evals/ # Resume + cover-letter eval harness
└── extension/ # Slothing browser extension
packages/
└── shared/
└── src/ # Shared types, Zod schemas, formatters, scoring
Run commands from the repo root:
pnpm install
pnpm dev # Web dev server on port 3000
pnpm run type-check # TypeScript strict
pnpm run test:run # Vitest one-shot (used in CI)
pnpm run lint # Next lint + forbidden-color check
pnpm run build # Production buildPackage-scoped:
pnpm --filter @slothing/web db:migrate
pnpm --filter @slothing/web test:e2e
pnpm --filter @slothing/extension buildVercel should use apps/web as the project Root Directory, or build from the
repo root with the Turborepo pipeline.
Application data lives in libSQL/Turso (schema:
apps/web/src/lib/db/schema.ts). Local development defaults to
file:./.local.db. Hosted deployments set TURSO_DATABASE_URL and, when
required, TURSO_AUTH_TOKEN.
Locally:
.local.db— libSQL databaseuploads/— uploaded documentspublic/resumes/— generated résumé files- Browser localStorage (
taida:prefix) — Studio version history snapshots
/studio is the single document-building workspace. Resume and cover-letter
creation share one header, file panel, document canvas, and AI assistant area.
/studio
├── Header
│ ├── Resume / Cover Letter tabs
│ ├── Template picker
│ ├── Save status
│ └── Export (Copy HTML / Download PDF)
├── Left drawer (collapsible)
│ ├── Files
│ ├── Version history
│ └── Knowledge bank entry picker
├── Center
│ └── TipTap-backed document preview/editor
└── Right drawer (collapsible)
└── AI Assistant
The Studio file panel tracks resume and cover-letter files separately while
keeping users in the same workspace. Version history helpers normalize, compare,
and store capped snapshots in browser storage under
taida:builder:versions:<document-id>.
See docs/architecture.md for a deeper architectural
overview with diagrams.
Resume and cover-letter generation evals live under apps/web/evals/. Run
pnpm --filter @slothing/web eval -- --mode=resume --limit=5 with an LLM key,
or set EVAL_OFFLINE=1 for a deterministic local smoke run. See
docs/evals.md for cases, metrics, report formats, and judge
options.
Contributions are welcome under the AGPL-3.0 license that governs this repo. By submitting a pull request you agree your contribution is licensed under AGPL-3.0 (same as the rest of the project — there is no CLA).
If your PR modifies files inside apps/web/src/cloud/, that's proprietary code
and we'll need a separate conversation about licensing. See
LICENSING.md.
Before opening a PR:
pnpm run type-checkpassespnpm run test:runpassespnpm run lintpasses (this includes the forbidden-color hard-fail check — never use rawbg-white/text-gray-*/hex colors, use semantic tokens)- Pre-commit hook runs
lint-staged+ type-check; don't bypass with--no-verify
See ROADMAP.md.
This repository is licensed under the
GNU Affero General Public License v3, with one small proprietary
carve-out for hosted-only billing code under apps/web/src/cloud/. See
LICENSING.md for the full breakdown.
"Slothing" is an unregistered trademark of Kevin Jiang.


