Tag your time, get the insight - an open source time tracker with a focus on a simple and interactive user experience.
- Website: https://timetagger.app
- Docs: https://timetagger.readthedocs.io
- CLI tool: https://github.com/almarklein/timetagger_cli
TimeTagger is a web-based time-tracking solution that can be run locally or on a server. In the latter case, you'll want to add authentication, and also be aware of the license restrictions.
The server runs on async Python using uvicorn and asgineer - which is fun and bloody fast. It uses SQLite via itemdb to store the data, making it easy to deploy.
The client is a mix of HTML, CSS, Markdown, and ... Python! PScript is used to compile the Python to JavaScript. This may be a bit idiosyncratic, but it's fun! Maybe I'll someday implement it in something that compiles down to Wasm :)
This repo is organized as a library, making it quite flexible to apply tweaks.
See run.py
for an example of how to run it as a web app.
See the docs for more info.
You can also see it in action at https://timetagger.app - you can purchase an account for €3 per month so you don't have to worry about maintaining a server, backups, and all that. Plus you'd sponsor this project and open source in general.
TimeTagger is a Python library and requires Python 3.6 or higher. The dependencies are listed in requirements.txt
- these are installed automatically when you install TimeTagger with Pip.
# Latest release
pip install -U timetagger
# Latest from Github
pip install -U https://github.com/almarklein/timetagger/archive/main.zip
# Uninstall
pip uninstall timetagger
After installation, copy and execute python run.py
to get started.
This code is subject to the GPL-3.0 License. Contributors must agree to the Contributor License Agreement to grant the right to use contributions at e.g. the TimeTagger.app service.
Additional developer dependencies:
pip install invoke black flake8 pytest requests
invoke -l
to see available invoke tasksinvoke clean
to remove temporary filesinvoke format
to autoformat the code (using black)invoke lint
to detect linting errors (using flake8)invoke tests
to run tests (using pytest)