{"id":50734781,"url":"https://github.com/eteriall/doiter-macos","last_synced_at":"2026-06-10T12:31:19.392Z","repository":{"id":325297221,"uuid":"1100582959","full_name":"eteriall/doiter-macos","owner":"eteriall","description":"minimalistic todo-app for everyday use","archived":false,"fork":false,"pushed_at":"2026-05-25T12:08:10.000Z","size":194,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-25T12:31:01.036Z","etag":null,"topics":["macos","macos-app","productivity-tools"],"latest_commit_sha":null,"homepage":"https://rasskazchikov.de/projects/doiter","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/eteriall.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-11-20T13:30:23.000Z","updated_at":"2026-05-25T12:08:14.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/eteriall/doiter-macos","commit_stats":null,"previous_names":["eteriall/doiter-macos"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/eteriall/doiter-macos","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eteriall%2Fdoiter-macos","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eteriall%2Fdoiter-macos/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eteriall%2Fdoiter-macos/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eteriall%2Fdoiter-macos/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/eteriall","download_url":"https://codeload.github.com/eteriall/doiter-macos/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eteriall%2Fdoiter-macos/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34153482,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-10T02:00:07.152Z","response_time":89,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["macos","macos-app","productivity-tools"],"created_at":"2026-06-10T12:31:19.299Z","updated_at":"2026-06-10T12:31:19.379Z","avatar_url":"https://github.com/eteriall.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# doiter\n\nMinimal macOS todo app with a Django sync backend.\n\n## Layout\n\n- `macos/` contains the PyObjC menu-bar app, local SQLite cache, py2app packaging, and macOS tests.\n- `backend/` contains the Django/DRF API, token auth, task sync endpoints, Unfold admin, and OpenAPI docs.\n\n## Backend\n\n```bash\ncd backend\npython -m venv .venv\n. .venv/bin/activate\npip install -r requirements.txt\npython manage.py migrate\npython manage.py createsuperuser\npython manage.py runserver\n```\n\nFor persistent logins across server restarts, keep the same database file/volume and set a stable `DOITER_SECRET_KEY` in the server environment. JWT refresh tokens are per app/device and valid for 365 days unless that specific device logs out.\n\nAPI docs:\n\n- OpenAPI schema: `http://127.0.0.1:8000/api/schema/`\n- Swagger UI: `http://127.0.0.1:8000/api/docs/`\n- Admin: `http://127.0.0.1:8000/admin/`\n- Human API notes: `backend/docs/API.md`\n\n### Docker Compose\n\nCreate a `.env` from `.env.example`, set a long random `DOITER_SECRET_KEY`, and set `DOITER_ALLOWED_HOSTS` to the public hostname used by Nginx Proxy Manager. For production, the default public hostname is `doiter.rasskazchikov.de` and the CSRF trusted origin is `https://doiter.rasskazchikov.de`.\n\n```bash\ndocker network create proxy\ndocker compose up -d --build\n```\n\nCompose stores the backend SQLite database in the named volume `doiter-sqlite`, joins only the external `proxy` network, and does not publish host ports. In Nginx Proxy Manager, proxy to:\n\n```text\nForward Hostname / IP: doiter-backend\nForward Port: 8000\n```\n\n## macOS App\n\n```bash\ncd macos\npip3 install -r requirements.txt\n./build.sh\ncp -r dist/doiter.app /Applications/\n/Applications/doiter.app/Contents/Resources/install_autostart.sh\n```\n\nThe app stores its JWT access and refresh tokens in macOS Keychain. The server URL is configured from the menu-bar Settings window and defaults to:\n\n```text\nhttp://127.0.0.1:8000/api\n```\n\nOn first login, the app asks whether existing local tasks should be imported into the authenticated account. Tasks remain cached locally for offline use and sync when the backend is reachable.\n\n## Basic Operations\n\n- `Cmd + E` - Open/close the overlay\n- Type immediately - Cursor auto-focuses\n- `Cmd + /` - Show keyboard shortcuts\n- Type text - Search existing tasks or enter a new task\n- `Enter` - Add or edit a task\n- `Up/Down` - Navigate through tasks\n- `Cmd + Up/Down` - Move selected task up or down\n- `Backspace` - Delete selected task\n- `Cmd + Z` - Undo last operation locally\n- `Cmd + Shift + Z` - Redo locally\n- `Cmd + D` - Set deadline\n- `Cmd + Shift + D` - Clear deadline\n- `Cmd + L` - Set planned slot\n- `Cmd + Shift + L` - Clear planned slot\n- `Cmd + P` - Copy current task list view\n- `Cmd + T` - Start, stop, or continue countdown timer\n- `Cmd + Shift + T` - Cancel selected task timer\n- `Esc` - Close the overlay\n\n## Troubleshooting\n\nIf the global hotkey does not work, grant Accessibility permissions:\n\n1. System Settings \u003e Privacy \u0026 Security \u003e Accessibility\n2. Add `doiter.app` or enable it in the list\n\nTo reset local app data:\n\n```bash\nrm ~/Library/Application\\ Support/doiter/doiter.db\nrm ~/Library/Application\\ Support/doiter/config.json\nsecurity delete-generic-password -s com.doiter.app -a api-token\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feteriall%2Fdoiter-macos","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Feteriall%2Fdoiter-macos","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feteriall%2Fdoiter-macos/lists"}