Skip to main content

feels

PyPI Python License: MIT

A mood tracker for developers. Runs entirely in your terminal.

All data stays on your machine. No cloud. No accounts. No tracking.

feels demo: logging an entry, the home screen, logs, graph and calendar

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 settings
  • data.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)

Source distribution for feels 1.2.4
File Size Uploaded Provenance
feels-1.2.4.tar.gz 394.9 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for feels 1.2.4
File Interpreter ABI Platform
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.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page