Inspired by D. Shea's ETT productivity worksheet, read more of the philosophy here: https://davidseah.com/node/the-emergent-task-timer/
Try the app out here right now: http://timely-tasker.com/timer
./cypress # Test fixtures and boilerplate
./bin # Dev tools
./fixtures # Fixtures for use in development
./functions # Serverless cloud-run code (the REST api lives here, routes map to these filenames)
./lib # Supporting code for serverless functions
./migrations # Database migrations
./public # Static assets
./src # React application code
# Timer.tsx
# |__TaskRowSummary.tsx
# |
# |__TaskRowTicks.tsx
# |__Tick.tsx
- built with CloudFlare Pages
- react.js front-end with reduxjs for state management
- interactive browser-based test coverage with Cypress
- backend data stored using Functions & D1 for lightweight relational storage
- pipeline integration with github CI and codecov, ++README badges!
- only supports google accounts
- establish identity/ownership of data, no google APIs will be authorized via oAuth scopes. For this we can target only the id_token info.
- use authorization code flow, server->server code exchange
- successful auth results in a crypto-safe unique session ID cookie that is not visible to JS (i.e. marked 'httpOnly' to bust XSRF).
- this cookie comes with all future XHRs to CRUD the app's cloud data, that's how we associate it with you
- the direct server->server call to google over TLS for token exchange means we don't have to validate a JWT separately, the identity returned is always valid in server context
- reference: https://developers.google.com/identity/openid-connect/openid-connect#obtainuserinfo , https://developers.google.com/identity/openid-connect/openid-connect#authuser
Each Summary is one horizontal line with a topic at the beginning, each TimerTick is one of the 96 quarter-hour slots in a day. TimerTicks will be displayed horizontally next to their summary, offering a simple way to track work items and the push/pull between scheduled work and distractions.
TimerTicks can have 2 states: Distracted = 0, Distracted = 1 A TimerTick is created for any "occupied" tick, i.e. whenever the user clicks a tick. Clicking 2 ticks in the same column shall result in the state of both ticks being saved as Distracted = 1, to indicate that time was spread between tasks.
Runs the app in the development mode, with sqlite persistence enabled.
Open http://localhost:3000 to view it in your browser.
Runs migrations on local dev
Runs migrations in preview/staging.
!!RUNS MIGRATIONS IN PRODUCTION!!
Loads a local dev DB console (run migrations to create the db)