TimeTagger is a web-based time-tracking solution that can be run locally or on a server

Overview

CI

TimeTagger

Tag your time, get the insight - an open source time tracker with a focus on a simple and interactive user experience.

Introduction

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 :)

Usage example

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.

You can also see it in action at https://timetagger.app - you can also purchase an account for $2 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.

Installation

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.

License

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.

Developers

Additional developer dependencies:

pip install invoke black flake8 pytest requests
  • invoke -l to see available invoke tasks
  • invoke clean to remove temporary files
  • invoke format to autoformat the code (using black)
  • invoke lint to detect linting errors (using flake8)
  • invoke tests to run tests (using pytest)

API

TODO

Comments
  • [Feature Request] Bulk of features.

    [Feature Request] Bulk of features.

    Hi, almarklein and team. I like your idea on making an open source version of time tracker and how you executed it: website with neat-font and european-japanese cute minimalist style, CLI tool, etc...
    I have a bunch of ideas in this field and the essential one is to add a new timeline of "plan" so we can know how much we are in control of ourselves. And with this new timeline we can merge much more functionalities than merely time tracking, like plan next week with todo; add tasks from todo list, classify todo list, form a new habit by tracking it, etc.
    Can I work with you guys? or it is against your original idea hence I need to fork this.

    question 
    opened by PabloLION 14
  • 💡 exclude individual tags from the report

    💡 exclude individual tags from the report

    The situation for which I am looking for a solution is the following:

    In addition to the job/client, I also tag the activities by their "type". Was it a focused work, did I only do routine work or did I participate in a meeting etc.

    For the " invoicing" of the hours I do not need these times. That means it would be useful if I could define a list of tags that are NOT included in the report. This could be done directly at the tag where you can also set a time target and the color → set a mark "don't include this tag in the report".

    Do others have a similar situation? Is there a better solution than my suggestion?

    My suggestion would bring me a significant relief day by day, but also raises a new question: How can I then evaluate how much time I spent focused, in meetings, etc.?

    Thanks Chris

    2022_0126_1758_01 Idea 
    opened by GitHofi 12
  • Check mark or 'x' with a spiral moving around it - what is it?

    Check mark or 'x' with a spiral moving around it - what is it?

    What is the check mark or x in the upper left corner beside the menu with a spiral going around it? It's not mentioned in the docs anywhere from what I can tell, and there is no tooltip when hovering over it.

    What does it mean when it's an 'x' and what does it mean when it's a check mark?

    documentation 
    opened by lgaudreau 10
  • Recording doesn't always stop

    Recording doesn't always stop

    Lately I've been having this issue where I click "stop" and the recording does seem to stop, but when I come back to work I find the recording had actually not stopped and is still counting.

    I don't know exactly how to reproduce it, but it happens quite frequently. I'm using TimeTagger on mobile as a pinned Firefox web app, and on my PC as a GNOME Web (Epiphany) web app, but the error doens't seem to depend on having both open at the same time.

    Is this happening to anyone else?

    enhancement 
    opened by eldelacajita 8
  • Full width layout

    Full width layout

    Currently max width of canvas is 1024px, would be nice if I could opt to have it be the full screen width. I tried to figure this out in code but no luck :(

    Idea 
    opened by boehs 8
  • Make it more obvious when a record is running

    Make it more obvious when a record is running

    This is just an idea for a very small but helpful enhancement: just make it more visible when a record is running.

    A simple way of doing this: Changing the colors of the single "Record" button to white on green, and the "Stop" button to white on red. The "secondary" record button (the one that appears beside the stop button) could be kept as is.

    A complementary change could be to also change the background color of the active/running record on the timeline.

    enhancement 
    opened by eldelacajita 8
  • Start a day not at 00:00

    Start a day not at 00:00

    I often go to sleep after 00:00, so it would be nice to be able to configure the start of a day. I mainly want it when focusing "today" ("snap to now"). It could also be used in reports grouped by date.

    Idea 
    opened by ouuan 8
  • Introduce a zoom level to view multiple whole weeks

    Introduce a zoom level to view multiple whole weeks

    When I zoom out to the point where I can view each week's hours as a single block (this is the month view), the user interface attempts to automatically scroll to snap things into view, but I've never found this to be consistent.

    As it stands, it seems to be snapping to something other than week boundaries (perhaps months?). When I'm dragging this view back in time, it will sometimes move several weeks ahead or back in time to do this, making me lose sight of the week I want to be looking at. As far as I can tell, there's no other way to view things week-by-week except by selecting dates manually.

    enhancement 
    opened by HexaCubist 8
  • Add search to main UI and/or to record dialog

    Add search to main UI and/or to record dialog

    Summary

    This is a feature request to make search more accessible and practical when creating new records, helping us to:

    • Avoid having to manually enter a description for recurrent or frequent tasks..
    • Avoid creating multiple entries with different descriptions for the very same task.
    • Avoid creating multiple entries with different tags for the very same task.

    Current situation and use case

    • When creating a new record, very frequently I want to reuse an existing description, or take it as a basis and edit it slightly.
    • Presets do help, but only for tags, not for the actual description. And I wouldn't want to have hundreds of presets.
    • So search is the best option: you search for a term, click on the entry that is most similar to what you want so you can edit it, and then create a new record based on that one by hitting "Resume" and then editing the description if needed.
    • BUT search is hidden away inside the hamburguer menu, and using it for this purpose is not very practical.

    Possible improvements

    1. Make the search button permanently visible in the UI.

    or

    1. Add search to the record creation/edition dialog itself: 2.a. Add a search button near the presets button. It would pop up the existing search window, and once you pick an entry in the search results, go back to the record creation/edition window with the selected description filled in. 2.b. Just start typing in the description field and see a drop-down list similar to the one in the search dialog, showing related options in real time. Clicking on one of the results would put it into the description field to be further edited if needed.

    or

    Any other ideas?

    Idea 
    opened by eldelacajita 7
  • Access presets and recents via the keyboard, take 2

    Access presets and recents via the keyboard, take 2

    Good point made here: https://github.com/almarklein/timetagger/pull/169#issuecomment-1044060355

    I think we can distinguish (at least) 3 use-cases:

    1. The user is looking for a preset. Worked good previously, and still does.
    2. The user is looking for a recent tag only. Did not work so well, this PR fixed that.
    3. The user is not sure what to look for. I had not thought of this and broke this use-case :)

    Some ideas that come to mind:

    • When typing "#", show presets first, then recents. When you start typing, the matches show recents first and then presets. No more "##".
    • Keep distinction between "#" and "##", but it only determines the order: With "#" show recents and then presets. With "##" show presets and then recents.
    enhancement 
    opened by almarklein 7
  • setup expected work time per week and get status

    setup expected work time per week and get status

    Hi,

    It would be great if one could setup your personal expected work time per week (like 40 hours). and get an overview how much of this time has already passed in the running week, respectively how much will be left to work.

    All the best, Florian

    enhancement Idea 
    opened by Floehe 7
  • Fix bash credential example

    Fix bash credential example

    This sample from the README is misleading:

    # Using environment variables
    export TIMETAGGER_CREDENTIALS=test:$2a$08$0CD1NFiIbancwWsu3se1v.RNR/b7YeZd71yg3cZ/3whGlyU6Iny5i
    python -m timetagger
    

    It will expand $2 and $0 and caught me off-guard when building a launcher script. Value has to be wrapped in '.

    Please update your README.

    documentation 
    opened by martin-braun 0
  • Add a setting for

    Add a setting for "default" tag priority

    Currently, whenever I add a new tag, it'll automatically get the "primary" priority. I'd like to have tag "levels" for customers, projects (some projects can be used with more than one customer, which kinda rules out using / for hierarchy), and add the ticket number our ticket system generates, which looks like a tag (always a numeric one, though).

    I could enter the ticket numbers without the #, but I actually kinda like being able to select time items by them, I just want to let them be "secondary" tags by default.

    Would that be possible? Feasible? From what I can tell, the entire description, tags and all, is just sent to the database in one go, specific tags settings are only created if I manually edit a tag.

    Of course, if need be, I could always run a recurring job that talks to the API and adds settings for ticket-formatted tags, if that's easier.

    enhancement 
    opened by doenietzomoeilijk 1
  • Report grouping by week and month

    Report grouping by week and month

    Hey!

    I could not find an issue on this. There is a grouping by date (and date / tags) already. And I think, similarly, it would be nice to be able to group by week and month (and week | month / tags).

    It would be useful to track time spent working per week for example.

    Thanks!

    enhancement 
    opened by natpuch 2
  • description entry with tag presets deletes already entered text

    description entry with tag presets deletes already entered text

    Hi, currently in version 22.11.2 (this is where it started), and also in 22.11.3, when starting a new task, and entering some text in the description field: when I type "##" to search for saved task presets and choose an entry from the dropdown, the previously entered text in the description field is deleted and replaced by the tag from the list. ;)

    In earlier versions, the tag was added to the description text.

    Could you please have a look at this?

    Thx, Florian

    enhancement 
    opened by Floehe 4
  • Feature request: Include planning capacities and evaluation

    Feature request: Include planning capacities and evaluation

    In my opinion it would be a good improvement to be able to plan a day ahead and maybe even evaluate if the planned schedule is being met in the report (but that feature would not be that important I guess).

    Example: The evening before someone plans to do task x from 8:00 am to 10:00 am, then task y from 11:30 am to 01:00 pm and so on. For people doing pomodoros it could be good to be able to plan x amount of pomodoros à 25 Minutes from 8:00 am to 10:00 am doing taks y. The day the tasks are due the person inputs its working times as normal and can compare the planned and actual working time. As for the graphical integration it could look like a second layer behind the actual tracked time but in a lighter colour or kind of translucent.

    Thanks for your work and a really nice piece of software!

    Idea 
    opened by flhape 1
Releases(v22.12.1)
  • v22.12.1(Dec 20, 2022)

    • CSV report adheres better to SCV spec - https://github.com/almarklein/timetagger/pull/309
    • Wrap long descriptions in PDF report - https://github.com/almarklein/timetagger/pull/310
    Source code(tar.gz)
    Source code(zip)
  • v22.11.3(Nov 26, 2022)

  • v22.11.2(Nov 23, 2022)

  • v22.11.1(Nov 21, 2022)

    This release focuses on configurable time representations, which can be set in an improved settings dialog.

    • Support for setting the first day of the week - https://github.com/almarklein/timetagger/pull/288
    • Support for displaying durations as 2h30m (new default) - https://github.com/almarklein/timetagger/pull/290
    • Support for am/pm time notation (auto-detects based on locale) - https://github.com/almarklein/timetagger/pull/292
    • Support for a "day snap offset" - https://github.com/almarklein/timetagger/pull/291
    • More powerful search - https://github.com/almarklein/timetagger/pull/293
    • Fix that bottom of buttons were not clickable - https://github.com/almarklein/timetagger/pull/287
    Source code(tar.gz)
    Source code(zip)
  • v22.10.1(Oct 25, 2022)

    • Implement reverse proxy authentication - by @mtn-mathi - https://github.com/almarklein/timetagger/pull/270
    • Improvements to import logic - https://github.com/almarklein/timetagger/pull/277
    • Show recent descriptions in record dialog - https://github.com/almarklein/timetagger/pull/278
    • Use red color when sync is in error - https://github.com/almarklein/timetagger/pull/279
    • Search no longer shows hidden records - https://github.com/almarklein/timetagger/pull/281
    • Show clickable links in description - https://github.com/almarklein/timetagger/pull/283
    Source code(tar.gz)
    Source code(zip)
  • v22.9.3(Sep 30, 2022)

    • More descriptive save button text in https://github.com/almarklein/timetagger/pull/268
    • Update icon when recording in https://github.com/almarklein/timetagger/pull/269
    Source code(tar.gz)
    Source code(zip)
  • v22.9.2(Sep 19, 2022)

    • Prevent closing the tab when there are unsaved changes in https://github.com/almarklein/timetagger/pull/253
    • Improve sync indicator icons a bit in https://github.com/almarklein/timetagger/pull/264
    • Fix timezone indicator in settings in https://github.com/almarklein/timetagger/pull/255
    • Clarify autocomp toggle in https://github.com/almarklein/timetagger/pull/261
    • Click ux in overview by in https://github.com/almarklein/timetagger/pull/262
    • Tiny tweaks for small screens in https://github.com/almarklein/timetagger/pull/263
    • Ditch the paper bg in https://github.com/almarklein/timetagger/pull/265
    Source code(tar.gz)
    Source code(zip)
  • v22.9.1(Sep 12, 2022)

    A variety of bug fixes and UX gotcha's:

    • Fix that buttons appeared larger than they are in #245
    • Return focus to canvas when a dialog is closed in #246
    • Fix bug in search dialog in #247
    • Dont assume integer timezone offset in #248
    • Dont reset start time in record dialog on each mode change in #251

    For the self-hosters:

    • Mention .env file quotes in #249
    • Add health endpoint in #250
    Source code(tar.gz)
    Source code(zip)
  • v22.6.6(Jun 23, 2022)

    • Fix that autocomp could not be closed when invoked using the button. #227
    • Added comments that extra dollar signs are needed for the hash in docker-compose. #227
    Source code(tar.gz)
    Source code(zip)
  • v22.6.4(Jun 21, 2022)

  • v22.6.3(Jun 21, 2022)

    This release focuses on the self-hosters.

    • The run.py is gone; you can now use python timetagger to run the server. (though you can still use your own version of the startup script).
    • The builtin startup script includes support for authentication with username and password. This makes it much more viable to host TimeTagger on your own server!
    • There is now a published Docker image, and an example docker-compose file to demonstrate how it can be used.
    • Also see https://timtagger.app/articles/selfhost2/
    Source code(tar.gz)
    Source code(zip)
  • v22.6.2(Jun 10, 2022)

    • Fixed content on landing page from being hidden. #214
    • Fixed that clicking an tag in the autocompletion list did not add it to the text input. #215
    Source code(tar.gz)
    Source code(zip)
  • v22.6.1(Jun 9, 2022)

    • New setting: configure the app width. #209
    • Update the search dialog to work better with the recently introduced tag dialogs. #210
    • Hide overflow to prevent flicker due to tooltip. #208
    Source code(tar.gz)
    Source code(zip)
  • v22.4.2(Apr 27, 2022)

  • v22.4.1(Apr 27, 2022)

    • Introducing a new dialog to manage a tag (or tag combi). You can set color, target, priority, and rename the tag from it. #187 #188 #196
    • Setting tags priority helps improve tag ordering in the overview. Secondary tags can be hidden in the report. #188
    • Refactoring plus a fix to the overview panel. #195
    • Fix that on some platforms installed apps had an empty bar at the bottom. #198
    • Fix that the text input would not get focus when using a narrow window. #197
    Source code(tar.gz)
    Source code(zip)
  • v22.3.1(Mar 17, 2022)

    • Toggle between presets and recent tags by typing '#'. #183
    • Fix: enable edit button after selecting preset or recent tag. #182
    • Various design tweaks. #177, #178, #180 (thanks to @robin-moser)
    • The app is wider and uses larger margins on wide screens. #171
    • Disable tooltips for touch events. #181
    • Spelling checking is now enabled in the description. #179
    Source code(tar.gz)
    Source code(zip)
  • v22.2.3(Feb 17, 2022)

    • Give some more hints on when a record is running (and which one). #159
    • Can now select presets with the mouse again, as well as recent tags. #161
    • Selecting presets via autocompletion now requires typing ##. A hint is provided. #169
    • Small tweak to make date input fit in the Brave browser. #170
    • Fixed a typo. #168
    Source code(tar.gz)
    Source code(zip)
  • v22.2.2(Feb 8, 2022)

    • Tag presets are now shown in the autocompletion list. This feels more coherent and is more "keyboard-friendly". #144
    • The preset dialog preserves the order of tags, and allows empty lines. #154
    • Fix that using no grouping in the report dialog broke the tag-filtering. #156
    • You can now create a new tag by dragging in the timeline. #158
    • Tweaks for small screens; make better use of available space. #160
    Source code(tar.gz)
    Source code(zip)
  • v22.2.1(Feb 1, 2022)

    • When starting a new record while another is still running, that record is stopped. The stop-time is now set to the start-time of the new record (instead of to the current time). #143
    • A new shortcut (Shift+S) to resume the current/last record (i.e. start a new record with the same description. #140
    Source code(tar.gz)
    Source code(zip)
  • v22.1.4(Jan 27, 2022)

    • The max number of chars is honored in the record description input and in the preset dialog. A warning is shown when going over the limit. #131
    • The size-limit for settings values has been increased (32x) to allow more presets. #131
    • In the record dialog, the time and duration fields allow writing times like e.g. "0:61:00" resulting in "1:01:00". #132
    • Support more methods for grouping in the report dialog. #133
    Source code(tar.gz)
    Source code(zip)
  • v22.1.3(Jan 24, 2022)

  • v22.1.2(Jan 14, 2022)

  • v22.1.1(Jan 11, 2022)

    New features:

    • You can now also perform a plain-text search (and replace) in the "Search & manage tags" dialog (#114).
    • Official support for Python 3.10.

    Functional improvements:

    • Fix that the duration did not update when inputting start/stop times.
    • Improve support for writing startstop time as e.g. "1259", and add support for am/pm format.
    • When renaming a single tag, the color is now also updated.
    • When selecting "started earlier', it snaps to the previous record if its no longer than 8 hours ago (was 5 hours).

    Visual / UX improvements:

    • Tweak navigaton by including zoom buttons.
    • The today button actually moves to today, as opposed to "now" at the current scale.
    • Improve dialog frame appearance.
    • Improve the hint on selecting tags in the report dialog.
    Source code(tar.gz)
    Source code(zip)
  • v21.11.2(Nov 22, 2021)

  • v21.9.3(Sep 24, 2021)

    • Fixes to the hover-shadow of the records (clickable appearance).
    • Tweak zoom levels: replace 7-week level with a 3-week level.
    • Fixed that clicking a certain area of the zoom-out button would ... zoom in.
    Source code(tar.gz)
    Source code(zip)
  • v21.9.2(Sep 14, 2021)

  • v21.9.1(Sep 9, 2021)

  • v21.7.2(Jul 12, 2021)

  • v21.7.1(Jul 8, 2021)

    • The record dialog now comes with a dropdown for tag suggestions.
    • Recent tags are now suggested after typing the first #.
    • When typing characters after the #, matching tags are suggested.
    • You can now define and use tag presets.
    Source code(tar.gz)
    Source code(zip)
  • v21.6.1(Jun 15, 2021)

Owner
Almar Klein
Author of @pyzo and @imageio. Open source fanatic and wasm enthousiast.
Almar Klein
⌚️Internet Time reference and (eventually) converter site, for planning things with your internet friends who aren't (yet) obsessed with Internet Time 😉

Internet-Ti.me Internet Time reference and (eventually) converter site, for planning things with your internet friends who aren't (yet) obsessed with

Jessica Stokes 17 Nov 2, 2022
Delorean: Time Travel Made Easy

Delorean: Time Travel Made Easy Delorean is a library for clearing up the inconvenient truths that arise dealing with datetimes in Python. Understandi

Mahdi Yusuf 1.8k Dec 20, 2022
PyTime is an easy-use Python module which aims to operate date/time/datetime by string.

PyTime PyTime is an easy-use Python module which aims to operate date/time/datetime by string. PyTime allows you using nonregular datetime string to g

Sinux 148 Dec 9, 2022
Parse human-readable date/time strings

parsedatetime Parse human-readable date/time strings. Python 2.6 or greater is required for parsedatetime version 1.0 or greater. While we still test

Mike Taylor 651 Dec 23, 2022
ISO 8601 date/time parser

ISO 8601 date/time parser This module implements ISO 8601 date, time and duration parsing. The implementation follows ISO8601:2004 standard, and imple

null 118 Dec 20, 2022
darts is a Python library for easy manipulation and forecasting of time series.

A python library for easy manipulation and forecasting of time series.

Unit8 5.2k Jan 1, 2023
Cross Platform Application for Calculating Render Time

mdsanima-rt-go Cross Platform Application for Calculating Render Time. Testing This is a base application build on Windows Android and Linux. All buil

MDSANIMA DEV 2 Mar 29, 2022
FPS, fast pluggable server, is a framework designed to compose and run a web-server based on plugins.

FPS, fast pluggable server, is a framework designed to compose and run a web-server based on plugins. It is based on top of fastAPI, uvicorn, typer, and pluggy.

Adrien Delsalle 1 Nov 16, 2021
Mockoon is the easiest and quickest way to run mock APIs locally. No remote deployment, no account required, open source.

Mockoon Mockoon is the easiest and quickest way to run mock APIs locally. No remote deployment, no account required, open source. It has been built wi

mockoon 4.4k Dec 30, 2022
A simple image/video to Desmos graph converter run locally

Desmos Bezier Renderer A simple image/video to Desmos graph converter run locally Sample Result Setup Install dependencies apt update apt install git

Kevin JY Cui 339 Dec 23, 2022
Automatically pulls specified repository whenever a specified file is pushed. Great for working collaboratively when you need to run something locally.

autopull Simple python tool that allows you to automatically pull from a github repository whenever a file with a specified name is uploaded installat

carreb 0 Sep 27, 2022
Run your jupyter notebooks as a REST API endpoint. This isn't a jupyter server but rather just a way to run your notebooks as a REST API Endpoint.

Jupter Notebook REST API Run your jupyter notebooks as a REST API endpoint. This isn't a jupyter server but rather just a way to run your notebooks as

Invictify 54 Nov 4, 2022
UpChecker is a simple opensource project to host it fast on your server and check is server up, view statistic, get messages if it is down. UpChecker - just run file and use project easy

UpChecker UpChecker is a simple opensource project to host it fast on your server and check is server up, view statistic, get messages if it is down.

Yan 4 Apr 7, 2022
It can be used both locally and remotely (indicating IP and port)

It can be used both locally and remotely (indicating IP and port). It automatically finds the offset to the Instruction Pointer stored in the stack.

DiegoAltF4 13 Dec 29, 2022
Ballcone is a fast and lightweight server-side Web analytics solution.

Ballcone Ballcone is a fast and lightweight server-side Web analytics solution. It requires no JavaScript on your website. Screenshots Design Goals Si

Dmitry Ustalov 49 Dec 11, 2022
Async Python 3.6+ web server/framework | Build fast. Run fast.

Sanic | Build fast. Run fast. Build Docs Package Support Stats Sanic is a Python 3.6+ web server and web framework that's written to go fast. It allow

Sanic Community Organization 16.7k Jan 8, 2023
Async Python 3.6+ web server/framework | Build fast. Run fast.

Sanic | Build fast. Run fast. Build Docs Package Support Stats Sanic is a Python 3.6+ web server and web framework that's written to go fast. It allow

Sanic Community Organization 16.7k Dec 28, 2022
Async Python 3.6+ web server/framework | Build fast. Run fast.

Sanic | Build fast. Run fast. Build Docs Package Support Stats Sanic is a Python 3.6+ web server and web framework that's written to go fast. It allow

Sanic Community Organization 16.7k Dec 28, 2022