{"id":13929740,"url":"https://github.com/c2d7fa/thinktool","last_synced_at":"2026-02-21T01:16:37.291Z","repository":{"id":41138285,"uuid":"230105143","full_name":"c2d7fa/thinktool","owner":"c2d7fa","description":"Novel fusion of hierarchical and graph-based approaches to taking notes, based on ideas from Roam Research, TheBrain and others.","archived":false,"fork":false,"pushed_at":"2023-12-06T22:35:48.000Z","size":11778,"stargazers_count":119,"open_issues_count":0,"forks_count":7,"subscribers_count":6,"default_branch":"main","last_synced_at":"2026-02-05T06:13:50.876Z","etag":null,"topics":["knowledge-management","notes-app","outliner","tools-for-thought"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":false,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/c2d7fa.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null},"funding":{"ko_fi":"jonashvid"}},"created_at":"2019-12-25T13:13:34.000Z","updated_at":"2026-01-11T13:24:15.000Z","dependencies_parsed_at":"2023-12-06T23:28:28.560Z","dependency_job_id":"f9d1f655-b6d8-4c01-a7b6-f64226082734","html_url":"https://github.com/c2d7fa/thinktool","commit_stats":null,"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/c2d7fa/thinktool","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/c2d7fa%2Fthinktool","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/c2d7fa%2Fthinktool/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/c2d7fa%2Fthinktool/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/c2d7fa%2Fthinktool/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/c2d7fa","download_url":"https://codeload.github.com/c2d7fa/thinktool/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/c2d7fa%2Fthinktool/sbom","scorecard":{"id":260981,"data":{"date":"2025-08-11","repo":{"name":"github.com/c2d7fa/thinktool","commit":"2d56575dde42703af25686223b45aefa2bd86264"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.3,"checks":[{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"SAST","score":0,"reason":"no SAST tool detected","details":["Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Code-Review","score":0,"reason":"Found 0/30 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/deploy-desktop.yml:1","Warn: no topLevel permission defined: .github/workflows/publish-server.yml:1","Warn: no topLevel permission defined: .github/workflows/test.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE.md:0","Info: FSF or OSI recognized license: GNU Affero General Public License v3.0: LICENSE.md:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Signed-Releases","score":0,"reason":"Project has not signed or included provenance with any releases.","details":["Warn: release artifact 1.0.2 not signed: https://api.github.com/repos/c2d7fa/thinktool/releases/72121699","Warn: release artifact 1.0.1 not signed: https://api.github.com/repos/c2d7fa/thinktool/releases/72033555","Warn: release artifact 1.0.0 not signed: https://api.github.com/repos/c2d7fa/thinktool/releases/70585863","Warn: release artifact 1.0.2 does not have provenance: https://api.github.com/repos/c2d7fa/thinktool/releases/72121699","Warn: release artifact 1.0.1 does not have provenance: https://api.github.com/repos/c2d7fa/thinktool/releases/72033555","Warn: release artifact 1.0.0 does not have provenance: https://api.github.com/repos/c2d7fa/thinktool/releases/70585863"],"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'main'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/deploy-desktop.yml:36: update your workflow using https://app.stepsecurity.io/secureworkflow/c2d7fa/thinktool/deploy-desktop.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/deploy-desktop.yml:38: update your workflow using https://app.stepsecurity.io/secureworkflow/c2d7fa/thinktool/deploy-desktop.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/deploy-desktop.yml:50: update your workflow using https://app.stepsecurity.io/secureworkflow/c2d7fa/thinktool/deploy-desktop.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/deploy-desktop.yml:11: update your workflow using https://app.stepsecurity.io/secureworkflow/c2d7fa/thinktool/deploy-desktop.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/deploy-desktop.yml:16: update your workflow using https://app.stepsecurity.io/secureworkflow/c2d7fa/thinktool/deploy-desktop.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/deploy-desktop.yml:18: update your workflow using https://app.stepsecurity.io/secureworkflow/c2d7fa/thinktool/deploy-desktop.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/deploy-desktop.yml:29: update your workflow using https://app.stepsecurity.io/secureworkflow/c2d7fa/thinktool/deploy-desktop.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/publish-server.yml:9: update your workflow using https://app.stepsecurity.io/secureworkflow/c2d7fa/thinktool/publish-server.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/publish-server.yml:11: update your workflow using https://app.stepsecurity.io/secureworkflow/c2d7fa/thinktool/publish-server.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/publish-server.yml:13: update your workflow using https://app.stepsecurity.io/secureworkflow/c2d7fa/thinktool/publish-server.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/publish-server.yml:19: update your workflow using https://app.stepsecurity.io/secureworkflow/c2d7fa/thinktool/publish-server.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:9: update your workflow using https://app.stepsecurity.io/secureworkflow/c2d7fa/thinktool/test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:11: update your workflow using https://app.stepsecurity.io/secureworkflow/c2d7fa/thinktool/test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:22: update your workflow using https://app.stepsecurity.io/secureworkflow/c2d7fa/thinktool/test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:24: update your workflow using https://app.stepsecurity.io/secureworkflow/c2d7fa/thinktool/test.yml/main?enable=pin","Warn: containerImage not pinned by hash: tools/Dockerfile:3","Warn: containerImage not pinned by hash: tools/Dockerfile:10: pin your Docker image by updating node:17.2 to node:17.2@sha256:13621aa823b6b92572d19c08a75f7b1a061633089f37873f8b5bedb5e900e657","Warn: containerImage not pinned by hash: tools/dev/Dockerfile:1: pin your Docker image by updating debian to debian@sha256:6d87375016340817ac2391e670971725a9981cfc24e221c47734681ed0f6c0f5","Warn: downloadThenRun not pinned by hash: tools/dev/Dockerfile:7","Warn: downloadThenRun not pinned by hash: tools/dev/Dockerfile:11","Warn: downloadThenRun not pinned by hash: tools/dev/Dockerfile:14","Info:   0 out of   9 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   6 third-party GitHubAction dependencies pinned","Info:   0 out of   3 containerImage dependencies pinned","Info:   0 out of   3 downloadThenRun dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Vulnerabilities","score":0,"reason":"71 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-968p-4wvh-cqc8","Warn: Project is vulnerable to: GHSA-67hx-6x53-jw92","Warn: Project is vulnerable to: GHSA-qwcr-r2fm-qrc7","Warn: Project is vulnerable to: GHSA-v6h2-p8h4-qcjw","Warn: Project is vulnerable to: GHSA-grv7-fg5c-xmjg","Warn: Project is vulnerable to: GHSA-pxg6-pf52-xh8x","Warn: Project is vulnerable to: GHSA-3xgq-45jj-v275","Warn: Project is vulnerable to: GHSA-rv95-896h-c2vc","Warn: Project is vulnerable to: GHSA-qw6h-vgh9-j6wx","Warn: Project is vulnerable to: GHSA-jchw-25xp-jwwc","Warn: Project is vulnerable to: GHSA-cxjh-pqwp-8mfp","Warn: Project is vulnerable to: GHSA-fjxv-7rqg-78g4","Warn: Project is vulnerable to: GHSA-c7qv-q95q-8v27","Warn: Project is vulnerable to: GHSA-4www-5p9h-95mh","Warn: Project is vulnerable to: GHSA-9gqv-wp59-fq42","Warn: Project is vulnerable to: GHSA-9c47-m6qq-7p4h","Warn: Project is vulnerable to: GHSA-76p3-8jx3-jpfq","Warn: Project is vulnerable to: GHSA-3rfm-jhwj-7488","Warn: Project is vulnerable to: GHSA-hhq3-ff78-jv3g","Warn: Project is vulnerable to: GHSA-952p-6rrq-rcjv","Warn: Project is vulnerable to: GHSA-f8q6-p94x-37v3","Warn: Project is vulnerable to: GHSA-xvch-5gv4-984h","Warn: Project is vulnerable to: GHSA-mwcw-c2x4-8c55","Warn: Project is vulnerable to: GHSA-76c9-3jph-rj3q","Warn: Project is vulnerable to: GHSA-9wv6-86v2-598j","Warn: Project is vulnerable to: GHSA-rhx6-c78j-4q9w","Warn: Project is vulnerable to: GHSA-7fh5-64p2-3v2j","Warn: Project is vulnerable to: GHSA-c2qf-rxjj-qqgw","Warn: Project is vulnerable to: GHSA-m6fv-jmcg-4jfg","Warn: Project is vulnerable to: GHSA-76p7-773f-r4q5","Warn: Project is vulnerable to: GHSA-cm22-4g7w-348p","Warn: Project is vulnerable to: GHSA-4wf5-vphf-c2xc","Warn: Project is vulnerable to: GHSA-72xf-g2v4-qvf3","Warn: Project is vulnerable to: GHSA-hc6q-2mpp-qw7j","Warn: Project is vulnerable to: GHSA-4vvj-4cpr-p986","Warn: Project is vulnerable to: GHSA-wr3j-pwj9-hqq6","Warn: Project is vulnerable to: GHSA-4v9v-hfq4-rm2v","Warn: Project is vulnerable to: GHSA-9jgg-88mc-972h","Warn: Project is vulnerable to: GHSA-j8xg-fqg3-53r7","Warn: Project is vulnerable to: GHSA-3h5v-q93c-6h6q","Warn: Project is vulnerable to: GHSA-r4pf-3v7r-hh55","Warn: Project is vulnerable to: GHSA-phwq-j96m-2c2q","Warn: Project is vulnerable to: GHSA-ghr5-ch3p-vcr6","Warn: Project is vulnerable to: GHSA-3p22-ghq8-v749","Warn: Project is vulnerable to: GHSA-77xc-hjv8-ww97","Warn: Project is vulnerable to: GHSA-mq8j-3h7h-p8g7","Warn: Project is vulnerable to: GHSA-p2jh-44qj-pf2v","Warn: Project is vulnerable to: GHSA-p7v2-p9m8-qqg7","Warn: Project is vulnerable to: GHSA-7x97-j373-85x5","Warn: Project is vulnerable to: GHSA-7m48-wc93-9g85","Warn: Project is vulnerable to: GHSA-qqvq-6xgj-jw8g","Warn: Project is vulnerable to: GHSA-6r2x-8pq8-9489","Warn: Project is vulnerable to: GHSA-pfrx-2q88-qq97","Warn: Project is vulnerable to: GHSA-rc47-6667-2j5j","Warn: Project is vulnerable to: GHSA-4cpg-3vgw-4877","Warn: Project is vulnerable to: GHSA-p8p7-x288-28g6","Warn: Project is vulnerable to: GHSA-9qrh-qjmc-5w2p","Warn: Project is vulnerable to: GHSA-jqv5-7xpx-qj74","Warn: Project is vulnerable to: GHSA-3jfq-g458-7qm9","Warn: Project is vulnerable to: GHSA-5955-9wpr-37jh","Warn: Project is vulnerable to: GHSA-f5x3-32g6-xq36","Warn: Project is vulnerable to: GHSA-52f5-9888-hmc6","Warn: Project is vulnerable to: GHSA-hrpp-h998-j3pp","Warn: Project is vulnerable to: GHSA-wr66-vrwm-5g5x","Warn: Project is vulnerable to: GHSA-fmvm-x8mv-47mj","Warn: Project is vulnerable to: GHSA-f82v-jwr5-mffw","Warn: Project is vulnerable to: GHSA-c59h-r6p8-q9wc","Warn: Project is vulnerable to: GHSA-g77x-44xx-532m","Warn: Project is vulnerable to: GHSA-7gfc-8cq8-jh5f","Warn: Project is vulnerable to: GHSA-qpjv-v59x-3qc4","Warn: Project is vulnerable to: GHSA-r683-j2x4-v87g"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-17T10:49:53.399Z","repository_id":41138285,"created_at":"2025-08-17T10:49:53.399Z","updated_at":"2025-08-17T10:49:53.399Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29670123,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-21T00:11:43.526Z","status":"ssl_error","status_checked_at":"2026-02-20T23:52:33.807Z","response_time":59,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["knowledge-management","notes-app","outliner","tools-for-thought"],"created_at":"2024-08-07T18:02:31.447Z","updated_at":"2026-02-21T01:16:37.269Z","avatar_url":"https://github.com/c2d7fa.png","language":"TypeScript","readme":"# Thinktool\n\nThis repository contains the source code of [**Thinktool**](https://thinktool.io/), an associative note-taking application inspired by TheBrain and Roam Research.\n\n[**Check out the demo in your browser here!**](https://thinktool.io/demo)\n\n\u003cblockquote\u003e\n\u003cp align=\"center\"\u003e\n\u003cimg width=\"560\" src=\"https://raw.githubusercontent.com/c2d7fa/thinktool/master/screenshot.png\"/\u003e\n\u003c/p\u003e\n\u003cp align=\"center\"\u003e(Screenshot showing links, backreferences and multiple parents.)\u003c/p\u003e\n\u003c/blockquote\u003e\n\n## Project status\n\nAfter watching some of Scott Scheper's really interesting [videos on his\nAntinet](https://www.youtube.com/watch?v=fRgIX4azYOs), I started to reconsider\nsome of my opinions on digital Zettelkasten. These new opinions lead me to\nexperiment with implementing a much simpler Zettelkasten system for Emacs called\n[zt](https://github.com/c2d7fa/zt). Although this implementation has fewer\nfeatures than Thinktool, I think it is actually far more useful in practice.\n\nCheck out the README for that project for [some ideas for how you can build a\nuseful Zettelkasten](https://github.com/c2d7fa/zt#best-practices), even if you\ndon't actually intend to use it. I also recommend some alternative software\non that page.\n\nBecause I'm now using zt as my primary note-taking system, I guess I won't be\nspending much time on Thinktool.\n\nYou are welcome to use the offline desktop version. **However, I highly recommend against using the\nhosted web version. To the best of my knowledge, no one is using this, and I'm planning\non taking it down soon.** If you need to export your data, log in as normal and then go to\n[https://api.thinktool.io/state](https://api.thinktool.io/state). Alternatively,\nwrite to me at [jonas@thinktool.io](mailto:jonas@thinktool.io), and I'll do it for you.\nThis is just a JSON export – it's up to you to turn it into something useful.\n\n## Comparison to other software\n\n**Offline client:** [Obsidian](https://obsidian.md/) and [Logseq](https://logseq.com/) have excellent offline clients, which let you store your data in Markdown files locally. [Thinktool](https://thinktool.io) does have an offline desktop client, but it's janky in comparison and uses a SQLite database for data storage.\n\n**Graph structure:** [Roam Research](https://roamresearch.com/), [Logseq](https://logseq.com) and [Obsidian](https://obsidian.md/) let you link different pages together and use that graph structure to explore your notes. However, only pages -- not individual items -- can be connected like this. In contrast, Thinktool lets you connect individual items to multiple parents, so the same item can exist in multiple places.\n\n**Transclusion:** To work around the issue of connecting individual items, [Roam Research](https://roamresearch.com/) and [Logseq](https://logseq.com) support embedding (transcluding) blocks. However, recursive transclusion is not supported, and transclusions are second-class. [Thinktool](https://thinktool.io) doesn't need transclusion, because the same item can simply exist in multiple places -- there is no difference between the \"original\" item and its clones.\n\n**Hierarchical structure:** If you want to connect pages hierarchically, [Roam Research](https://roamresearch.com/), [Logseq](https://logseq.com)  and [Obsidian](https://obsidian.md/) require you to create a separate index page where you link the different pages together (or use some other custom system). [Thinktool](https://thinktool.io) makes no distinction between pages and items, so you can simply add one page as a child of another page.\n\n**Bidirectional links:** All of these tools, including [Thinktool](https://thinktool.io) are built around bidirectional linking and have similar features.\n\n**Miscellaneous features:** [Roam Research](https://roamresearch.com/), and to a lesser extent [Logseq](https://logseq.com), have a bunch of neat features that let you use it for task management, spaced repetition and more. [Thinktool](https://thinktool.io) is designed just for note-taking, so it doesn't have a lot of extra features.\n\n**Ease of use and UI:** Even though [Thinktool's](https://thinktool.io/) data model is arguably simpler than these other tools, the UI is quite a bit worse, so it ends up being harder to understand.\n\n## Open Source\n\nAll content of this repository to which I own the copyright is licensed under the terms of the GNU AGPLv3 or any later version as described in `LICENSE.md`.\n\nThis repository is not currently accepting issues or pull requests. Please see Thinktool's web page for information about how to contact me with your feedback about Thinktool. I may occationally force push to this repository, since I'm not expecting anyone else to be actively working on it. You are welcome to create your own fork.\n\nThe instructions in this README are mostly written for myself, and may not be sufficient to compile this project on your own. However, you can find some hints on how to run it in `.github/workflows`.\n\nYou will always be able to compile and use this version of Thinktool for free. The online service hosted at https://thinktool.io *may* eventually become a subscription service, but it's currently also free, and probably will be for a while.\n\n## Deployment\n\nThe application consists of three parts:\n\n1. Web client in `src/web`\n2. Node.js server in `src/server`\n3. Electron-based desktop client in `src/desktop`\n\nTo build the server, run `docker build . -f tools/Dockerfile -t thinktool` from\nthe top-level directory, and then run the `thinktool` image with the environment\nvariables listed below.\n\n### Static Resources\n\nTo build the web client, run `yarn install --frozen-lockfile \u0026\u0026 yarn build` from\nthe `src/web` directory. This will build the web client into `out/`, which can\nthen be deployed as a static website.\n\nBefore running this command, set the following environment variables:\n\n- `DIAFORM_API_HOST` \u0026mdash; API server host, including the protocol, e.g.\n  `https://api.thinktool.io`.\n- `THINKTOOL_ASSETS_HOST` \u0026mdash; Host for desktop client, including the protocol, e.g.\n  `https://assets.thinktool.io`.\n\n### Desktop\n\nThe desktop client can currently be built for Linux and Windows. We're planning\non supporting macOS in the future. It must be built on the same platform that is\nbeing targeted.\n\nStart by setting the following environment variables:\n\n- `DIAFORM_API_HOST` \u0026mdash; API server host, including the protocol, e.g.\n  `https://api.thinktool.io`.\n\nThen enter the `src/desktop` directory and run `yarn install --frozen-lockfile`.\nBuild the Linux client with `yarn bundle-linux` or the Windows client with\n`yarn bundle-windows`.\n\nWhen developing the desktop client, you can use this command to somewhat hackily\nuse the local build of the client package:\n\n    cp -r ../client/dist/* node_modules/@thinktool/client/dist/ \u0026\u0026 yarn bundle-linux\n\n### Server\n\nThe server uses a PostgreSQL database. Set the following environment variables\nbefore running the server:\n\n- `DIAFORM_POSTGRES_HOST` \u0026mdash; The hostname containing the database, e.g. `localhost`\n- `DIAFORM_POSTGRES_PORT` \u0026mdash; Port that the database is running on, e.g. `5432`\n- `DIAFORM_POSTGRES_USERNAME` \u0026mdash; Username used to authenticate with the PostgreSQL DB, e.g. `postgres`\n- `DIAFORM_POSTGRES_PASSWORD` \u0026mdash; Password used to authenticate with the PostgreSQL DB, e.g. `postgres`\n\nYou will need to manually set up the database schema. See `tools/db/_initialize.sql`, though this may be outdated.\n\nFor sending emails (used for \"Forgot my password\" functionality), we use [Mailgun](https://mailgun.com/). Configure the following environment variables:\n\n- `MAILGUN_API_KEY` \u0026mdash; API key\n\nAdditionally, the server expects the following environment variables to be set:\n\n- `DIAFORM_STATIC_HOST` \u0026mdash; Base URL of the server hosting static resources, e.g. `https://thinktool.io`\n\nBuild the server as a Docker image:\n\n    # docker build -t thinktool -f tools/Dockerfile .\n\nOnce you have the `thinktool` image, run it with the environment variables given above:\n\n    # docker run \\\n        -e DIAFORM_POSTGRES_HOST \\\n        -e DIAFORM_POSTGRES_PORT \\\n        -e DIAFORM_POSTGRES_USERNAME \\\n        -e DIAFORM_POSTGRES_PASSWORD \\\n        -e MAILGUN_API_KEY \\\n        -e DIAFORM_STATIC_HOST \\\n        -p 80:80 \\\n        thinktool\n\n#### Web client development\n\nTo develop the web client against the current client package, run:\n\n    $ yarn webpack --watch --config webpack.config.js\n\ninside the `client/` subdirectiory, and then from the `web/` directory, run:\n\n    $ yarn install --immutable\n    $ yarn build\n\nNow, to manually rebulid after each change (see under *Desktop* above for why this is necessary), run:\n\n    $ rm -r .next; cp -r ../client/dist/* node_modules/@thinktool/client/dist/ \u0026\u0026 yarn dev\n\nMake sure the environment variables described above are set correctly, and that the server is running, for example with:\n\n    $ docker run -ti --rm -p 9000:9000 \\\n        -e DIAFORM_POSTGRES_HOST \\\n        -e DIAFORM_POSTGRES_POST=5432 \\\n        -e DIAFORM_POSTGRES_USERNAME=postgres \\\n        -e DIAFORM_POSTGRES_PASSWORD \\\n        -e DIAFORM_STATIC_HOST=http://localhost:3000 \\\n        -e DIAFORM_PORT=9000 \\\n        c2d7fa/thinktool:latest \n\n### Static website\n\nThe website is built using [NextJS](https://nextjs.org/) and hosted using\n[Vercel](https://vercel.com/). It is automatically rebuilt from the `src/web`\ndirectory whenever the `website` branch is pushed.\n\nAs with the desktop client, there is a hacky solution for using the current\nlocal client package build while working on the website:\n\n    cp -r ../client/dist/* node_modules/@thinktool/client/dist/ \u0026\u0026 rm -r .next \u0026\u0026 yarn dev\n\n## Development\n\nWhile working on Thinktool, most changes should be made in the `src/client`\ndirectory, since this is the package that's used for both the web client and the\ndesktop client. Enter the `src/client` directory and run `yarn install --frozen-lockfile`\nand use `yarn webpack serve --open --config webpack.dev.js` to continually rebuild.\n\n### Releasing new client version\n\nWhen you are ready to push out a client-side update, run\n`tools/dev/release-client.sh \u003cclient-version\u003e`. This will bump the version number to\n`\u003cclient-version\u003e`, publish the package, and also update the relevant dependency in\nthe web and desktop clients.\n\nManually update the version number in the `package.json` for the `desktop`\npackage, commit the changes, tag the commit with a tag of the form `x.y.z` and\npush to GitHub. A workflow should automatically create a GitHub release; manually\nupdate this release with the release notes.\n\nNote that the tag should be the same as the desktop client version, while the\nversion number for the client package may be different!\n\n","funding_links":["https://ko-fi.com/jonashvid"],"categories":["others"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fc2d7fa%2Fthinktool","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fc2d7fa%2Fthinktool","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fc2d7fa%2Fthinktool/lists"}