These are the features I'd like in a wiki / personal knowledge engine:

- Not a service. This has to be durable and portable.

- Backed primarily by git and plaintext files, not a database. Explorable and manageable on the filesystem.

- Markdown

- Hyperlinks to articles that show up red if the page doesn't exist (yet). If a page is renamed, all hyperlinks to it must automatically update.

- Multiple tags / categories can be added to any page. Bonus if it supports hierarchical categories. These get indexed and can be bulk managed. When pages are updated and their tags change, the system automatically handles the bookkeeping.

- Indexed fuzzy search better than grep

- Server + browser interface (mobile friendly). It should also support editing from the browser and saving back to git.

- Native desktop app. Less important, but also enforces that git, files, and a simple set of indices are the core data model.

- Sync over git / github with easy diff fixing

- Publish to a public or private website. Bonus if statically rendered snapshots are supported.

- Despite all of the ancillary indices and support mechanisms, it must remain CLI/vim editing friendly. Indexes and links should update as a post commit hook or async job

- Images and media can be uploaded to a secondary service that handles indexing, hosting, backups, and thumbnail generation. This is a whole set of concerns all on its own.

tl;dr: git + markdown data model with a bunch of bookkeeping, indexing, and tooling on the side

I haven't found a good fit yet, but I haven't explored the entire space. I might just write it one of these days.

Definitely looking for recommendations!

Edit: thanks for the suggestions! :)

I mentioned this in another subthread, but have you checked out Obsidian [1]?

- It's a product, not a service (they do offer their own paid syncing service though)

- It is backed by plaintext: markdown files in folders. As for Git, I'm pretty sure you could use it easily- and I noticed there's also a community-supported Git integration plugin [2].

- Just tested link renaming, it's there.

- It does have a tagging system. I haven't used it extensively enough to see if the rest of your requirements are met, but it seems very thorough.

- The desktop and mobile clients do support full-text search. Not sure how it's indexed but it is quite fast.

- Server + browser interface: unfortunately, it doesn't look like this is the case out of the box, but since the files are Just Markdown On A Filesystem I feel like you could probably just have a completely unrelated server to make changes to them.

- Native desktop app: hate to break the news, but the desktop app is Electron. That being said, it's extremely snappy and doesn't seem like a complete memory hog. (A cursory check of Activity Monitor says it's got four processes running, using 127 MB, 73 MB, 55MB, and 11.8MB.)

- Sync over git/github- again, community supported, but the plugin [2] looks quite solid and offers plenty of the kind of features you might like. I would also note that because everything's just Markdown files, other syncing mechanisms like Dropbox or iCloud "just work". They have a mobile app as well, and seamless iCloud syncing has been the killer feature for me.

- Publishing is an interesting one. They do have a paid service which allows you to "publish" vaults, which basically means they do the static rendering and then host it for you. It looks like their static rendering gives the published version of a vault a "table of contents" pane and other stuff. I imagine it wouldn't be too tricky to do this oneself, and you could possibly even integrate it into the editor.

- So, CLI/Vim editing works like a dream. I just edited a file from Vim and immediately saw it updated in the desktop and mobile apps. Updating backlinks works in the app just fine, but simply moving files around in the filesystem doesn't update backlinks.

- Yeah, this kinda is a whole concern of its own, but for what it's worth: images and media are stored in the same directory structure as Markdown files, and can be embedded into a "note" via linking. (like ![[imagename.jpg]]). So I imagine you could keep them in a separate directory that's gitignored or something like that.

1: https://obsidian.md/

2: https://github.com/denolehov/obsidian-git