feels
A mood tracker for developers. Runs entirely in your terminal.
All data stays on your machine. No cloud. No accounts. No tracking.
Why
Most mood trackers are phone apps that want an account and your data. feels lives where developers already spend the day, the terminal. Logging takes ten seconds, a daily reminder opens it for you, and the graphs make a bad stretch obvious before it becomes a bad month.
Highlights
- Ten-second logging. Mood, optional focus and stress scores, an ASCII emoji and a note.
- Graphs and a calendar in the terminal, colored by score, built with Rich.
- Streaks and a weekly mood chart on the home screen.
- Daily reminders that open your terminal at a set time. It detects Ghostty, iTerm2 and Terminal.app.
- Local-first. One SQLite file and one JSON config in
~/.feels. Export to JSON or CSV any time. - Published on PyPI, with releases built and uploaded by GitHub Actions on every push to
main.
Install
pip install feels
First run walks you through a quick setup. Then just type feels.
You can also use fls as a shorter alias — same thing.
Commands
Logging
feels log # log how you're feeling
feels log --yesterday # log for yesterday
feels log --date DD-MM-YYYY # log for a specific date
Viewing logs
feels logs # last 7 days
feels logs --all # everything
feels logs --oldest # oldest first
feels logs --from DD-MM-YYYY # from a date
feels logs --to DD-MM-YYYY # up to a date
feels logs --project <name> # filter by project
Visualizing
feels graph # monthly bar chart
feels graph --from MM # specific month this year
feels graph --from MM-YYYY # specific month and year
feels calendar # monthly calendar view
feels calendar --from MM-YYYY # navigate to any month
Editing
feels edit <id> # edit an entry
feels delete <id> # delete one or more entries
Projects
feels project add <name> # add a project
feels project list # list all projects
feels project delete <name> # remove a project
Data
feels stats # view statistics
feels export --format json # export as JSON
feels export --format csv # export as CSV
feels reset # delete all data
Reminder
feels reminder # show reminder status
feels reminder set HH:MM # set a daily reminder
feels reminder unset # remove the reminder
The reminder opens your terminal running feels at the set time. Detects Ghostty, iTerm2, and Terminal.app automatically.
Other
feels config # update settings
feels help # all commands
feels # home screen
Configuration
On first run you choose your setup. Defaults are mood + asciimoji + note. You can optionally enable:
- Focus score — 0–5, how locked in you were
- Stress score — 0–5, lower is better
- Projects — separate logs by what you're working on
Run feels config anytime to change these.
Data
Everything lives at ~/.feels/:
config.json— your settingsdata.db— your entries (SQLite)
No internet required. Nothing leaves your machine.
Project structure
src/feels/
├── cli.py # routing
├── config.py # config management
├── database.py # SQLite operations
├── utils.py # colors, formatting, prompts
├── home.py # home screen
├── add.py # feels log
├── logs.py # feels logs
├── edit.py # feels edit
├── delete.py # feels delete
├── graph_cmd.py # feels graph
├── calendar_cmd.py # feels calendar
├── stats_cmd.py # feels stats
├── export_cmd.py # feels export
├── reminder_cmd.py # feels reminder
├── project_cmd.py # feels project
├── config_cmd.py # feels config
├── onboarding.py # first-run setup
└── help_cmd.py # feels help
Development
pip install -e ".[dev]"
pytest
The demo GIF is recorded with VHS: vhs trailer.tape.
License
MIT
Metadata
Release files for feels 1.2.4
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| feels-1.2.4.tar.gz | 394.9 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| feels-1.2.4-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 789.8 kB
Release files / feels-1.2.4.tar.gz
| Download URL | feels-1.2.4.tar.gz |
|---|---|
| Size | 394.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
faecabc266a9f8b1f86a9d8defa9aeea37d4c0167c7b918686c1a59de820d181
|
|
BLAKE2b-256 checksum How to use checksums |
9a721acf09d0fcc36afaa6bf03149f65d0d7db37650b86b62a151e8f7f16c44d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Release files / feels-1.2.4-py3-none-any.whl
| Download URL | feels-1.2.4-py3-none-any.whl |
|---|---|
| Size | 394.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
428a117369835d727f20728072f3b95192f83bc228a64c0569e800f78f62fbb4
|
|
BLAKE2b-256 checksum How to use checksums |
b6512e538edc6d918d38b3fecddf9804bceb55d845a4f77afdb5734af8040e26
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Security for feels 1.2.4
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.