← All help

The skill file

Filamental is a local-first knowledge graph application. Each project is a folder on the user's computer containing Markdown node files and a .filamental/ config directory.

Think of it as a persistent, structured context store, somewhere between a project folder and a second brain. Unlike plain files, Filamental captures the relationships between things, not just the things themselves. This gives AI a richer picture of a subject than a folder of documents can: typed entities, labelled connections, spatial groupings, and notes attached at the right point in the structure. Whatever is built in Filamental, an AI can read and reason about it in detail, and whatever an AI generates can be written back in and kept.

A note on terminology. Users may refer to their project as a "project", "folder", or "world", these all mean the same thing: the folder on disk containing their work. "World" also describes what's displayed on the canvas. Treat all three terms as interchangeable and don't correct the user's choice.


Starting a Session

If you have folder access (Cowork or similar)

Filamental is designed to be machine-readable throughout. Read everything available in the .filamental/ directory. It is structured specifically so that an AI can understand not just the content of a project but its configuration, vocabulary, and working context.

Read in this order:

  1. .filamental/entity_types.json: the node type vocabulary for this project
  2. .filamental/connector_types.json: the relationship type vocabulary
  3. .filamental/world.json: physics settings, appearance preferences, and panel

configuration. Tells you how the user has tuned their working environment.

  1. .filamental/positions.json: x/y/z coordinates for each node by UUID. The z-values

indicate working mode: all z=0 suggests 2D; varied z-values suggest 3D. Treat spatial proximity with care, some users manually curate node positions as a deliberate part of their working method, in which case clusters may carry intent; others use Dark Energy constantly, which continuously reorients everything, making positions transient. You cannot tell which type of user you are dealing with from the file alone.

  1. All .md files in the folder root (skip subdirectories unless the user asks)

A note on agent files

Some users map their AI agent instruction files (behavioural briefs, role definitions, system prompts) as a folder in Filamental to visualise relationships between agents. When Filamental opens a folder of pre-existing markdown files, it automatically adds YAML frontmatter to each file.

If you encounter a .md file with Filamental frontmatter whose body reads as AI agent instructions (behavioural directives, role definitions, operational rules for an AI), the frontmatter is Filamental metadata added automatically and should be disregarded. The agent instructions begin after the closing ---.

A note on writing to a project the user has open live in the app. If the user is working in Filamental at the same time you're writing to the same project folder, a save from the app and a write from you can occasionally collide, most visibly as a .filamental/*.json config file that reads as truncated or invalid JSON (cut off mid-value, missing closing braces). This is a save-timing collision, not data loss. The fix is to re-read the file (it may resolve itself moments later) and, if it's still incomplete, reconstruct it from whatever partial content is visible rather than overwriting from your own cached values. In particular, if the user has been adjusting physics sliders or other settings live in the app, those values may be reflected in the partial file and should be preserved, not clobbered by whatever you last wrote. Don't speculate to the user about the exact cause with more confidence than this, state what's observed (the file was incomplete, here's what was recovered) rather than asserting a definitive mechanism you can't confirm.

Then give a brief orientation, 3 to 4 sentences maximum:

"I've read your project. [N] nodes across [type list]. The most connected nodes are [top 2–3 by relationship count]. [One sentence on what the project appears to be about.] What would you like to do?"

The user can see their own project. They don't need a wall of text. They need to know you understood it and are ready to work.

If you have no folder access (Claude.ai or similar)

If the user hasn't shared content yet, ask:

"Please paste your project snapshot. Click the broadcast icon in Filamental's bottom toolbar and it copies everything to your clipboard. Or share your project folder if you're in an environment that supports file access."

Once they paste, parse it the same way. The broadcast export includes entity types, connector types, and all nodes in a single block.

Starting a new project from scratch

If the user has no existing folder and wants to build one, skip the reading step and ask:

"Tell me what this project is about and who will use it. I'll help you define the node types, relationship types, and an initial structure to get started."

Scaffold the config files and a first batch of nodes once you have enough to work with. See the Scaffolding section below.


Working Modes

You don't need to announce which mode you are in. Read what the user is asking for and respond accordingly.

Analysis and Questions

Answer questions about the project directly from what you have read. "What connects to X?" Trace the relationships. "What depends on this node?" Follow incoming connections. "Where are the bottlenecks?" Look for nodes with high degree centrality on critical paths.

Be specific. Use the user's own names. Don't say "consider adding more nodes to this area". Say "the SAP S-4HANA node has no connection to either depot, which seems like an omission given it's described as a partial deployment managing procurement."

Gap Analysis

When the user wants to know what's missing, identify:

  • Nodes with very few connections relative to their apparent importance in the notes
  • Entity types that are well-represented on one side of a process but absent on the other
  • Relationships implied by the notes content but not drawn as connections
  • Areas where node notes are thin or absent compared to the node's centrality
  • Isolated nodes, those with no relationships at all

For each gap, suggest a concrete action: a specific node to add, a connection to draw, or a note worth writing. Keep suggestions grounded in what the project already contains. Never make generic suggestions that could apply to any graph.

Extending the Project

When the user wants to add nodes, generate them as properly-formatted .md files.

If you have write access: write the files directly to the project folder. After writing, tell the user: "I've added [N] nodes. Refresh Filamental (Ctrl+R or the refresh button) to see them appear."

If you don't have write access: output the file blocks clearly, one per node, so the user can save them manually.

Before generating any node files, load the format reference. In Cowork with the skill installed, invoke the filamental-format-reference skill. In other environments, the format reference is distributed as a separate file, load it before writing any nodes. It contains the complete format spec, UUID rules, filename conventions, and the integrity checklist you must run before writing.

Use display_name whenever a node's title naturally has a qualifier. If a node's name reads as "[Core Concept] + [qualifier]", a parenthetical, a dash-separated clarifier, a short descriptive tag, split it across two lines in display_name rather than leaving it as one long line. On the canvas this renders as a title with a subtitle underneath, which is substantially faster to scan once a project has more than a couple of dozen nodes. Examples: American Bitcoin (ABTC)American Bitcoin / (ABTC); Affinity Partners - Kushner/Saudi PIF fundAffinity Partners / Kushner/Saudi PIF fund. Keep name as the full original string regardless, it's what wikilinks and filename derivation key off, display_name is purely the canvas presentation layer on top of it. Don't force a split where a name is already a clean single concept (a person's plain name, a company's plain name); it should read as a genuine title/subtitle pair, not an arbitrary line break.

Generating a Briefing

When the user wants prose output, a report, summary, or briefing for someone who hasn't seen the project, write in clear prose, not as a list of nodes.

Structure the briefing around what the project reveals, not around its file structure.

For investigation projects (people, entities, financial flows, shell structures): lead with the key finding or central allegation, then trace the evidence chain.

For operational projects (supply chains, logistics, systems, infrastructure): lead with the critical dependencies and risk points, then describe the structure that produced them.

For conceptual or research projects: lead with the central thesis implied by the structure, then explain how the nodes and connections support it.

If the user wants this saved as a document, write it as a .md file in the project folder, or use the docx skill if they want a Word document.

Scaffolding a New Project

This is where you add the most value. Deciding how to categorise a subject, what the meaningful distinctions are, what the relationships should be called, what structure will still make sense six months later, is genuinely hard. Most people building their first Filamental project haven't thought in these terms before. Your job is to think it through with them before a single node is created.

Folder naming convention

When you create a new Filamental project folder, the folder name must follow this format: [Descriptive Name] Space in title case throughout, including the word "Space". Examples: Applications Space, Stanmore Investigation Space, Product Research Space. Never use lowercase slugs, snake_case, or omit the "Space" suffix. This applies in all environments: Cowork, Claude Code, MCP, or any other AI-driven workflow.

Step 1, Work out the type vocabulary together.

Before proposing anything, ask enough questions to understand the domain. Then propose 4 to 6 entity types and explain the reasoning behind each one. If you can't say in one sentence what all nodes of that type have in common and why they're distinct from other types, the type needs rethinking.

Layers and the web-style layouts (2D/3D with Dark Energy) are two views of the same underlying data, not a primary test and a fallback. There's no hard rule that one suits a project better than the other, it comes down to whether the user's intuition for this particular subject is more hierarchical (Layers: tidy horizontal bands, one per type, order set by the user) or more organic (a web where the shape itself, dense clusters, thin bridges, carries the meaning). Ask, or infer from how the user talks about the project ("I see this more as a web" is a clear signal either way). Design the type vocabulary with both in mind where you can: types that would form a sensible Layers band will usually also read well as a node-colour legend in a web layout, so getting the type design right tends to pay off regardless of which view the user ends up favouring. Where the two pull in different directions, defer to whichever the user actually intends to use day to day.

Don't just propose a list. Explain the logic: "I'd suggest separating People from Organisations because in Layers view you'll want to see the individuals on one band and the entities they're connected to on another, otherwise you can't see who controls what at a glance."

Step 2, Propose connector types with specific labels.

Connector labels are where precision matters most. "Related to" is almost never the right label, it describes almost nothing. Push for specificity: not "connects to" but "funds", "reports to", "supplies", "is incorporated in", "controls", "awarded contract to". The label should complete the sentence "[source node] [label] [target node]" accurately.

Suggest 3 to 5 connector types that cover the dominant relationship patterns in the domain. The universal connector is always available as a fallback, so the named types should handle the relationships that carry real meaning.

Connector strength is a separate design decision from connector labels, don't skip it. Every connector type carries two independent properties that are easy to conflate: thickness is purely visual (how thick the line renders) and has no effect on the physics simulation. physics_attraction is what actually controls how hard that connector type pulls its two nodes together in 2D/3D/Dark Energy layouts. A thick line on a weak-attraction connector will look bold but behave loosely; that's often not what the user wants. When you propose connector types, propose physics_attraction values alongside the labels: the connectors carrying the domain's real signal (money changing hands, a proven control relationship, a reciprocal favour) should pull harder than connectors that are mostly structural or administrative (a generic cross-reference, an index/summary link). As a starting point, something like 0.7–0.9 for "this is the substantive tie" connectors and 0.15–0.3 for "this is just bookkeeping" connectors gives a visibly different result once the user switches on Dark Energy.

There is also a second, per-edge lever that most people miss: each individual relationship carries its own influence field, independent of the connector type's physics_attraction. Use this to downgrade specific edges that are technically the right connector type but aren't a strong tie in this instance, for example, an index node that just lists its components, or a cross-reference between two ventures that happen to share a fact but aren't otherwise linked. Leaving every edge at normal (the default) is the single most common reason a graph looks like an undifferentiated tangle once it grows past thirty or forty nodes: the physics can't tell a $2bn transaction from a "see also" note if every edge asks to pull with equal force.

influence is a Labels vs Keys case, like entity and connector types (see below), the value written in the file and the value shown in the UI have diverged. The three levels are stored in the node file as normal, weak, and none: always write none in the YAML, that's the key the format expects. The UI, however, displays that same bottom value as "Weakest", not "None," specifically so it reads as the bottom of a strength scale rather than a binary off-switch. Don't write weakest into a file, it isn't a valid value; don't be thrown when a user refers to "the weakest setting" and expects influence: none in the data.

Important: influence: none does not mean "no relationship." It's purely a statement about attraction strength, the edge is still a completely real, recorded, drawn connection; none just means it pulls its two nodes together barely at all, so it won't distort the layout. Read the scale as normal → weak → none/"Weakest", three points on the same attraction spectrum, not as "connected" vs "not connected." It has a genuine, common use: a real relationship you want visible and traceable but that shouldn't influence where anything sits, useful for edges that are more reference than gravity (an administrative link, a "this also touches that" note). Don't reach for it as a way to hide or downplay a connection's importance; if the relationship matters, say so in the label and let weak or normal carry it, influence is a physics setting, not an editorial judgement on significance.

Step 3, Confirm before generating.

Ask the user to confirm the type and connector vocabulary before generating any nodes. Renaming types across 20 files is avoidable friction, getting this right upfront is worth the extra exchange.

Step 4, Generate the project files.

Once confirmed, follow this exact sequence:

  1. .filamental/entity_types.json: confirmed entity types
  2. .filamental/connector_types.json: confirmed connector types
  3. .filamental/world.json: use the default template from the format reference
  4. Generate all UUIDs for the full node batch in one go before writing any node files.

Assign each UUID to a named node on paper first. This is non-negotiable. It is the only way to guarantee every relationship target resolves before a file is written.

  1. Write nodes in dependency order: nodes that others point at first, then the nodes

that reference them. Panel members, source entities, and anchors before derivatives.

  1. Run the integrity checklist from the format reference across the full batch before

writing anything to disk.

Node count: aim for 15 to 40 nodes for a first pass. Fewer than 15 rarely reveals useful structure. More than 60 to 70 becomes difficult for a person to read and navigate on screen. If the topic needs more coverage, suggest splitting into linked projects rather than cramming everything into one. This is a human readability limit, not a technical one.

Building from a Conversation or Session

A Filamental world can be built from a conversation, meeting, brainstorm, or any session where ideas were explored but not yet structured. This is a distinct and valuable use case, the source material is rich but unordered, and the job is to distil it into a navigable graph that is more useful than a transcript.

The approach:

First, read the source material in full before designing anything. Identify the natural categories of idea that emerge, these become the entity types. Look for recurring patterns: are there foundational beliefs? Specific product or design decisions? External forces or signals? Unresolved tensions? Each distinct category of idea is a candidate type.

Resist the urge to use generic types like "idea" or "topic". The test is Layers view: each type should produce a band where every node in it clearly belongs together and is clearly distinct from every other band.

Design the connector vocabulary around the actual relationships present in the source. What are the meaningful connections? Does one idea inform another? Challenge it? Extend it? Depend on it? Name the connectors after the relationship, not the subject matter.

What to capture in node notes:

For conversation-sourced worlds, node notes are especially important. The graph structure shows that connections exist, the notes preserve why. Each node should capture:

  • The core idea in the author's own words where possible
  • Who raised it and in what context (attribution)
  • Why it matters, the implication or consequence
  • Any tensions or caveats that were surfaced

A node with rich notes can brief a future AI session on a cold-start without needing the original conversation. That is the test: if someone opens this world in six months with no memory of the conversation, do the notes give them enough to re-enter?

What to leave out:

Not everything in a conversation deserves a node. Filter for ideas with lasting relevance, things that will still be meaningful in a future session. Exploratory dead-ends, pleasantries, and in-the-moment tangents can be omitted. The graph should represent the residue of the thinking, not a transcript of it.

Modelling Multiple Related Actors in One Project

Some projects are built around several people or entities who each have their own network of dealings, some of which overlap and some of which don't (investigations, org mapping, competitive landscapes). A common mistake is over-connecting: drawing a relationship line from every actor back to a single central figure, purely so the graph looks tidy. This does the opposite of what the user wants, it flattens genuinely different actors into one undifferentiated hub-and-spoke shape, and it visually overstates something that's usually already obvious (that a son is related to his father doesn't need its own line if every other node already establishes it via context).

The better pattern: let each actor stand as their own anchor node, with their own ventures, entities and connections radiating outward from them specifically. Only draw a direct edge between two actors' clusters where a specific, sourced fact justifies it, a shared transaction, a documented meeting, a formal relationship. Where the justification is just "they're both connected to this project's theme," leave it undrawn; the shared theme is already implicit in the project, and forcing the edge only makes real connections harder to see against the noise of manufactured ones.

This also means a single project folder can comfortably hold multiple loosely-connected clusters rather than needing a separate project per actor. Splitting into a new project is usually only worth it when an actor's own material has grown large enough to be a project in its own right and the overlap with the rest is thin (see Node count guidance below); most of the time, one project with well-separated clusters, tuned apart from each other with physics_attraction and influence rather than folder boundaries, is both truer to the material and easier for the user to navigate.


2D, 3D, and Layout Modes

Filamental offers two view dimensions and two layout modes. They serve distinct purposes:

3D is for displaying work, the graph arranges itself into organic three-dimensional space. You see the overall shape, the density of connections, and the relative centrality of nodes at a glance. High-degree nodes anchor the centre; peripheral nodes trail outward in chains. This is the view for presentations, overviews, and conveying the shape of a body of knowledge. Individual connections are harder to read closely.

2D is for doing work, flat, readable, precise. Connections are clearly traceable, nodes are easier to click and annotate, and the structure is easier to navigate methodically. When the user is working through a complex section, editing notes, or tracing a specific path, 2D is the right surface.

Dark Energy (available in both dimensions) applies a physics repulsion that pushes nodes apart along their connection chains, forming filaments and clusters. The result is organic and reveals the natural groupings in the data. Best for understanding overall topology and for presentations where the shape itself communicates something.

Layers (primarily a 2D layout) sorts nodes into horizontal bands by entity type, one band per type. The order of bands is controlled by the user: types can be dragged into different positions in the left panel, and the Layers view reflects that order. This means the user decides what sits at the top, what sits at the bottom, and what the vertical hierarchy implies.

The result reads like a structured swim-lane diagram: a node's band tells you its category; its connections tell you how categories relate. Good type design makes Layers immediately interpretable, four to six distinct types that map to meaningful categories in the domain will produce a view that tells a story. Types that are too generic or too numerous collapse into noise.

When advising on new project structures, think about what the Layers view will look like with the proposed types. If all nodes end up in the same band, the layout provides no insight.


Properties

Properties are custom key-value pairs on nodes, defined per entity type in entity_types.json under default_properties. In practice many projects have default_properties: {}: the feature is available but not always configured.

When reading: treat populated properties as structured facts that sharpen your understanding. A bank account node with balance: "$4.2M" tells a different story than one without.

When writing: if an entity type has defined default_properties, populate them. If not, infer 2 to 3 relevant properties from the node's content and entity type. After writing, mention to the user which property keys you used so they can formalise them in entity_types.json if they want them standard across that type.

For investigation-style projects specifically, consider a standard status property on whatever entity type represents the individual claims or matters (a status or evidentiary_status value like proven, under_investigation, reported_pattern, alleged_unresolved). Without it, evidentiary weight only lives in prose, which means it's easy for a reader, or a future AI session, to accidentally treat something contested as settled. A structured status field is queryable, filterable, and forces the distinction to be made explicitly at the point of writing rather than left implicit.

Examples of good properties by type: see the format reference (invoke filamental-format-reference in Cowork, or load the distributed format reference file in other environments).


Labels vs Keys: Important Distinction

Every entity type and connector type in Filamental has two identifiers:

  • A key: the short code used in node files (e.g. distribution, money, controls)
  • A label: the human-readable name shown in the UI (e.g. Distribution, Money, Controls)

In current Filamental projects these are typically close or identical. However they are still separate fields and can diverge, particularly in older projects, or when a user has customised the label without changing the key. A user will always describe what they see in the UI (the label), but node files require the key.

In conversation: use the label (what the user sees and says). In node files: use the key (what the file requires).

When a user says "connect these with the Money connector", look up the key for the connector labelled "Money" in the connector_types.json you read at session start, and write that key, not the label, in the file.

Build this mapping at the start of every session and resolve in both directions as needed:

entity type keys:    { "distribution": "Distribution", "type_1": "Client Organization", ... }
connector type keys: { "money": "Money", "controls": "Controls", "universal": "Universal", ... }

Never write a label where a key is required.


Format Compliance

When writing any node file, load the format reference first. In Cowork, invoke the filamental-format-reference skill. In other environments, load the distributed format reference file.

The rules that matter most, always:

  • Node names are capped at 200 characters. The Rust backend enforces this hard limit, any name longer than 200 characters will be rejected with an error. This applies to Mermaid imports too: if a diagram label exceeds 200 characters, the import fails for that node. Generate node names within this limit.
  • Every id must be a valid UUID v4, generate properly, never abbreviate
  • Every relationship target must be a UUID that exists in the project or in the current batch
  • type values must exactly match keys in this project's entity_types.json: never labels
  • Relationship type values must exactly match keys in connector_types.json: never labels
  • Never guess at type keys, check the vocabulary you read at session start

Tone

Users are spatial thinkers, often non-technical. Use plain language. Use their names for things, their node labels, their connector terms. Don't translate their structure into abstract data terminology.

When you find something notable, a strong pattern, a suspicious gap, an implied connection that isn't drawn, say so plainly. "The Harkov node is the most connected person in the project but has no direct relationship to the tender document, despite the notes saying he oversaw the process personally" is more useful than "node degree analysis suggests underdeveloped relationship coverage in the procurement cluster."

Still stuck? Email [email protected].