{"id":18496360,"url":"https://github.com/oddbird/oddvest","last_synced_at":"2025-10-14T11:13:52.451Z","repository":{"id":37925771,"uuid":"216455840","full_name":"oddbird/oddvest","owner":"oddbird","description":"Trello/Harvest integration","archived":false,"fork":false,"pushed_at":"2024-09-26T14:43:15.000Z","size":4131,"stargazers_count":0,"open_issues_count":1,"forks_count":0,"subscribers_count":3,"default_branch":"main","last_synced_at":"2024-10-29T18:48:50.208Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/oddbird.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},"funding":{"github":"oddbird","open_collective":"oddbird-open-source"}},"created_at":"2019-10-21T01:49:53.000Z","updated_at":"2024-09-26T14:43:24.000Z","dependencies_parsed_at":"2023-02-08T13:00:49.851Z","dependency_job_id":"bdab6b78-130e-4138-ba3d-3b62929dff12","html_url":"https://github.com/oddbird/oddvest","commit_stats":{"total_commits":101,"total_committers":4,"mean_commits":25.25,"dds":0.5247524752475248,"last_synced_commit":"ad8fb4c84deea79b016b492f39b35b829a724f35"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oddbird%2Foddvest","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oddbird%2Foddvest/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oddbird%2Foddvest/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oddbird%2Foddvest/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/oddbird","download_url":"https://codeload.github.com/oddbird/oddvest/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247935335,"owners_count":21020817,"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":[],"created_at":"2024-11-06T13:29:09.683Z","updated_at":"2025-10-14T11:13:47.431Z","avatar_url":"https://github.com/oddbird.png","language":"JavaScript","funding_links":["https://github.com/sponsors/oddbird","https://opencollective.com/oddbird-open-source"],"categories":[],"sub_categories":[],"readme":"# Oddvest\n\n[![Netlify Status](https://api.netlify.com/api/v1/badges/ac38ae99-f54e-436c-a0c9-5b4519a1bba4/deploy-status)](https://app.netlify.com/sites/oddvest/deploys)\n\nOddBird's Trello Power-up for Harvest integration.\n\nAllows selecting a Harvest project per Trello board, a Harvest task from that\nproject per Trello card, and then provides an up-to-date report of time tracked\nper developer on that task on the back of the card.\n\n### Why not use the official Harvest power-up?\n\nBecause it doesn't do what we need. The time report it attaches to a card only\nincludes time entries tracked using the Harvest button on that card. There's no\nway to track time from any other Harvest surface and have it included in the\ntime report for a card. This doesn't work for us for several reasons: we often\nbudget time in larger-scope Harvest tasks that end up mapping to multiple Trello\ncards, and our devs don't want to be restricted to only tracking their time via\nthe Harvest button on a Trello card.\n\nOddvest allows us to associate any number of Trello cards with the same Harvest\ntask, and each of those cards will show a complete time report for that Harvest\ntask.\n\n## Setup\n\nEnable the power-up on your Trello board. It'll pop up an initial configuration\nbox where you give it a \"Client Id\" from your Harvest OAuth2 application, and\nyour Harvest \"Account Id\" (a seven-digit number); the popup includes links on\nwhere you can find/create those. A single Harvest OAuth2 application can be\nreused for many Trello boards, as long as they are on the same account. (Note\nfor OddBird: the client ID and account ID for our production Oddvest OAuth2\napplication are in Keybase under `oddvest/` folder.)\n\nSometimes the popup will disappear before you get a chance to fill it out, if\nyou click off to other browser tabs/windows. If this happens you just have to\ndisable and then re-enable the power-up to get the config window again.\n\nOnce this is done, you can click the gear icon on the power-up and choose\nAuthorize from the menu to connect your Trello account to Harvest. This will pop\nup a new window to grant Oddvest access to your Harvest account.\n\nThen the last setup step is to click the gear icon again and choose \"Edit\nPower-up Settings\", which will bring up another popup where you can choose the\nHarvest project you want to use with this board from a dropdown of the projects\nin your Harvest account. Save this and your Trello board is all set up for\nOddvest!\n\n## Development\n\n### Install Node and Yarn\n\nWe recommend using [nvm](https://github.com/nvm-sh/nvm) for node version\nmanagement. [Install it](https://github.com/nvm-sh/nvm#installation-and-update)\nif necessary, then run `nvm install` (once per active shell) to use the correct\nversion of node for Oddvest development.\n\nThe correct [Yarn](https://yarnpkg.com/) version is included in the repo, and\nwill be used automatically for any `yarn` command.\n\nTo upgrade the node version used by Oddvest, update the version number in two\nplaces and then run `nvm install` to upgrade:\n\n- `.nvmrc`\n- `package.json` (`engines.node` field)\n\nTo upgrade the yarn version used by Oddvest, update the version number in\n`package.json` (`engines.yarn` field) and run\n`yarn policies set-version \u003cnew-version\u003e`.\n\n### Install dependencies\n\n```\nyarn\n```\n\nTo compile the JavaScript/TypeScript files, run `yarn build`.\n\nYou can also run individual development commands:\n\n```\n# start a watcher to compile assets on changes\nyarn watch\n\n# format/lint all files, and type-check TypeScript files\nyarn lint\n\n# run unit tests\nyarn test\n```\n\nIn order to actually try out your local changes with Trello \u0026 Harvest (which is\nnecessary to have any confidence in your changes, given the nature of the\nproject), you'll need a few additional things set up:\n\n1. Start a server that can serve your local checkout. Just cd into the `oddvest`\n   directory and run `python3 -m http.server 80`. This will take over that\n   terminal until you Ctrl-C to stop it.\n\n2. Expose this server to the Internet via `ngrok`. Install it (from\n   https://ngrok.com/) if you don't have it already, then open another terminal\n   and run `ngrok http 80`. Copy the HTTPS url it gives you (something like\n   `https://8c370def.ngrok.io`) for later use. This will also take over a\n   terminal until you Ctrl-C out of it.\n\n3. Create an OAuth2 application at Harvest. Visit\n   https://id.getharvest.com/developers and click \"Create New OAuth2\n   Application.\" Paste the ngrok URL from above into the \"Redirect URL\" and\n   \"Origin URL\" boxes. Make sure NOT to include a trailing slash. \"I need access\n   to one account\" and \"I want access to Harvest\" is all you need.\n\n4. Create a new Trello Power-Up specifically for your local development of\n   OddVest at https://trello.com/power-ups/admin. The \"Iframe Connector URL\"\n   should be your ngrok URL from above. On the Capabilities tab, you need to\n   enable \"Card Back Section\", \"Card Badges\", \"Card Buttons\", \"Card Detail\n   Badges\", \"On Enable\", \"Show Settings\", \"Authorization Status\", and \"Show\n   Authorization\" capabilities. Note that changes on the capabilities tab don't\n   seem to save unless you go back to the main tab and click the Save button.\n\n5. On some test board where you won't disrupt others' work, make sure the prod\n   Oddvest power-up is disabled and enable your test power-up (per the\n   [instructions above](#setup)). Now this board will use your local version of\n   Oddvest.\n\n### Project layout\n\nTrello loads `index.html` in an iframe and calls the `t.initialize()` method in\n`src/client.ts`. All other HTML files are loaded in some other iframe when some\naction is taken in Trello UI; those should all be referenced in `client.ts`.\n\nThe `.ts` files in `src/` correspond one-to-one with the HTML files, and are\nloaded by the corresponding HTML file. The files in `src/lib/` are library code\nthat is used by multiple entry-point JS files. Each entry-point JS file and the\nlibrary files it depends on are bundled/transpiled by rollup/babel into a\ngenerated file in `dist/` which is actually referenced from the corresponding\nHTML file.\n\nFiles in `dist/` are git-ignored but are needed for local dev (see below) and\nare automatically built by Netlify on deploy.\n\n### Deployment\n\nPush to `main` on GitHub and your changes will be automatically deployed.\n\n## TODO\n\nInfra:\n\n- Add more unit tests.\n- Better styling and icons.\n\nBugs:\n\n- Correct and performant for older time entries.\n- Graceful handling of not-yet-authorized state.\n- See if we can avoid asking for write perms to Harvest.\n\nFeatures:\n\n- Add ability to start/stop a timer for the card's task, direct from the card.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foddbird%2Foddvest","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Foddbird%2Foddvest","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foddbird%2Foddvest/lists"}