{"id":20851567,"url":"https://github.com/conjfrnk/todoist-wrapper","last_synced_at":"2026-05-01T10:00:48.917Z","repository":{"id":233608715,"uuid":"787546405","full_name":"conjfrnk/todoist-wrapper","owner":"conjfrnk","description":"Electron Wrapper for Todoist on Linux","archived":false,"fork":false,"pushed_at":"2026-04-25T02:55:08.000Z","size":746,"stargazers_count":5,"open_issues_count":8,"forks_count":1,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-25T09:32:08.622Z","etag":null,"topics":["electron","gentoo","javascript","linux","productivity","todoist"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/conjfrnk.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":"2024-04-16T18:22:22.000Z","updated_at":"2026-04-25T02:55:10.000Z","dependencies_parsed_at":"2024-05-22T00:28:32.621Z","dependency_job_id":"94ee012e-56c1-499e-959e-1d70662adbb1","html_url":"https://github.com/conjfrnk/todoist-wrapper","commit_stats":null,"previous_names":["conjfrnk/todoist-wrapper"],"tags_count":336,"template":false,"template_full_name":null,"purl":"pkg:github/conjfrnk/todoist-wrapper","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/conjfrnk%2Ftodoist-wrapper","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/conjfrnk%2Ftodoist-wrapper/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/conjfrnk%2Ftodoist-wrapper/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/conjfrnk%2Ftodoist-wrapper/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/conjfrnk","download_url":"https://codeload.github.com/conjfrnk/todoist-wrapper/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/conjfrnk%2Ftodoist-wrapper/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32492594,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-30T13:12:12.517Z","status":"online","status_checked_at":"2026-05-01T02:00:05.856Z","response_time":64,"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":["electron","gentoo","javascript","linux","productivity","todoist"],"created_at":"2024-11-18T03:14:08.742Z","updated_at":"2026-05-01T10:00:48.899Z","avatar_url":"https://github.com/conjfrnk.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# todoist-wrapper\n\nA lightweight Electron wrapper for [Todoist](https://app.todoist.com) that provides a native desktop experience on Linux with full Wayland support.\n\nI built this because [the official Flatpak](https://github.com/flathub/com.todoist.Todoist) was 5+ months outdated and couldn't run on my system anymore.\n\n## Features\n\n- **Native Desktop Experience** - Wraps Todoist in a dedicated window with proper desktop integration\n- **Wayland Support** - Full native Wayland support for modern Linux desktops\n- **Automatic Theme Switching** - Automatically toggles between light and dark themes based on time of day\n- **Manual Theme Toggle** - Override auto-theme via the Theme menu\n- **Window State Persistence** - Remembers window size and position across sessions\n- **Network Resilience** - Circuit breaker pattern with automatic retry and exponential backoff\n- **Offline Detection** - User-friendly error page with auto-retry when connection is restored\n- **Structured Logging** - JSON logging with rotation for debugging and monitoring\n- **Memory Management** - Automatic memory monitoring with GC triggers\n- **Secure by Default** - CSP headers, context isolation, sandbox mode, and URL validation\n\n## Installation\n\n### npm (Recommended)\n\n```bash\nnpm install -g github:conjfrnk/todoist-wrapper\ntodoist-wrapper\n```\n\n### Fedora/RHEL\n\n```bash\nsudo dnf install https://github.com/conjfrnk/todoist-wrapper/releases/latest/download/todoist-wrapper-latest.rpm\n```\n\n### Gentoo\n\nFirst add [my overlay](https://github.com/conjfrnk/overlay):\n\n```bash\neselect repository add conjfrnk-overlay git https://github.com/conjfrnk/overlay.git\n```\n\nThen emerge the package:\n\n```bash\nemerge todoist-wrapper\n```\n\nNote: This installs a pre-built binary from [releases](https://github.com/conjfrnk/todoist-wrapper/releases/latest), not compiled from source.\n\n### Generic Linux\n\nDownload the latest binary from [releases](https://github.com/conjfrnk/todoist-wrapper/releases/latest), or use the provided install script:\n\n```bash\ncurl -fsSL https://raw.githubusercontent.com/conjfrnk/todoist-wrapper/main/install.sh | bash\n```\n\nTo uninstall:\n\n```bash\ncurl -fsSL https://raw.githubusercontent.com/conjfrnk/todoist-wrapper/main/uninstall.sh | bash\n```\n\n## Configuration\n\nThe application can be configured via environment variables:\n\n| Variable                         | Description                                    | Default                   |\n| -------------------------------- | ---------------------------------------------- | ------------------------- |\n| `TODOIST_URL`                    | Todoist instance URL (for enterprise)          | `https://app.todoist.com` |\n| `TODOIST_AUTO_THEME`             | Enable automatic theme switching               | `true`                    |\n| `TODOIST_THEME_INTERVAL_MINUTES` | How often to check time for theme switch       | `30`                      |\n| `TODOIST_LIGHT_THEME_START_HOUR` | Hour to switch to light theme (24h format)     | `6`                       |\n| `TODOIST_LIGHT_THEME_END_HOUR`   | Hour to switch to dark theme (24h format)      | `18`                      |\n| `TODOIST_MAX_RETRIES`            | Connection retry attempts before showing error | `3`                       |\n| `TODOIST_TIMEOUT_MS`             | Request timeout in milliseconds                | `30000`                   |\n| `LOG_LEVEL`                      | Logging verbosity (debug, info, warn, error)   | `info`                    |\n\nExample usage:\n\n```bash\nTODOIST_LIGHT_THEME_START_HOUR=7 TODOIST_LIGHT_THEME_END_HOUR=20 todoist-wrapper\n```\n\n## Development\n\n### Prerequisites\n\n- Node.js 18+ (LTS recommended)\n- npm\n\n### Setup\n\n```bash\ngit clone https://github.com/conjfrnk/todoist-wrapper.git\ncd todoist-wrapper\nnpm install\nnpm run build\n```\n\n### Available Scripts\n\n| Command                 | Description                            |\n| ----------------------- | -------------------------------------- |\n| `npm run build`         | Compile TypeScript to JavaScript       |\n| `npm start`             | Build and run the application          |\n| `npm test`              | Run the test suite                     |\n| `npm run test:coverage` | Run tests with coverage report         |\n| `npm run typecheck`     | Type-check without emitting            |\n| `npm run lint`          | Check code with ESLint                 |\n| `npm run lint:fix`      | Fix linting issues automatically       |\n| `npm run format`        | Format code with Prettier              |\n| `npm run format:check`  | Check code formatting                  |\n| `npm run validate`      | Run typecheck, lint, format, and tests |\n| `npm run package-linux` | Build Linux binary package             |\n| `npm run package-rpm`   | Build RPM package for Fedora/RHEL      |\n\n### Project Structure\n\n```\ntodoist-wrapper/\n├── src/\n│   ├── main.ts              # Application entry point\n│   ├── preload.ts           # Secure preload script\n│   ├── services/            # Service modules\n│   │   ├── ConfigService    # Zod-validated configuration\n│   │   ├── LoggerService    # Pino-based structured logging\n│   │   ├── StoreService     # Async persistence with caching\n│   │   ├── SecurityService  # CSP and URL validation\n│   │   ├── NetworkService   # Circuit breaker and retry logic\n│   │   ├── ThemeService     # Auto theme scheduling\n│   │   └── WindowService    # Window lifecycle management\n│   ├── types/               # TypeScript type definitions\n│   └── utils/               # Utility functions\n├── dist/                    # Compiled JavaScript output\n├── test/                    # Test suite\n├── bin/                     # CLI entry point\n├── assets/                  # Desktop entry and icons\n├── scripts/                 # Build scripts\n└── rpm/                     # RPM packaging spec\n```\n\n### Architecture\n\nThe application uses a service-oriented architecture with:\n\n- **TypeScript** with strict mode for type safety\n- **Zod** for runtime configuration validation\n- **Pino** for structured JSON logging with file rotation\n- **Circuit breaker pattern** for network resilience\n- **Singleton services** with dependency injection\n\n## Security\n\nThis application implements several [Electron security best practices](https://www.electronjs.org/docs/latest/tutorial/security):\n\n- **Content Security Policy** - Restricts resource loading to Todoist domains\n- **Context Isolation** - Renderer process is isolated from Node.js\n- **Sandbox Mode** - Renderer runs in a sandboxed environment\n- **Node Integration Disabled** - No direct Node.js access from web content\n- **Remote Module Disabled** - Legacy remote module is disabled\n- **Secure Preload** - IPC bridge with input validation\n- **URL Validation** - External URLs are validated before opening\n- **Protocol Restrictions** - Only HTTP/HTTPS protocols allowed for external links\n- **Permission Handlers** - Explicit permission grants (only notifications allowed)\n\n## Contributing\n\n1. Fork the repository\n2. Create a feature branch (`git checkout -b feature/amazing-feature`)\n3. Make your changes\n4. Run validation (`npm run validate`)\n5. Commit your changes (`git commit -m 'Add amazing feature'`)\n6. Push to the branch (`git push origin feature/amazing-feature`)\n7. Open a Pull Request\n\n## License\n\nThis project is licensed under the GNU General Public License v3.0 - see the [LICENSE](LICENSE) file for details.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fconjfrnk%2Ftodoist-wrapper","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fconjfrnk%2Ftodoist-wrapper","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fconjfrnk%2Ftodoist-wrapper/lists"}