Selftend/selftend

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

selftend.org
agpl
cbt
expo
mental-health
privacy
react-native
self-help
supabase
typescript
Browse cluster: React Native and Expo Development

README

Selftend

Selftend logo

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.

Try it

No setup needed - the app ships in English and Bulgarian on all three platforms:

Community

  • Discord - questions, feedback, and contributor chat
  • r/Selftend - community on Reddit
  • YouTube - a short trailer plus a walkthrough of every tool

Quick Start

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.

Run

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

Checks

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.

Documentation

TopicGuide
Contributing.github/CONTRIBUTING.md
Branching & releasesdocs/releasing.md
Security.github/SECURITY.md
Code of Conduct.github/CODE_OF_CONDUCT.md
Docs indexdocs/README.md
Android setupdocs/android-development.md
Architecturedocs/architecture.md
Stackdocs/stack.md
Privacy data modeldocs/data-privacy-model.md
Supabase setupsupabase/README.md

Translations

Translation status

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.

License

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.

Contributors

vasilyoshev

1,114 commits

Selftend/selftend

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

selftend.org
agpl
cbt
expo
mental-health
privacy
react-native
self-help
supabase
typescript
Browse cluster: React Native and Expo Development

README

Selftend

Selftend logo

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.

Try it

No setup needed - the app ships in English and Bulgarian on all three platforms:

Community

  • Discord - questions, feedback, and contributor chat
  • r/Selftend - community on Reddit
  • YouTube - a short trailer plus a walkthrough of every tool

Quick Start

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.

Run

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

Checks

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.

Documentation

TopicGuide
Contributing.github/CONTRIBUTING.md
Branching & releasesdocs/releasing.md
Security.github/SECURITY.md
Code of Conduct.github/CODE_OF_CONDUCT.md
Docs indexdocs/README.md
Android setupdocs/android-development.md
Architecturedocs/architecture.md
Stackdocs/stack.md
Privacy data modeldocs/data-privacy-model.md
Supabase setupsupabase/README.md

Translations

Translation status

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.

License

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.

Contributors

vasilyoshev

1,114 commits

Languages

TypeScript

81.9%

PLpgSQL

11.2%

JavaScript

6.7%