Introducing 'ta', a The Archive-compatible Zettelkasten exploration tool for coding agents
ta is a The Archive-like search command-line tool for your Zettelkasten.
Install from https://codeberg.org/ctietze/ta by downloading the tar compressed binary, or the installer .pkg file -- your choice!
(GitHub Mirror at our organization https://github.com/Zettelkasten-Method/ta )
Its intended use is to help with scripting, but also with coding agents (Claude, Codex, Gemini, Grok, Cursor, AMP, ...) to browse your notes.
Command-Line Interface
The command-line tool is simple enough and self-documenting for agents to fiddle with it:
$ ta
OVERVIEW: Zettelkasten retrieval CLI for coding agents.
EXAMPLES:
Find notes by tag, expand 1 hop along wiki-links:
ta search --tag learning --depth 1
AND-combine predicates (tag + phrase + whole word):
ta search --tag thinking --phrase "second-order" --word inversion
Positional phrase shortcut:
ta search "mental models" --depth 2
Tag-only convenience:
ta tag thinking --depth 2
Print one or more notes (frontmatter + raw markdown):
ta show "202503091430 Mental Models.md"
Archive path resolution (highest precedence first):
1. --archive PATH — flag on a subcommand (search, tag, or show)
2. TA_DIR — environment variable
3. archive: PATH — key in ~/.config/ta/config.yaml
USAGE: ta <subcommand>
OPTIONS:
--version Show the version.
-h, --help Show help information.
SUBCOMMANDS:
search Search the Zettelkasten with AND-combined predicates.
tag Search for notes carrying a specific hashtag (convenience for 'search --tag').
show Print the full body of one or more notes.
See 'ta help <subcommand>' for detailed help.
Agent Skills
The real value for users of The Archive is in agent skills. You already have the app, why deal with an inferior experience
But agents don't so they'll benefit.
The repository contains copy-paste-able agent skills in the canonical format of https://agentskills.io/
Find the list here for your convenience:
https://codeberg.org/ctietze/ta/src/branch/main/docs/skills
LLMs and coding agents by extension are good for coming up with similar word searches, and the skills are meant to trigger this capability; see the deep research example below.
Fiddle with the skills, or write your own ones; there's no reason to be precious about these Markdown files. I'm experimenting with the ones I have for a while and report back and invite you to do so, too!
Author at Zettelkasten.de • https://christiantietze.de/
Howdy, Stranger!
Comments
Deep research examples
Some technical connections
Here's a test run dumped from Claude for
deep research my zk for RAG and vector db'sbefore I renamed the tool fromzk-llmtota, hence the weird names in the bash commands:❯ deep research my zk for RAG and vector db's ⏺ Skill(zk-llm-deep-research) ⎿ Successfully loaded skill ⏺ I'll start with a broad search to find seed notes on RAG and vector databases. ⏺ Bash(swift run zk-llm search "RAG" --depth 1 2>&1 | tail -80) ⎿ [0/1] Planning build Building for debugging... [0/3] Write swift-version--6CDFB4424A1E79B2.txt … +26 lines (ctrl+o to expand) ⏺ Bash(swift run zk-llm search "vector" --depth 1 2>&1 | tail -80) ⎿ snippet: "as a result. (stdin to file) Mermaid, graphviz. LaTeX for vector renditions of formulae. There could be more use cas" tags: [] … +58 lines (ctrl+o to expand) ⏺ Bash(swift run zk-llm search "embedding" --depth 1 2>&1 | tail -80) ⎿ snippet: "Look at Backlinks[[202503100826]] and especially structure s embedding the note you change to make sure that the link co" tags: [zettelkasten, api] … +60 lines (ctrl+o to expand) ⏺ Good — I've found the hub notes. Let me read the core ones and look for adjacent concepts like hybrid search. ⏺ Bash(swift run zk-llm show "202603280645 Zettelkasten and RAG.md" "202603280646 RAG Retrieval-Augmented Generation.md" "202603280655 RRF Reciprocal rank fusion.md" 2…) ⎿ Building for debugging... [0/3] Write swift-version--6CDFB4424A1E79B2.txt Build of product 'zk-llm' complete! (0.13s) … +90 lines (ctrl+o to expand) ⏺ Bash(swift run zk-llm tag rag --depth 2 2>&1 | tail -60) ⎿ Building for debugging... [0/3] Write swift-version--6CDFB4424A1E79B2.txt Build of product 'zk-llm' complete! (0.12s) … +26 lines (ctrl+o to expand) ⏺ Let me quickly check the BM25 and tf-idf notes since they're referenced often. ⏺ Bash(swift run zk-llm show "202412071858 Search ranking with tf-idf term frequency -- inverse document frequency.md" "202412071908 BM25 search ranking.md" 2>&1 | ta…) ⎿ Building for debugging... [0/3] Write swift-version--6CDFB4424A1E79B2.txt Build of product 'zk-llm' complete! (0.12s) … +34 lines (ctrl+o to expand) ⏺ I have enough to synthesize. No standalone "vector database" note — your thinking treats vectors as one retrieval mechanism among several. Your thinking on RAG and vector databases The cluster is small and intentional — five notes, written mostly in late 2024 and March 2026, that frame RAG as an architectural pattern and vector search as one pluggable retrieval option inside it rather than the defining feature. Three themes: 1. RAG as a three-stage architecture, with retrieval as the pluggable middle. - 202603280646 RAG Retrieval-Augmented Generation.md — defines the indexing → retrieval → generation pipeline, and explicitly separates the mechanism from the architecture. Vector embeddings are the common choice, but lexical (tf-idf, BM25, SQLite FTS5) "can serve as the retrieval backend." - You note the vector trade-off directly: higher compute, reduced debuggability — in exchange for cross-lingual / semantic hits ("knowledge cycle" matching "Wissenszyklus"). 2. Hybrid search, fused by RRF, is the production answer. - 202603280655 RRF Reciprocal rank fusion.md — you chose RRF because it sidesteps the score-normalization problem (BM25 unbounded, cosine 0–1) by ranking-only fusion. The k=60 dampening makes it so a document has to appear across methods to win. This is a quietly strong claim: you don't think vector search alone is enough. - 202412071908 BM25 search ranking.md and 202412071858 … tf-idf.md — the lexical half of hybrid. You keep the older Zac Romero (EmacsConf 2024) lineage alive here, which is why your RAG notes reach for BM25 as a first-class peer to embeddings. 3. The Zettelkasten/RAG mapping — and where each has blind spots. - 202603280645 Zettelkasten and RAG.md is the synthesis hub. You draw a table aligning atomicity ↔ chunking, tags ↔ lexical index, links ↔ graph retrieval, structure notes ↔ parent-document retrievers, synthesis ↔ generation, GIGO ↔ garbage retrieval. - Your sharpest claim lives here: hand-curated structure notes encode intentionality that embedding similarity cannot replicate. The inverse is equally honest — vector search finds unlinked cross-cluster connections a Zettelkasten has no edge for. You even propose the experiment: embed everything, query with vector search, diff against structure-note traversal. The delta is the research question. The thread connecting all three: you treat vector similarity as a complement, not a replacement — for lexical ranking (via RRF), and for human-authored links (via the ZK↔RAG mapping). The consistent move is skepticism toward any single retrieval signal. Gaps worth noting: no standalone note on vector databases as infrastructure (FAISS, pgvector, HNSW, chunking strategy, embedding model choice). If you want one, 202603280646 is the natural parent to link from. ✻ Crunched for 1m 7sHigher-level stuff
Another example for
deep research my zettelkasten for connections of software architectute and Zettelkasten patterns❯ deep research my zettelkasten for connections of software architectute and Zettelkasten patterns ⏺ Skill(ta-deep-research) ⎿ Successfully loaded skill ⏺ Bash(ta --help 2>&1 | head -50) ⎿ OVERVIEW: Zettelkasten retrieval CLI for coding agents. EXAMPLES: … +25 lines (ctrl+o to expand) ⏺ Bash(ta search "software architecture" --depth 1 2>&1 | head -100) ⎿ - ref: "201606161929 ReSwift doesn't impose architectural constraints. md" title: "ReSwift doesn't impose architectural constraints" … +45 lines (ctrl+o to expand) ⏺ Bash(ta search --phrase "Zettelkasten" --phrase "software" 2>&1 | head -80) ⎿ - ref: "201009241818 Introducing Notational Velocity with MultiMarkdow n support.md" title: "Introducing Notational Velocity with MultiMarkdown support" … +108 lines (ctrl+o to expand) ⏺ Bash(ta search --phrase "pattern language" --depth 1 2>&1 | head -80) ⎿ - ref: "202501301159 § Pattern Language for Zettelkasten.md" title: "§ Pattern Language for Zettelkasten" snippet: "https://notes.andymatuschak.org/z79rMNNuLrUj6R8q1CXSpDm … +120 lines (ctrl+o to expand) ⏺ Bash(ta show "202501301159 § Pattern Language for Zettelkasten.md" "202209211603 § Zettelkasten for programmers.md" "202210081852 Complexity is required in code base…) ⎿ --- ref: "202501301159 § Pattern Language for Zettelkasten.md" title: "§ Pattern Language for Zettelkasten" … +391 lines (ctrl+o to expand) ⏺ Bash(ta show "202501301159 § Pattern Language for Zettelkasten.md" 2>&1 | tail -250) ⎿ - Solution: Write your notes so that they can be composed with other n otes into new texts, making each note a movable text fragment. - Movable type made it possible to assemble pages from smaller pie … +250 lines (ctrl+o to expand) ⏺ Bash(ta show "202209211603 § Zettelkasten for programmers.md" "202210081852 Complexity is required in code bases and Zettelkasten alike.md" 2>&1) ⎿ --- ref: "202209211603 § Zettelkasten for programmers.md" title: "§ Zettelkasten for programmers" … +93 lines (ctrl+o to expand) ⏺ Bash(ta show "202404061208 Avoid implicit themes in your Zettelkasten.md" "202308011922 Locality of change in software.md" "202406132000 Structure vs Process in Zett…) ⎿ --- ref: "202404061208 Avoid implicit themes in your Zettelkasten.md" title: "Avoid implicit themes in your Zettelkasten" … +116 lines (ctrl+o to expand) ⏺ Bash(ta show "202210171300 Zettelkasten as API needs entry points.md" "202111291403 Gall's Law working systems always start simple.md" "202403141330 Zettelkasten tra…) ⎿ --- ref: "202210171300 Zettelkasten as API needs entry points.md" title: "Zettelkasten as API needs entry points" … +51 lines (ctrl+o to expand) ⏺ Software architecture ↔ Zettelkasten in your archive Your thinking on this maps cleanly to four themes, all orbiting one big synthesis note. 1. Christopher Alexander is the explicit bridge. The centerpiece is a deliberately-constructed pattern language: - 202501301159 § Pattern Language for Zettelkasten.md — your largest §-note on the topic. Quotes Alexander 1977, organizes Zettelkasten patterns largest-to-smallest (Zettelkasten → Departments → Structures → Notes → Content → Language → Technology), and lifts pattern names straight from software: "Single Responsibility, Separated Concerns", "Boy Scout Rule", "Immutable Storage", "Rule of Three", "Algorithmic Solutions", "Signal vs Noise Ratio". - 202503090539 Cockburns medical pattern language metaphor components.md — Cockburn's Patterns of Project Management as another import of Alexander's grammar. 2. Software antipatterns port to Zettelkasten antipatterns. - 202404061208 Avoid implicit themes in your Zettelkasten.md — explicitly maps the "incidental data structure" programming antipattern onto your Zettelkasten; proposes "Concept-Free Note-Taking" by analogy to Concept-Free Programming. Heuristic: lack of an address is an indicator the idea isn't expressed directly. - 202308011922 Locality of change in software.md → reused as the structural basis for "Single Responsibility, Separated Concerns" in the pattern-language note. SRP is about change, not essence; atomicity of a Zettel is the knowledge-system analogue. 3. Structure/Process as a unifying principle across both. - 202209232058 Struktur und Prozess von Strukturen und Prozessen in der Programmierung.md — treats Structure×Process as a cross-product applicable to code (static/runtime, module boundaries shifting over coding time) and equally to knowledge work. - 202406132000 Structure vs Process in Zettelkasten for Programmers.md — Atom/Molecule/Organism granularity (Zettel / Structure Note / Project), plus Rule-of-Three extraction before refactoring into a shared theme. - 202111291403 Gall's Law working systems always start simple.md — complexity evolves from a simple working seed, applied to both codebases and Zettelkästen. 4. Zettelkasten as black-box software system. - 202210171300 Zettelkasten as API needs entry points.md — departments are black boxes; structure notes are published API; readers (future-you) interact through curated entry points. - 202209211603 § Zettelkasten for programmers.md — the programmer-facing hub. Ties it together: "Tame complexity like a programmer … Make implicit structures visible with structure notes, similar to extracting a service object." - 202210081852 Complexity is required in code bases and Zettelkasten alike.md — the one-liner version: you don't see benefits of a software architecture before the complexity crosses a threshold — same for a Zettelkasten. The connecting thread visible in the bodies: you treat the Zettelkasten as a long-lived software system. Alexander's pattern grammar (Context/Problem/Forces/Solution/Related) gives the shared formal vocabulary, and programming principles port because both must scale complexity sustainably: SRP ⇢ atomicity, locality of information ⇢ movable text fragments, immutability ⇢ stable addresses, boy-scout rule ⇢ malleable notes, Gall's Law ⇢ start simple and grow, black-box encapsulation ⇢ department entry points. The explicit claim in § Pattern Language for Zettelkasten is that the language itself is the deliverable — a shared vocabulary for people designing tools for thought. If you want to push further, two probes I did not follow: (a) 202308241058 Concept-Free Programming.md paired with the antipattern note, and (b) the "Value Creation in Zettelkasten" / Feynman's Darlings chain from 202406132000, which looked like it connects to a product-engineering frame you haven't fully laid out yet. ✻ Worked for 1m 33sObservations
One thing that sticks out is the limit to
| head -80, limiting the output of searches to 80 lines where each search result takes up a couple of lines can easily miss details.Ideas to improve this:
jsonloneliners, so a limit of 80 would produce 80 results, which is better than ~20 or so you get nowThat's probably Claude Opus 4.7 trying to be clever and save tokens 🤔
Author at Zettelkasten.de • https://christiantietze.de/
Deep Research with GPT-5.4 High Thinking using
piI really really really like the
piagent harness. It's barebones, but you just ask it to create the features you need, and then it happily augments itself. Malleable software! It's a joy to work with.Same prompt as above, including the typo I just noticed now
Since Anthropic killed Claude subscription access outside of their products, I'm using OpenAI here to test everything. The output export is super detailed in comparison to Claude's command line output by default, and GPT is much wordier without a harness making it summarize the findings. See below for the final result.
At the end, GPT-on-pi suggested to create artifacts from the results:
I ordered all three suggestions (attached to this post for you to peek at). The concept map was just another Markdown file, so I then ordered a PNG via graphviz:
Let's just say that @Edmund's graphs look nicer
GPT-on-pi's rather long result
Author at Zettelkasten.de • https://christiantietze.de/
The LLM output here sounds to me like someone who knows @ctietze's thinking.
I removed the link when editing my post by accident, here are the 3 artifacts in text form:
https://gist.github.com/DivineDominion/593e1f6b3412148617368e12f9a6121c
@Andy it does sound somewhat insightful and detailed, and well, it's wordy at least! Was a surprise to read this kind of output, because it's not in my Zettelkasten. And some (obvious in hindsight) connections aren't expressed as cleanly -- like how the similarity of a Zettelkasten and API design fit well with "not everything needs to be public" (in programming) and by conversion not every note needs to be an entry point in the Zettelkasten.
So far it's not a waste of time to use this, but GPT's tendency to be so verbose can quickly turn into getting tired of dealing with the output
Author at Zettelkasten.de • https://christiantietze.de/
Deep research, same prompt, Mistral Vibe using devstral-2
Mistral is a EU provider of LLM services -- apparently heavily subsidized, as they're giving away access to their coding agent for free (!!!!) with some reasonable rate limits.
Mistral replies fast.
If you want to experiment with coding agents, I recommend to set up a Mistral account and then download the
vibeCLI and use that for a taste.Same prompt as above, including the typo:
The reply:
Author at Zettelkasten.de • https://christiantietze.de/