TidGi is an privatcy-in-mind, automated, auto-git-backup, freely-deployed Tiddlywiki knowledge management Desktop note app, with local REST API. 「 太记 」是一个基于「 太微 TiddlyWiki 」的知识管理桌面应用,能保护隐私内容、高级自动化、自动Git云备份、部署为博客,且可通过RESTAPI与Anki等应用连接。(迭代开发中欢迎试用,开发进度见下方链接)(Under active development, see website below for details)
Find a file
lin onetwo 2a5eb349f2
Fix/misc bug (#686)
* refactor: replace time-window echo prevention with mtime+size and content checks

FileSystemWatcher: use recorded mtime+size (lastWriteStats) and saving-state
flag (titlesBeingSaved) to skip own-write echoes, plus content identity fallback.
Removes unreliable setTimeout-based exclude/scheduleFileInclusion.

ipcServerRoutes: replace TTL Map with synchronous Set (ipcPendingTitles),
attach changeCount as revision to change Observable.

ipc-syncadaptor: use lastSavedRevisions for revision-based echo prevention,
batch large syncs via requestIdleCallback.

Also: EditWorkspace controlled input fixes, port field local state, agent
framework config setConfig/persistConfig split, misc value ?? '' fixes.

* Enhance e2e screenshots and test logging

Improve end-to-end test reliability and diagnostics:

- Capture window screenshots for non-BrowserView steps: add captureWindowScreenshot and use it in AfterStep to capture the Electron BrowserWindow via webContents.capturePage() when appropriate; keep existing captureScreenshot for BrowserView steps. (features/supports/webContentsViewHelper.ts, features/stepDefinitions/application.ts)
- Prevent wiki restart race: wait for the wiki worker '[test-id-WIKI_WORKER_STARTED]' marker before restarting to avoid DoubleWikiInstanceError. (features/stepDefinitions/wiki.ts)
- Make git-related test markers more visible by switching logger.debug → logger.info for git init/commit/sync/checkout/revert and git-log rendering markers, ensuring e2e tests can reliably detect these events. (src/services/git/index.ts, src/windows/GitLog/useGitLogData.ts)
- Minor feature test tweak: wait for page to load in defaultWiki.feature before interacting with the editWorkspace window.

These changes reduce flaky screenshots and timing races in tests and improve test marker visibility for e2e detection.

* Enhance e2e screenshots and test logging

Improve end-to-end test reliability and diagnostics:

- Capture window screenshots for non-BrowserView steps: add captureWindowScreenshot and use it in AfterStep to capture the Electron BrowserWindow via webContents.capturePage() when appropriate; keep existing captureScreenshot for BrowserView steps. (features/supports/webContentsViewHelper.ts, features/stepDefinitions/application.ts)
- Prevent wiki restart race: wait for the wiki worker '[test-id-WIKI_WORKER_STARTED]' marker before restarting to avoid DoubleWikiInstanceError. (features/stepDefinitions/wiki.ts)
- Make git-related test markers more visible by switching logger.debug → logger.info for git init/commit/sync/checkout/revert and git-log rendering markers, ensuring e2e tests can reliably detect these events. (src/services/git/index.ts, src/windows/GitLog/useGitLogData.ts)
- Minor feature test tweak: wait for page to load in defaultWiki.feature before interacting with the editWorkspace window.

These changes reduce flaky screenshots and timing races in tests and improve test marker visibility for e2e detection.

* Use startTransition to update port on change

Import startTransition from React and update the port input handler to capture the raw value, update local display state, and defer parsing/setting the workspace port inside startTransition. The handler now parses an empty value as 0, validates the number (non-NaN and >= 0) before calling workspaceSetter, improving responsiveness by marking the workspace update as non-urgent. Also removed an obsolete inline comment.

* Improve E2E, view sync, and wiki IPC robustness

Multiple fixes and improvements across E2E tests, view management, wiki IPC, and workspace handling:

- Docs: add SHOW_E2E_WINDOW env var note to allow visible Electron windows during manual E2E runs.
- Features: simplify/adjust cross-window sync scenario and refine hibernation workspace selectors to avoid collisions with similarly named workspaces.
- E2E steps: make AI-request assertion resilient by polling (backOff); replace brittle DOM-driven tiddler creation with direct TiddlyWiki API calls in browserView step definitions for reliability; add small UI click pause and longer click timeout in ui steps.
- Timeouts: unify global timeout to 25s and derive Playwright short/log wait timeouts from it.
- WebContents helpers: prefer the last child wiki view (active one) when multiple views exist and update comments.
- WikiEmbedTabContent: wake workspace on mount and simplify cleanup to always clear custom bounds on unmount; handle errors.
- Chat UI: hide TabListDropdown in split view.
- Agent instances: default missing agentFrameworkID to 'basicPromptConcatHandler' for older definitions.
- View service: add activelyShownViews set to avoid hiding views that were explicitly shown via showView(); clear stale custom bounds when showing views; avoid moving views offscreen when actively shown; ensure cleanup removes active flag.
- IPC server routes: prefer URL-based workspace ID (resolve correct casing via workspace service) to handle cross-session routing; pass effective workspace ID to route handlers.
- Wiki service: add startup timeout to avoid indefinite hangs waiting for worker boot message.
- IPC sync adaptor: implement titlesBeingSaved/titlesBeingLoaded sets to prevent save-back and SSE echo issues; mark titles when saving/loading and suppress spurious saves.
- Wiki worker IPC routes: replace per-subscriber addEventListener with a shared Subject and single change listener to avoid missed events and cross-window sync bugs; forward subject events to subscribers and log readiness.
- Windows: keep windows hidden during tests by default but allow showing them when SHOW_E2E_WINDOW=1.
- Workspaces: compute next insert order so new wiki workspaces appear at the top of regular workspaces (shift others down).

Overall these changes reduce flakiness in tests, prevent cross-window echo and routing bugs, make view lifecycle handling safer, and improve developer ergonomics for debugging E2E runs.

* fix(e2e): bypass system proxy for git HTTP operations in sync test

Git clone/push/fetch to localhost was routed through the system proxy (port 1080),
which returned 502 Bad Gateway. Add -c http.proxy= to disable proxy for all
HTTP git commands in the sync test step definitions.

* fix: address CI lint errors and Copilot review comments

Lint fixes:
- useOptimisticField: rename *Ref/*Fn vars to *Reference/*Function (unicorn/prevent-abbreviations)
- wiki/index: rename args to arguments_ (unicorn/prevent-abbreviations)
- FileSystemWatcher: use specific type assertion for tiddler fields to avoid no-base-to-string warning
- webContentsViewHelper: rename loop var i to index
- interface.ts: merge duplicate imports from same module (dprint)
- ipc-syncadaptor: expand queueMicrotask callback (dprint)

Copilot review fixes:
- ipcServerRoutes: move subscription to outer scope so Observable teardown
  is returned synchronously from the constructor, preventing subscription leaks
  when observers are disposed before the async IIFE resolves
- useOptimisticField: capture localValue at focus time; on blur only commit
  when user actually changed the value (not when serverValue updated while focused)
- FileSystemWatcher.markSaveComplete: guard scheduleGitNotification behind
  non-empty absoluteFilePath to avoid spurious git notifications on error paths

* fix(e2e): handle corrupt settings.json in cleanup and use filechooser intercept for image upload

- tidgiMiniWindow cleanup: wrap readJson with try/catch so truncated/empty
  settings.json (race between app shutdown write and After hook read) is
  handled gracefully instead of throwing SyntaxError

- application.ts: add 'I prepare to select file ... for file chooser' step
  that registers a Playwright one-shot filechooser handler BEFORE the click
  that triggers fileInput.click(). This prevents the native OS dialog from
  appearing entirely (the chooser is resolved directly with the supplied file).

- talkWithAI.feature: replace two-step 'click then setInputFiles' with the
  new 'prepare filechooser  click' pattern so no OS dialog is shown during
  the AI image attachment test
2026-03-12 21:19:10 +08:00
.github Feat/discuss note with agent (#685) 2026-03-09 04:07:39 +08:00
.vscode Fix/sync sub wiki (#672) 2025-12-17 22:08:26 +08:00
build-resources Feat/mini window (#642) 2025-10-21 20:07:04 +08:00
docs Fix/misc bug (#686) 2026-03-12 21:19:10 +08:00
features Fix/misc bug (#686) 2026-03-12 21:19:10 +08:00
localization Feat/discuss note with agent (#685) 2026-03-09 04:07:39 +08:00
packages/tidgi-shared Expose TidGi services to $tw.tidgi and add types 2026-02-10 02:41:32 +08:00
patches Feat/Native AI Agent (#640) 2025-10-10 17:16:56 +08:00
scripts Fix workspaceID case bug, esbuild outbase, autocomplete panel re-render, VIEW_LOADED handler, streaming status polling, and increase executeInBrowserView timeout for E2E stability. All 52 scenarios pass 2026-02-21 12:36:58 +08:00
src Fix/misc bug (#686) 2026-03-12 21:19:10 +08:00
template update templatw wiki 2026-03-07 15:34:02 +08:00
.editorconfig refactor: initial transform to ts 2020-12-19 22:33:59 +08:00
.env feat: add SKIP_PREFLIGHT_CHECK=true to skip silly react check 2020-08-22 19:36:24 +08:00
.gitattributes Create .gitattributes 2021-07-08 23:23:59 +08:00
.gitignore Fix/misc bug (#677) 2026-01-20 11:11:28 +08:00
.gitmodules refactor: make template wiki a git submodule 2021-09-09 00:16:43 +08:00
.npmrc Feat/Native AI Agent (#640) 2025-10-10 17:16:56 +08:00
.nvmrc chore: upgrade deps 2024-11-24 16:59:21 +08:00
.pnpmfile.cjs Feat/Native AI Agent (#640) 2025-10-10 17:16:56 +08:00
dprint.json fix: dprint conflict 2023-05-19 11:06:29 +08:00
eslint.config.mjs Feat/discuss note with agent (#685) 2026-03-09 04:07:39 +08:00
forge.config.ts Fix/start error (#654) 2025-11-20 17:17:11 +08:00
forge.env.d.ts Feat/Native AI Agent (#640) 2025-10-10 17:16:56 +08:00
index.html Feat/Native AI Agent (#640) 2025-10-10 17:16:56 +08:00
LICENSE Initial 2019-08-30 11:41:23 +07:00
package.json Feat/discuss note with agent (#685) 2026-03-09 04:07:39 +08:00
pnpm-lock.yaml Feat/discuss note with agent (#685) 2026-03-09 04:07:39 +08:00
pnpm-workspace.yaml feat: publish tidgi-shared npm for types, and place tidgi.service 2026-02-09 23:16:49 +08:00
PrivacyPolicy.md refactor: rename tiddlygit to tidgi in code 2021-12-18 13:16:26 +08:00
README.md Feat/Native AI Agent (#640) 2025-10-10 17:16:56 +08:00
reviewpad.yml feat: add reviewpad.yml file 2023-07-04 20:29:50 +08:00
tsconfig.json Feat/allow watch fs change on git sync 2025-10-31 02:00:40 +08:00
tsconfig.test.json Feat/Native AI Agent (#640) 2025-10-10 17:16:56 +08:00
vite.main.config.ts Feat/discuss note with agent (#685) 2026-03-09 04:07:39 +08:00
vite.preload.config.ts Feat/Native AI Agent (#640) 2025-10-10 17:16:56 +08:00
vite.renderer.config.ts Fix/edit agent and several bugs (#670) 2025-12-15 17:33:59 +08:00
vite.worker.config.ts Feat/Native AI Agent (#640) 2025-10-10 17:16:56 +08:00
vitest.config.ts Feat/discuss note with agent (#685) 2026-03-09 04:07:39 +08:00

TidGi

Customizable personal knowledge-base with git as backup manager and blogging platform.

License: MPL 2.0 GitHub Actions Build Status Lin Onetwo! Power by tiddlywiki!


Pronounce: Same as Tai Chi /ˌtaɪ ˈtʃiː/

🇬🇧 English | 🇨🇳 简体中文

ShowCases And Demo

Demo

Screenshot

Screenshot of main-window

Load NodeJS Wiki
Screenshot of main-window
Create Local Wiki Clone Online Wiki
Screenshot of add-workspace Screenshot of clone-workspace
Translation, Preferences
Screenshot of preference
Interactive code
Screen recording of zx-script in tiddlywiki
Community Plugin Library
Screenshot of add-workspace
For mac users, since I haven't buy Apple developer key yet, so you have to entrust App to open it, click here to expand details.◀

First of all, you need to drag this App into Applications folder! Otherwise there will be an error.

Click "Cancel" ↓

step00001

step00002

step00003

Click "Open" ↓

step00004

Click "OK" ↓

step00005

No English posts yet...Please help sharing!

About TidGi-Desktop

TidGi is a cross-platform Note Taking & GTD & Fragment Knowledge Management desktop app powered by nodejs-TiddlyWiki, it ship with a lot of tiddlywiki plugins from the TiddlyWiki community.

You can call it TG-Note, it is totally free and you own all your data. Code by the people, build for the people.

It used to named TiddlyGit, means TiddlyWiki with easy Git backup, short for TidGi now.

Download

Packaging status

For Windows MacOS normal user

Download
GitHub Releases

For arch user

yay tidgi

For MacOS CLI user

brew install TidGi # Not tested

Mobile App

  • TidGi-Mobile is the official pair with TidGi-Desktop, developed by @linonetwo, fast for 100MB+ wiki.
  • See Tiddloid for Android App developed by @donmor. Good for smaller wiki, and you can have access to your HTML wiki.

You can switch between them, and sync data between them and TidGi at any time. All of them are local-first, open-sourced and compatible with TiddlyWiki ecosystem.

Data Privacy Protection

You can choose storage provider for your wiki workspace:

  1. "Github" as unlimited storage and gh-pages blogging platform.
  2. "Local" will create a local git repo for you, you can use GithubDesktop to sync manually.
  3. "Gitlab" and "Gitee" is on the way

Differences

Differences from TiddlyDesktop?

  1. NodeJS version of TiddlyWiki have seamless auto-save experience, which is taking the advantage of SyncAdaptor instead of Saver, TG have better support for NodeJS wiki
  2. Using NodeJS wiki, We can have separated tiddler files, which can be modified by hand, or by other programs (e.g. VSCode with VSCode-TW5-Syntax)
  3. Though TiddlyDesktop can also load wiki folder generated by nodejs-TiddlyWiki, TG can backup that folder to the Github easily
  4. With the Electron technology, we can use fs, git and many other nodejs things within TiddlyWiki, which greatly extend the hackability, which is the reason why I choose TiddlyWiki as my daily KM tool

Why Github?

Because Github is one of the best free civil level BaaS:

  1. Its storage is basically free, allow us to store unlimited images and PDF files, which can have permanent URIs for public download
  2. It has GraphQL API that allow us programmatically update our wiki
  3. It has free CI to automatically deploy our TiddlyWiki blog
  4. It provides unlimited repository, public and private, which enables us to store private content into our TiddlyWiki

Development

Read Dev doc for details.

Credits

The desktop app shell is based on https://github.com/atomery/singlebox and atomery/webcatalog, they provide lots of utils around website-generated-app, much powerful than generating app from website simply using Chrome. Also the independent developer @quanglam2807 behind these great tools helps me a lot when I develop TidGi.

Current Icon is download from iconsdb under Creative Commons Attribution-NoDerivs 3.0 , if you are a designer, please feel free to contribute your ICON if you have a better idea.

Stargazers over time

Please give a star if you like it!

Stargazers over time