├── timetagger ├── app │ ├── __init__.py │ ├── sandbox.md │ ├── timetagger_manifest.json │ ├── _template.html │ ├── demo.md │ ├── index.md │ ├── sw.js │ ├── tools.py │ └── app.scss ├── pages │ ├── __init__.py │ ├── logout.md │ ├── index.md │ ├── login.md │ └── account.md ├── common │ ├── __init__.py │ ├── Ubuntu-C.ttf │ ├── Ubuntu-R.ttf │ ├── clearly-602.ogg │ ├── wind-up-1-534.ogg │ ├── Ubuntu_latin.woff2 │ ├── eventually-590.ogg │ ├── fa-solid-900.woff2 │ ├── UbuntuCondensed_latin.woff2 │ ├── SpaceMono-Regular-webfont.woff │ ├── sha1.html │ ├── _template.html │ ├── cred.html │ └── _style_embed.scss ├── images │ ├── __init__.py │ ├── paper0.jpg │ ├── paper1.jpg │ ├── paper2.jpg │ ├── paper3.jpg │ ├── favicon.ico │ ├── timetagger_sf.ico │ ├── timetagger128_sf.png │ ├── timetagger16_sf.png │ ├── timetagger192_bd.png │ ├── timetagger192_sd.png │ ├── timetagger192_sf.png │ ├── timetagger192_sl.png │ ├── timetagger192_sm.png │ ├── timetagger192_tg.png │ ├── timetagger256_sf.png │ ├── timetagger32_sf.png │ ├── timetagger48_sf.png │ ├── timetagger512_bd.png │ ├── timetagger512_sf.png │ ├── timetagger512_sm.png │ ├── timetagger64_sf.png │ ├── timetagger192_sf_dot.png │ ├── _names.txt │ ├── timetagger_sd.svg │ ├── timetagger_sl.svg │ ├── _update_icons.py │ ├── _update_paper.py │ ├── timetagger_wd.svg │ └── timetagger_wl.svg ├── server │ ├── __init__.py │ ├── _utils.py │ └── _assets.py ├── __init__.py ├── _config.py └── __main__.py ├── .github ├── pull_request_template.md ├── FUNDING.yml └── workflows │ ├── ci.yml │ └── dockerimage.yml ├── docs ├── docs_requirements.txt ├── mkdocs.yml └── docs │ ├── libapi.md │ ├── index.md │ └── webapi.md ├── MANIFEST.in ├── tests ├── import_samples │ ├── timechimp_sample.txt │ └── yast_sample.csv ├── _common.py ├── test_client_stores.py ├── test_both.py ├── test_server_utils.py ├── test_config.py ├── test_server_assetserver.py ├── test_client_dt.py ├── test_server_mainhandler.py ├── test_client_utils.py └── test_client_recordstore.py ├── requirements.txt ├── .readthedocs.yaml ├── deploy ├── image.Dockerfile ├── repo.Dockerfile ├── docker-compose.yml ├── docker-compose.nonroot.yml ├── repo.rpi.Dockerfile ├── repo.nonroot.Dockerfile └── pip.Dockerfile ├── setup.py ├── .gitignore ├── CLA.md ├── tasks.py └── README.md /timetagger/app/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /timetagger/pages/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.github/pull_request_template.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /timetagger/common/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /timetagger/images/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /docs/docs_requirements.txt: -------------------------------------------------------------------------------- 1 | mkdocs 2 | mkautodoc 3 | -------------------------------------------------------------------------------- /MANIFEST.in: -------------------------------------------------------------------------------- 1 | include LICENSE README.md requirements.txt 2 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | custom: ["https://timetagger.app", "https://almarklein.org/donate.html"] 2 | -------------------------------------------------------------------------------- /timetagger/images/paper0.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/almarklein/timetagger/HEAD/timetagger/images/paper0.jpg -------------------------------------------------------------------------------- /timetagger/images/paper1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/almarklein/timetagger/HEAD/timetagger/images/paper1.jpg -------------------------------------------------------------------------------- /timetagger/images/paper2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/almarklein/timetagger/HEAD/timetagger/images/paper2.jpg -------------------------------------------------------------------------------- /timetagger/images/paper3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/almarklein/timetagger/HEAD/timetagger/images/paper3.jpg -------------------------------------------------------------------------------- /timetagger/common/Ubuntu-C.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/almarklein/timetagger/HEAD/timetagger/common/Ubuntu-C.ttf -------------------------------------------------------------------------------- /timetagger/common/Ubuntu-R.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/almarklein/timetagger/HEAD/timetagger/common/Ubuntu-R.ttf -------------------------------------------------------------------------------- /timetagger/images/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/almarklein/timetagger/HEAD/timetagger/images/favicon.ico -------------------------------------------------------------------------------- /timetagger/common/clearly-602.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/almarklein/timetagger/HEAD/timetagger/common/clearly-602.ogg -------------------------------------------------------------------------------- /timetagger/common/wind-up-1-534.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/almarklein/timetagger/HEAD/timetagger/common/wind-up-1-534.ogg -------------------------------------------------------------------------------- /timetagger/images/timetagger_sf.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/almarklein/timetagger/HEAD/timetagger/images/timetagger_sf.ico -------------------------------------------------------------------------------- /timetagger/common/Ubuntu_latin.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/almarklein/timetagger/HEAD/timetagger/common/Ubuntu_latin.woff2 -------------------------------------------------------------------------------- /timetagger/common/eventually-590.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/almarklein/timetagger/HEAD/timetagger/common/eventually-590.ogg -------------------------------------------------------------------------------- /timetagger/common/fa-solid-900.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/almarklein/timetagger/HEAD/timetagger/common/fa-solid-900.woff2 -------------------------------------------------------------------------------- /timetagger/images/timetagger128_sf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/almarklein/timetagger/HEAD/timetagger/images/timetagger128_sf.png -------------------------------------------------------------------------------- /timetagger/images/timetagger16_sf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/almarklein/timetagger/HEAD/timetagger/images/timetagger16_sf.png -------------------------------------------------------------------------------- /timetagger/images/timetagger192_bd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/almarklein/timetagger/HEAD/timetagger/images/timetagger192_bd.png -------------------------------------------------------------------------------- /timetagger/images/timetagger192_sd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/almarklein/timetagger/HEAD/timetagger/images/timetagger192_sd.png -------------------------------------------------------------------------------- /timetagger/images/timetagger192_sf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/almarklein/timetagger/HEAD/timetagger/images/timetagger192_sf.png -------------------------------------------------------------------------------- /timetagger/images/timetagger192_sl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/almarklein/timetagger/HEAD/timetagger/images/timetagger192_sl.png -------------------------------------------------------------------------------- /timetagger/images/timetagger192_sm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/almarklein/timetagger/HEAD/timetagger/images/timetagger192_sm.png -------------------------------------------------------------------------------- /timetagger/images/timetagger192_tg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/almarklein/timetagger/HEAD/timetagger/images/timetagger192_tg.png -------------------------------------------------------------------------------- /timetagger/images/timetagger256_sf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/almarklein/timetagger/HEAD/timetagger/images/timetagger256_sf.png -------------------------------------------------------------------------------- /timetagger/images/timetagger32_sf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/almarklein/timetagger/HEAD/timetagger/images/timetagger32_sf.png -------------------------------------------------------------------------------- /timetagger/images/timetagger48_sf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/almarklein/timetagger/HEAD/timetagger/images/timetagger48_sf.png -------------------------------------------------------------------------------- /timetagger/images/timetagger512_bd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/almarklein/timetagger/HEAD/timetagger/images/timetagger512_bd.png -------------------------------------------------------------------------------- /timetagger/images/timetagger512_sf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/almarklein/timetagger/HEAD/timetagger/images/timetagger512_sf.png -------------------------------------------------------------------------------- /timetagger/images/timetagger512_sm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/almarklein/timetagger/HEAD/timetagger/images/timetagger512_sm.png -------------------------------------------------------------------------------- /timetagger/images/timetagger64_sf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/almarklein/timetagger/HEAD/timetagger/images/timetagger64_sf.png -------------------------------------------------------------------------------- /tests/import_samples/timechimp_sample.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/almarklein/timetagger/HEAD/tests/import_samples/timechimp_sample.txt -------------------------------------------------------------------------------- /timetagger/images/timetagger192_sf_dot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/almarklein/timetagger/HEAD/timetagger/images/timetagger192_sf_dot.png -------------------------------------------------------------------------------- /timetagger/common/UbuntuCondensed_latin.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/almarklein/timetagger/HEAD/timetagger/common/UbuntuCondensed_latin.woff2 -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | uvicorn 2 | asgineer>=0.8.0 3 | itemdb>=1.1.1 4 | pscript>=0.7.6 5 | pyjwt 6 | jinja2 7 | markdown 8 | bcrypt 9 | iptools 10 | -------------------------------------------------------------------------------- /timetagger/common/SpaceMono-Regular-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/almarklein/timetagger/HEAD/timetagger/common/SpaceMono-Regular-webfont.woff -------------------------------------------------------------------------------- /timetagger/common/sha1.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /tests/_common.py: -------------------------------------------------------------------------------- 1 | def run_tests(scope): 2 | """Run all test functions in the given scope.""" 3 | for func in list(scope.values()): 4 | if callable(func) and func.__name__.startswith("test_"): 5 | print(f"Running {func.__name__} ...") 6 | func() 7 | print("Done") 8 | -------------------------------------------------------------------------------- /.readthedocs.yaml: -------------------------------------------------------------------------------- 1 | version: 2 2 | 3 | formats: all 4 | 5 | build: 6 | os: ubuntu-22.04 7 | tools: 8 | python: "3.11" 9 | 10 | mkdocs: 11 | configuration: docs/mkdocs.yml 12 | 13 | python: 14 | install: 15 | - requirements: requirements.txt 16 | - requirements: docs/docs_requirements.txt 17 | -------------------------------------------------------------------------------- /timetagger/pages/logout.md: -------------------------------------------------------------------------------- 1 | # Logout 2 | 3 | 4 | 5 | 16 | 17 | Logging out ... 18 | -------------------------------------------------------------------------------- /timetagger/server/__init__.py: -------------------------------------------------------------------------------- 1 | # flake8: noqa 2 | 3 | from ._utils import user2filename, filename2user 4 | from ._apiserver import ( 5 | authenticate, 6 | AuthException, 7 | api_handler_triage, 8 | get_webtoken_unsafe, 9 | ) 10 | from ._assets import ( 11 | md2html, 12 | create_assets_from_dir, 13 | enable_service_worker, 14 | IMAGE_EXTS, 15 | FONT_EXTS, 16 | ) 17 | -------------------------------------------------------------------------------- /deploy/image.Dockerfile: -------------------------------------------------------------------------------- 1 | # Dockerfile that is simply based on the published Docker image. 2 | # 3 | # Some MyPaas args (ignore if you don't use MyPaas): 4 | # 5 | # mypaas.service = timetagger.test1 6 | # mypaas.url = https://test1.timetagger.app 7 | # mypaas.volume = /root/_timetagger:/root/_timetagger 8 | # mypaas.maxmem = 256m 9 | # mypaas.env = TIMETAGGER_CREDENTIALS 10 | 11 | FROM ghcr.io/almarklein/timetagger 12 | -------------------------------------------------------------------------------- /docs/mkdocs.yml: -------------------------------------------------------------------------------- 1 | site_name: TimeTagger 2 | site_description: Tag your time, get the insight. 3 | theme: readthedocs 4 | 5 | repo_name: almarklein/timetagger 6 | repo_url: https://github.com/almarklein/timetagger 7 | edit_uri: "" 8 | 9 | nav: 10 | - Home: index.md 11 | - Library API: libapi.md 12 | - Web API: webapi.md 13 | 14 | markdown_extensions: 15 | - admonition 16 | - codehilite 17 | - mkautodoc 18 | -------------------------------------------------------------------------------- /timetagger/__init__.py: -------------------------------------------------------------------------------- 1 | """ 2 | Timetagger - Tag your time, get the insight. 3 | """ 4 | 5 | __version__ = "25.12.1" 6 | 7 | version_info = tuple(map(int, __version__.split("."))) 8 | 9 | 10 | from ._config import config # noqa 11 | from . import server # noqa - server logic 12 | from . import common # noqa - common assets 13 | from . import images # noqa - image assets 14 | from . import app # noqa - app assets 15 | from . import pages # noqa - pages 16 | -------------------------------------------------------------------------------- /timetagger/images/_names.txt: -------------------------------------------------------------------------------- 1 | * PNG's have their size in the name. 2 | * The suffix has 2 chars: 3 | * type: 4 | * "s" for small, square 5 | * "w" for word, wide 6 | * "b" for below, big 7 | * "t" for text-only 8 | * coloring: 9 | * "d" for dark (to be used on a light bg) 10 | * "l" for light (to be used on a dark bg) 11 | * "g" for gray 12 | * "f" for filled (dark on a light circle) 13 | * "m" for maskable (dark on a white square) 14 | -------------------------------------------------------------------------------- /timetagger/app/sandbox.md: -------------------------------------------------------------------------------- 1 | % TimeTagger - Sandbox 2 | % An empty app, not connected to the server, to try things out. 3 | 4 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /deploy/repo.Dockerfile: -------------------------------------------------------------------------------- 1 | # Dockerfile to build an image from the repo. 2 | # Note that the build context must be the root of the repo. 3 | # Used by CI to build the image that is pushed to ghcr. 4 | 5 | FROM python:3.13-slim-bookworm 6 | 7 | WORKDIR /root 8 | COPY . . 9 | 10 | # Install dependencies (including optional ones that make uvicorn faster) 11 | # Upgrade pip to the lastest version 12 | RUN pip --no-cache-dir install pip --upgrade && \ 13 | # Install optional depedencies that make uvicorn faster 14 | pip --no-cache-dir install uvicorn uvloop httptools && \ 15 | # Install timetagger depedencies defined via setup.py 16 | pip install --no-cache-dir --no-warn-script-location -e . 17 | 18 | CMD ["python", "-m", "timetagger"] 19 | -------------------------------------------------------------------------------- /timetagger/common/_template.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 |
27 | """
28 |
29 | setup(
30 | name="timetagger",
31 | version=VERSION,
32 | packages=find_packages(exclude=["tests", "tests.*", "examples", "examples.*"]),
33 | package_data={
34 | f"timetagger.{x}": ["*"] for x in ["common", "images", "app", "pages"]
35 | },
36 | scripts=["contrib/multiuser_tweaks/timetagger_multiuser_tweaks.py"],
37 | python_requires=">=3.6.0",
38 | install_requires=runtime_deps,
39 | license="GPL-3.0",
40 | description=short_description,
41 | long_description=long_description,
42 | long_description_content_type="text/markdown",
43 | author="Almar Klein",
44 | author_email="almar.klein@gmail.com",
45 | url="https://github.com/almarklein/timetagger",
46 | classifiers=[
47 | "Development Status :: 5 - Production/Stable",
48 | "Intended Audience :: Developers",
49 | "License :: OSI Approved :: GNU General Public License v3 (GPLv3)",
50 | "Operating System :: MacOS :: MacOS X",
51 | "Operating System :: Microsoft :: Windows",
52 | "Operating System :: POSIX",
53 | "Programming Language :: Python",
54 | "Programming Language :: Python :: 3 :: Only",
55 | "Programming Language :: Python :: 3.9",
56 | "Programming Language :: Python :: 3.10",
57 | "Programming Language :: Python :: 3.11",
58 | "Programming Language :: Python :: 3.12",
59 | "Programming Language :: Python :: 3.13",
60 | ],
61 | )
62 |
--------------------------------------------------------------------------------
/.github/workflows/ci.yml:
--------------------------------------------------------------------------------
1 | name: CI
2 |
3 | on:
4 | workflow_dispatch:
5 | push:
6 | branches: [ main ]
7 | pull_request:
8 | branches: [ main ]
9 |
10 |
11 | jobs:
12 |
13 | lint:
14 | name: linting
15 | runs-on: ubuntu-latest
16 | steps:
17 | - uses: actions/checkout@v5
18 | - name: Set up Python
19 | uses: actions/setup-python@v6
20 | with:
21 | python-version: 3.13
22 | - name: Install dependencies
23 | shell: bash
24 | run: |
25 | python -m pip install --upgrade pip
26 | pip install black flake8 invoke
27 | - name: Lint
28 | shell: bash
29 | run: |
30 | invoke checkformat
31 | invoke lint
32 |
33 | tests:
34 | name: ${{ matrix.name }}
35 | runs-on: ${{ matrix.os }}
36 | strategy:
37 | matrix:
38 | include:
39 | - name: Linux py39
40 | os: ubuntu-latest
41 | pyversion: '3.9'
42 | - name: Linux py310
43 | os: ubuntu-latest
44 | pyversion: '3.10'
45 | - name: Linux py311
46 | os: ubuntu-latest
47 | pyversion: '3.11'
48 | - name: Linux py312
49 | os: ubuntu-latest
50 | pyversion: '3.12'
51 | - name: Linux py313
52 | os: ubuntu-latest
53 | pyversion: '3.13'
54 | - name: Linux pypy3
55 | os: ubuntu-latest
56 | pyversion: 'pypy3.9'
57 | - name: Windows py313
58 | os: windows-latest
59 | pyversion: '3.13'
60 | - name: MacOS py313
61 | os: macos-latest
62 | pyversion: '3.13'
63 | steps:
64 | - uses: actions/checkout@v5
65 | - name: Set up Python ${{ matrix.pyversion }}
66 | uses: actions/setup-python@v6
67 | with:
68 | python-version: ${{ matrix.pyversion }}
69 | - name: Install dependencies
70 | shell: bash
71 | run: |
72 | python -m pip install --upgrade pip
73 | pip install -U -r requirements.txt
74 | pip install pytest requests setuptools .
75 | rm -rf ./timetagger ./build ./egg-info
76 | - name: Test with pytest
77 | shell: bash
78 | run: |
79 | python -c "import sys; print(sys.version, '\n', sys.prefix)";
80 | pytest -v .
81 |
--------------------------------------------------------------------------------
/docs/docs/index.md:
--------------------------------------------------------------------------------
1 | # Welcome to the TimeTagger docs
2 |
3 | [TimeTagger](https://timetagger.app) is an open source time tracker
4 | with a focus on a simple and interactive user experience.
5 |
6 | These docs are intended for developers who want to either
7 | communicate with the server via the [web API](webapi.md), or
8 | run their own server using the [library](libapi.md).
9 |
10 |
11 | ## Using the public web API
12 |
13 | The [web API](webapi.md) provides a way to communicate with the TimeTagger server
14 | (either the one at timetagger.app, or one you host yourself). It allows you
15 | to query, create, and update time-records outside of the web interface.
16 | Any changes you make will be visible in the web client almost directly (the client syncs every 10s).
17 |
18 | This makes it possible to create alternative clients, like the [TimeTagger CLI](https://github.com/almarklein/timetagger_cli),
19 | or to automate the tracking of certain processes by writing a script.
20 |
21 |
22 | ## Run your own server
23 |
24 | TimeTagger provides an example/default script to run the TimeTagger app locally
25 | in [`__main__.py`](https://github.com/almarklein/timetagger/blob/main/timetagger/__main__.py).
26 | You can also integrate TimeTagger into a larger web application, or extend
27 | it in your own ways using the [library](libapi.md).
28 | One prerequisite is that the web-server framework is
29 | async. Examples can be [Asgineer](https://github.com/almarklein/asgineer),
30 | [Responder](https://github.com/taoufik07/responder),
31 | [Starlette](https://github.com/encode/starlette), and
32 | [Quart](https://pgjones.gitlab.io/quart/).
33 |
34 |
35 | You can do whatever you want when you run things locally. When you host it
36 | on the web, you should take care of authentication, and make sure that you
37 | comply to the TimeTagger license (GPLv3).
38 |
39 | Note that when you run your own server, you probably want to make sure that it's
40 | always on. See [this article](https://tderflinger.com/en/using-systemd-to-start-a-python-application-with-virtualenv)
41 | for autostarting TimeTagger on Linux systems. The TimeTagger client has a local
42 | cache and stays working even when the server is off. In this case the
43 | sync indicator icon in the top left will show an exclamation mark.
44 |
45 | Also check [this article](https://timetagger.app/articles/selfhost/) about self-hosting TimeTagger.
46 |
47 | If you're interested in including TimeTagger into a larger product,
48 | contact [me](https://almarklein.org) for information about an OEM license.
49 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Byte-compiled / optimized / DLL files
2 | __pycache__/
3 | *.py[cod]
4 | *$py.class
5 | docs/site/
6 |
7 | # C extensions
8 | *.so
9 |
10 | # Distribution / packaging
11 | .Python
12 | build/
13 | develop-eggs/
14 | dist/
15 | downloads/
16 | eggs/
17 | .eggs/
18 | lib/
19 | lib64/
20 | parts/
21 | sdist/
22 | var/
23 | wheels/
24 | pip-wheel-metadata/
25 | share/python-wheels/
26 | *.egg-info/
27 | .installed.cfg
28 | *.egg
29 | MANIFEST
30 |
31 | # PyInstaller
32 | # Usually these files are written by a python script from a template
33 | # before PyInstaller builds the exe, so as to inject date/other infos into it.
34 | *.manifest
35 | *.spec
36 |
37 | # Installer logs
38 | pip-log.txt
39 | pip-delete-this-directory.txt
40 |
41 | # Unit test / coverage reports
42 | htmlcov/
43 | .tox/
44 | .nox/
45 | .coverage
46 | .coverage.*
47 | .cache
48 | nosetests.xml
49 | coverage.xml
50 | *.cover
51 | *.py,cover
52 | .hypothesis/
53 | .pytest_cache/
54 |
55 | # Translations
56 | *.mo
57 | *.pot
58 |
59 | # Django stuff:
60 | *.log
61 | local_settings.py
62 | db.sqlite3
63 | db.sqlite3-journal
64 |
65 | # Flask stuff:
66 | instance/
67 | .webassets-cache
68 |
69 | # Scrapy stuff:
70 | .scrapy
71 |
72 | # Sphinx documentation
73 | docs/_build/
74 |
75 | # PyBuilder
76 | target/
77 |
78 | # Jupyter Notebook
79 | .ipynb_checkpoints
80 |
81 | # IPython
82 | profile_default/
83 | ipython_config.py
84 |
85 | # pyenv
86 | .python-version
87 |
88 | # pipenv
89 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
90 | # However, in case of collaboration, if having platform-specific dependencies or dependencies
91 | # having no cross-platform support, pipenv may install dependencies that don't work, or not
92 | # install all needed dependencies.
93 | #Pipfile.lock
94 |
95 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow
96 | __pypackages__/
97 |
98 | # Celery stuff
99 | celerybeat-schedule
100 | celerybeat.pid
101 |
102 | # SageMath parsed files
103 | *.sage.py
104 |
105 | # Environments
106 | .env
107 | .venv
108 | env/
109 | venv/
110 | ENV/
111 | env.bak/
112 | venv.bak/
113 |
114 | # Spyder project settings
115 | .spyderproject
116 | .spyproject
117 |
118 | # Rope project settings
119 | .ropeproject
120 |
121 | # mkdocs documentation
122 | /site
123 |
124 | # mypy
125 | .mypy_cache/
126 | .dmypy.json
127 | dmypy.json
128 |
129 | # Pyre type checker
130 | .pyre/
131 |
132 | # docker datadir
133 | _timetagger/
134 |
--------------------------------------------------------------------------------
/timetagger/app/_template.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
63 |
64 |
65 | Generate a credentials-string with BCrypt hashing. This 94 | page only generates the hash. It does not communicate with 95 | a server or log you in somewhere. You can check the source if you want. 96 |
97 | 98 |The raw credentials:
102 |Dollar signs escaped with backslash, for Unix shell:
104 |Double dollar signs, for docker-compose script:
106 |119 | Authentication occurs using a web-token that is obtained when logging in. 120 | The token is valid for 14 days, and is refreshed when you use the application. 121 | It is recommended to log out on devices that you do not own. In case you forget, 122 | or when a device is lost/stolen, the token seed can be reset, causing all other sessions to log out. 123 |
124 |137 | The API token enables access to the server for 3d party applications (e.g. the CLI tool). API tokens do not expire. 138 | Reset the token to revoke access for all applications using the current API token. 139 |
140 |