{"id":13765079,"url":"https://github.com/markstory/docket-app","last_synced_at":"2025-07-10T22:41:47.311Z","repository":{"id":37103522,"uuid":"332126897","full_name":"markstory/docket-app","owner":"markstory","description":"A personal todo list application","archived":false,"fork":false,"pushed_at":"2025-03-07T15:02:36.000Z","size":4959,"stargazers_count":29,"open_issues_count":1,"forks_count":5,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-03-16T08:01:56.393Z","etag":null,"topics":["cakephp","php","todo-list-app","todo-list-project"],"latest_commit_sha":null,"homepage":"","language":"PHP","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/markstory.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}},"created_at":"2021-01-23T04:28:07.000Z","updated_at":"2025-03-07T15:02:40.000Z","dependencies_parsed_at":"2023-10-02T06:42:38.477Z","dependency_job_id":"c4221264-e7bb-4476-9fb5-f7eead16a0f2","html_url":"https://github.com/markstory/docket-app","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/markstory%2Fdocket-app","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/markstory%2Fdocket-app/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/markstory%2Fdocket-app/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/markstory%2Fdocket-app/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/markstory","download_url":"https://codeload.github.com/markstory/docket-app/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243969204,"owners_count":20376540,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["cakephp","php","todo-list-app","todo-list-project"],"created_at":"2024-08-03T16:00:33.681Z","updated_at":"2025-03-17T03:31:40.198Z","avatar_url":"https://github.com/markstory.png","language":"PHP","readme":"\u003ch1\u003e\n    \u003cimg src=\"https://raw.githubusercontent.com/markstory/docket-app/master/webroot/img/docket-logo.svg\" width=\"75\" height=\"75\" style=\"margin-right: 40px\" /\u003e\n    \u0026nbsp;\n    Docket App\n\u003c/h1\u003e\n\n[![Build Status](https://img.shields.io/github/actions/workflow/status/markstory/docket-app/ci.yml?branch=master)](https://github.com/markstory/docket-app/actions)\n[![codecov](https://codecov.io/gh/markstory/docket-app/branch/master/graph/badge.svg?token=0dPEbBPsQ3)](https://codecov.io/gh/markstory/docket-app)\n\nA personal task list \u0026 feed reader application. This project is built with [cakephp](https://cakephp.org), [htmx](https://htmx.org), and webcomponents in an effort to learn about building interactive applications with simpler frontend tools. The task list functionality is inspired by [Todoist](http://todoist.com) and [Things](http://culturedcode.com/things).\n\nThis project is great if you want to host and operate your personal todo lists on your own servers, where you know exactly what is being done with your data.\n\n## Installation \u0026 Getting Started\n\n1. Clone this repository.\n2. Download [Composer](https://getcomposer.org/doc/00-intro.md) or update `composer self-update`.\n3. Ensure you have a nodejs environment with yarn.\n4. Install dependencies:\n   ```\n   php composer.phar install\n   yarn install\n   ```\n5. Build static assets to generate a `manifest.json` file used to generate URLs\n   to generated UI assets.\n   ```\n   yarn build\n   ```\n6. Start up the development server:\n   ```\n   node bin/server.js\n   ```\n7. Visit `localhost:8765` to get started.\n\nDocket is tested against MySQL, Postgres and SQLite, and will work equally well\non all of them.  Create your database, and ensure your database is encoded as\n`UTF8` or `utf8mb4` if you are using MySQL. Next setup your database\nconfiguration in `config/app_local.php`; then run migrations:\n\n```php\nbin/cake migrations migrate\n```\n\nYou can now serve Docket using either the built-in PHP webserver, or more robust\nwebserver like Apache or Nginx.\n\nTo use the built-in PHP server run:\n\n```bash\nbin/cake server -p 8765\n```\n\nThen visit `http://localhost:8765` to see the landing page, and create your account.\n\n## Configuration\n\nWhile you shouldn't need to configure much, if you do want to tweak settings,\nthe `config/app_local.php` file is where you should make any changes specific to\nyour setup. During application start, this file is loaded and merged onto the\ndefaults in `config/app.php`.\n\n## Local Development\n\nUsing `node bin/server.js` you can run a PHP webserver and vite in watch mode.\nThis is the recommended development environment for docket.\n\n## Testing\n\nServer tests can be run via `phpunit`. By default only the functional and\nintegration tests are run. Docket also uses\n[panther](https://github.com/symfony/panther) to do automated browser testing.\nRunning acceptance tests requires you to have a browser driver available. Follow\nthe installation guide in panther to get started.  Once you have a driver\ninstalled acceptance tests can be run using `phpunit`:\n\n```sh\nphpunit --testsuite=acceptance\n```\n\nJavascript tests can be run via `jest`:\n\n```sh\nyarn test\n```\n\nFlutter tests can be run via `flutter`:\n\n```sh\ncd flutterapp\nflutter test\n```\n\n## Google Calendar Integration\n\nDocket offers a google calendar integration that will automatically sync calendar events into your 'today' and 'upcoming' views. This is a great way to have your meetings and appointments alongside your tasks.\n\n## Configuring Google Calendar\n\nThe google calendar integration has a fairly involved setup, as you will need to create a google OAuth consumer.\n\n1. Ensure your Docket install is running under an HTTPs connection.\n2. Get your site 'verified' in google search console.\n3. Create an [API Application in Google](https://cloud.google.com/docs/authentication/end-user). Your OAuth Client application and its accompanying 'Consent Screen' will need to:\n    1. Use the `$your_domain/auth/google/callback` as its redirect URI.\n    2. Request the `calendar.readonly` , `calendar.events.readonly`, and `userinfo.email` scopes.\n    3. Add your verified site to your API application.\n4. Next, download the credentials file for your application and save it into `config/google-auth.json`. You should take care to make sure this file is encrypted if it is added to any repositories.\n\nIf you've managed to do all of that you *should* have a working google calendar integration, and you should be able to go to *Profile Menu \u003e Calendars* and add your google account.\n\nIf not, I'm sorry but google has made this really hard and you'll have to keep trying until you get it working. There isn't much I can do to help either.\n\n## Automatic Syncing\n\nAdding a calendar to docket will also create a 'watch' subscription that will receive updates from google. Subscriptions only last around a week after which they need to be renewed. You can add the following command to run as a daily cron job:\n\n```bash\nbin/cake calendar_subscription_renew\n```\n\nThis command will iterate all the subscriptions that will expire in the next day and create a new subscription for those calendar sources.\n\n## Flutter + Google Auth\n\nWhen building the flutter application you need another OAuth Client ID for\nthe flutter application.\n\n1. Setup a keystore file. I [followed this tutorial](https://docs.flutter.dev/deployment/android#create-an-upload-keystore).\n2. Fill out `key.properties`. It should look like\n   ```\n   keyAlias=upload\n   keyPassword=androidpassword\n   storeFile=/Users/markstory/code/docket-app/flutterapp/upload-keystore.jks\n   storePassword=androidpassword\n   ```\n3. Populate `assets/google-auth.json`. It should look like\n   ```\n   {\n    \"clientId\": \"a-big-number.apps.googleusercontent.com\",\n    \"redirectUrl\": \"com.docket.flutterapp\"\n   }\n   ```\n\nYou should now be able to generate an android build.\n\nThis [video](https://www.youtube.com/watch?app=desktop\u0026v=E5WgU6ERZzA) was fantastic and helped me\nget through the setup pain of this integration.\n\n# Docker\n\nYou can build a docker image for docket by running the following\ncommands:\n\n```\npodman build -t docket-app\n```\n\nThe container can then run:\n\n```\npodman run --name docket -d -p 5000:5000 docket-app\n```\n\nThis will start nginx+php-fpm in a container. You'll need to configure your application's database, and any other settings you want to use. See `app/config/app.php` for available configuration options. As required, more environment variable support will be added.\n\nOnce you have a container running, you'll need to exec into the container to run database migrations and run maintenance tasks.\n\n```\n# run migrations\npodman exec -it docket /opt/app/bin/cake migrations migrate\n\n# update calendar subscriptions (daily)\nbin/cake calendar_subscription_renew\n\n# update feed subscriptions (daily)\nbin/cake feed_sync\n\n# run cleanup. Will delete old completed tasks.\n# Not necessary, but can help compact large instances.\nbin/cake cleanup\n```\n","funding_links":[],"categories":["Todo List"],"sub_categories":["Uptime Monitoring"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmarkstory%2Fdocket-app","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmarkstory%2Fdocket-app","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmarkstory%2Fdocket-app/lists"}