Selftend is a set of free, private mental health tools: everyday tools for right now, and a CBT programme - cognitive behavioural therapy - to work through when you want one. Web, iOS and Android. No ads, no subscriptions.
1
stars
1,114
commits
TypeScript
primary language
Sep 11, 2026
updated
Free, open-source guided self-help for web, iOS, and Android.
Selftend is being built around private guided self-help. The current working slice pairs two evidence-based modules - a Gillihan-based CBT toolkit (thought records, exposure, worry, anger, beliefs, recovery planning) and an ACT module - with a set of shared tools: mood tracker, journal, gratitude log, grounding, meditation and breathing, sleep, and habits. A DBT module is on the roadmap. It has no ads, subscriptions, or paywalls.
Your entries are encrypted in the database at the field level; a leaked database backup exposes only ciphertext, not your content. See .github/SECURITY.md for the full security posture.
Selftend is guided self-help - not therapy, diagnosis, or crisis support. If things feel heavy, see selftend.org/crisis.
No setup needed - the app ships in English and Bulgarian on all three platforms:
Requires Node 22.13.0+.
git clone https://github.com/Selftend/selftend.git
cd selftend
npm install
Create one environment file:
cp .env.example .env
Use .env for hosted Supabase values. For local Supabase development, use:
cp .env.local.example .env.local
npx supabase start
npx supabase start is only needed this once, to boot the local stack and print the anon key for .env.local (requires Docker). After that, the local-Supabase start scripts boot Docker Desktop (Windows/macOS) and the stack automatically whenever they are down.
In dev mode .env.local overrides .env (Expo's metro transform merges every .env* file over process.env). The default start scripts load .env.local. The start:prod* scripts load .env and temporarily hide .env.local so the dev-client actually hits the hosted Supabase - see docs/android-development.md for the gory details.
npm run web # browser at http://localhost:8081
npm run start # Android device, local Supabase (boots Docker + local stack if down)
npm run start:prod # Android device, hosted Supabase (hides .env.local for the run)
npm run start:emulator # Android emulator, local Supabase (boots Docker + local stack if down)
npm run start:prod:emulator # Android emulator, hosted Supabase
npm run ios # iOS simulator
npm run typecheck
npm run lint
npm run test
npm run verify # lint + format:check + typecheck + test:coverage + ratchet
npm run format
npm run test:coverage # run tests + write coverage report to coverage/ (report only; does not enforce the floor)
npm run coverage:ratchet # fail if lines/statements/functions/branches drop below coverage/baseline.json
npm run coverage:ratchet:update # lock in a new coverage floor after intentionally raising coverage
After running npm run coverage:ratchet:update, commit the updated coverage/baseline.json to keep the floor in sync.
| Topic | Guide |
|---|---|
| Contributing | .github/CONTRIBUTING.md |
| Branching & releases | docs/releasing.md |
| Security | .github/SECURITY.md |
| Code of Conduct | .github/CODE_OF_CONDUCT.md |
| Docs index | docs/README.md |
| Android setup | docs/android-development.md |
| Architecture | docs/architecture.md |
| Stack | docs/stack.md |
| Privacy data model | docs/data-privacy-model.md |
| Supabase setup | supabase/README.md |
Selftend is translated on Hosted Weblate. The app currently ships in English and Bulgarian; translation files live in src/i18n/locales/. To help translate, pick a language on the Weblate project page - no development setup needed.
Code is licensed under AGPL-3.0-only. The Selftend name, logo, and branding are not licensed for reuse. See LICENSE and .github/THIRD_PARTY_NOTICES.md.
1,114 commits
TypeScript
81.9%
PLpgSQL
11.2%
JavaScript
6.7%
Selftend is a set of free, private mental health tools: everyday tools for right now, and a CBT programme - cognitive behavioural therapy - to work through when you want one. Web, iOS and Android. No ads, no subscriptions.
1
stars
1,114
commits
TypeScript
primary language
Sep 11, 2026
updated
Free, open-source guided self-help for web, iOS, and Android.
Selftend is being built around private guided self-help. The current working slice pairs two evidence-based modules - a Gillihan-based CBT toolkit (thought records, exposure, worry, anger, beliefs, recovery planning) and an ACT module - with a set of shared tools: mood tracker, journal, gratitude log, grounding, meditation and breathing, sleep, and habits. A DBT module is on the roadmap. It has no ads, subscriptions, or paywalls.
Your entries are encrypted in the database at the field level; a leaked database backup exposes only ciphertext, not your content. See .github/SECURITY.md for the full security posture.
Selftend is guided self-help - not therapy, diagnosis, or crisis support. If things feel heavy, see selftend.org/crisis.
No setup needed - the app ships in English and Bulgarian on all three platforms:
Requires Node 22.13.0+.
git clone https://github.com/Selftend/selftend.git
cd selftend
npm install
Create one environment file:
cp .env.example .env
Use .env for hosted Supabase values. For local Supabase development, use:
cp .env.local.example .env.local
npx supabase start
npx supabase start is only needed this once, to boot the local stack and print the anon key for .env.local (requires Docker). After that, the local-Supabase start scripts boot Docker Desktop (Windows/macOS) and the stack automatically whenever they are down.
In dev mode .env.local overrides .env (Expo's metro transform merges every .env* file over process.env). The default start scripts load .env.local. The start:prod* scripts load .env and temporarily hide .env.local so the dev-client actually hits the hosted Supabase - see docs/android-development.md for the gory details.
npm run web # browser at http://localhost:8081
npm run start # Android device, local Supabase (boots Docker + local stack if down)
npm run start:prod # Android device, hosted Supabase (hides .env.local for the run)
npm run start:emulator # Android emulator, local Supabase (boots Docker + local stack if down)
npm run start:prod:emulator # Android emulator, hosted Supabase
npm run ios # iOS simulator
npm run typecheck
npm run lint
npm run test
npm run verify # lint + format:check + typecheck + test:coverage + ratchet
npm run format
npm run test:coverage # run tests + write coverage report to coverage/ (report only; does not enforce the floor)
npm run coverage:ratchet # fail if lines/statements/functions/branches drop below coverage/baseline.json
npm run coverage:ratchet:update # lock in a new coverage floor after intentionally raising coverage
After running npm run coverage:ratchet:update, commit the updated coverage/baseline.json to keep the floor in sync.
| Topic | Guide |
|---|---|
| Contributing | .github/CONTRIBUTING.md |
| Branching & releases | docs/releasing.md |
| Security | .github/SECURITY.md |
| Code of Conduct | .github/CODE_OF_CONDUCT.md |
| Docs index | docs/README.md |
| Android setup | docs/android-development.md |
| Architecture | docs/architecture.md |
| Stack | docs/stack.md |
| Privacy data model | docs/data-privacy-model.md |
| Supabase setup | supabase/README.md |
Selftend is translated on Hosted Weblate. The app currently ships in English and Bulgarian; translation files live in src/i18n/locales/. To help translate, pick a language on the Weblate project page - no development setup needed.
Code is licensed under AGPL-3.0-only. The Selftend name, logo, and branding are not licensed for reuse. See LICENSE and .github/THIRD_PARTY_NOTICES.md.
1,114 commits
TypeScript
81.9%
PLpgSQL
11.2%
JavaScript
6.7%