Build a Digital Garden

Cultivate a digital garden using wikilinks, backlinks, and the document graph to create an interconnected knowledge space.

beginner14 min read

What You'll Build

A digital garden is a personal knowledge space that grows over time. Unlike a blog — where posts are finished and dated — a digital garden is a collection of living notes that evolve, link to each other, and form an interconnected web of ideas.

In this guide you will:

  • Create a garden vault to hold your notes
  • Write notes with wikilinks that connect related ideas
  • Explore backlinks to see which notes reference a given page
  • Visualise your garden as a document graph
  • Selectively publish mature notes while keeping drafts private
  • Share individual notes as private links for feedback

The key mindset shift: stop thinking of notes as finished articles and start thinking of them as seeds that grow richer as you add connections.

Prerequisites

  • A Lifestream Vault account (free tier is sufficient to get started)
  • Pro tier or higher to enable vault publishing and password-protected share links
  • Node.js 18+ (for SDK and CLI usage — optional for this guide)

Create Your Garden Vault

Create a dedicated vault for your garden. Keeping it separate from other vaults means you can publish it independently and control its navigation structure.

Via the UI: open Settings → Vaults → New Vault, enter a name (e.g. My Garden) and a slug (e.g. my-garden), then click Create.

Or use the SDK or CLI:

typescript
import { LifestreamVaultClient } from '@lifestreamdynamics/vault-sdk';

const { client } = await LifestreamVaultClient.login(
  'https://vault.lifestreamdynamics.com',
  'you@example.com',
  'your-password',
);

// The slug is generated from the name — you do not pass it.
const vault = await client.vaults.create({
  name: 'My Garden',
});

console.log('Garden vault created:', vault.id, '— slug:', vault.slug);

A Note on Structure

Digital gardens are intentionally less structured than documentation sites. Rather than imposing a rigid folder hierarchy upfront, let structure emerge from your links and tags. Some gardeners keep everything flat; others use a few broad categories like concepts/, projects/, and references/. Either approach works.

The Document Graph

The vault graph is a force-directed visualisation of every document and every link between documents. Each node is a note; each edge is a wikilink. Clusters of tightly connected nodes reveal areas of deep interest; isolated nodes reveal notes that haven't been connected to the broader garden yet.

Open the graph in the web UI by clicking the Graph icon in the vault toolbar.

You can also fetch the raw graph data and build your own visualisation:

typescript
// Fetch the full vault graph (nodes + edges) — getGraph(vaultId) is positional
const graph = await client.vaults.getGraph(vault.id);

console.log('Nodes:', graph.nodes.length);
console.log('Edges:', graph.edges.length);

// Find the most connected nodes (highest degree)
const degree = new Map<string, number>();
for (const edge of graph.edges) {
  degree.set(edge.source, (degree.get(edge.source) ?? 0) + 1);
  degree.set(edge.target, (degree.get(edge.target) ?? 0) + 1);
}

const sorted = [...degree.entries()]
  .sort((a, b) => b[1] - a[1])
  .slice(0, 10);

console.log('Top 10 most-connected notes:');
for (const [nodeId, connections] of sorted) {
  const node = graph.nodes.find((n) => n.id === nodeId);
  console.log(` - ${node?.path ?? nodeId}: ${connections} connections`);
}

The graph updates in real time as you create, edit, or delete documents. Notes with no wikilinks appear as isolated nodes — they're a good indicator of notes that need to be connected to the rest of your garden.

Progressive Publishing

One of the defining features of a digital garden is progressive publishing — the idea that you share notes as they mature rather than waiting until they're "done". Notes can exist in different states of development:

StateMeaning
SeedlingRaw, unpolished thought. Private only.
BuddingTaking shape, but still evolving.
EvergreenStable, well-developed, worth sharing.

Use a status frontmatter field to track maturity:

---
title: Zettelkasten
status: evergreen
tags: [knowledge-management, productivity]
---

When a note reaches evergreen status, publish it using the SDK or CLI to make it publicly accessible:

typescript
// publish.create is positional: (vaultId, documentPath, params)
const published = await client.publish.create(
  vault.id,
  'zettelkasten.md',
  {
    slug: 'zettelkasten',
    seoTitle: 'Zettelkasten — My Garden',
    seoDescription:
      'My notes on the Zettelkasten method for networked note-taking.',
  },
);

// The public URL is your profile slug + the post slug:
//   https://vault.lifestreamdynamics.com/{profileSlug}/{published.slug}
console.log('Published with slug:', published.slug);

// To unpublish (make private again) — delete(vaultId, documentPath)
await client.publish.delete(vault.id, 'zettelkasten.md');

// List all currently published documents in your garden — listMine(vaultId)
const publishedDocs = await client.publish.listMine(vault.id);
console.log(`${publishedDocs.length} notes are publicly visible`);

Enabling vault publishing (via client.publishVault.publish(vaultId, params)) makes the vault browsable as a site. Individual documents are only visible in the public listing when you explicitly publish them. This lets you maintain a single vault with a mix of private drafts and public notes.

Sharing Individual Notes

Sometimes you want to share a note with a specific person for feedback — without publishing it publicly. Share links generate a unique URL that grants read access to a single document without requiring the recipient to have a Lifestream Vault account.

Share links can be:

  • Open — anyone with the link can read the document
  • Password-protected — the recipient must enter a password to unlock the note (Pro tier)
  • Expiring — automatically revoke access after a specified date
typescript
// shares.create is positional: (vaultId, documentPath, options).
// The full token is returned only at creation time.
const open = await client.shares.create(vault.id, 'zettelkasten.md', {
  permission: 'view',
});

console.log('Share URL:', `https://vault.lifestreamdynamics.com/share/${open.fullToken}`);

// Create a password-protected, expiring share link (Pro tier)
const protectedLink = await client.shares.create(vault.id, 'zettelkasten.md', {
  permission: 'view',
  password: 'garden2026',
  expiresAt: new Date('2026-04-01').toISOString(),
});

console.log('Protected share URL:', `https://vault.lifestreamdynamics.com/share/${protectedLink.fullToken}`);

// Revoke a share link — revoke(vaultId, shareId)
await client.shares.revoke(vault.id, open.shareLink.id);
Plan Required

Password-protected share links require a Pro plan. Open share links are available on all tiers.

Tips & Best Practices

Atomic Notes

Write one idea per note. Atomic notes are easier to link, easier to find, and easier to evolve over time. If a note is getting long, it's probably two notes trying to be one.

Evergreen Notes

An evergreen note is written to stand on its own and remain relevant indefinitely. Avoid time-dependent phrases like "recently" or "last week" in evergreen notes — they age poorly. Instead, write "as of 2026" if the date matters.

Consistent Naming

Use lowercase, hyphen-separated slugs that describe the concept clearly:

  • Good: zettelkasten.md, opportunity-cost.md, spaced-repetition.md
  • Avoid: ZK.md, My Thoughts on X.md, temp.md

Clear names make wikilinks readable in context and keep the graph legible.

Use the SDK to find all wikilinks that point to documents that don't exist yet. These are your writing backlog:

// getUnresolvedLinks(vaultId) is positional and returns UnresolvedLink[]
const unresolved = await client.vaults.getUnresolvedLinks(vault.id);

console.log('Unresolved wikilinks (notes to write):');
for (const link of unresolved) {
  // Each entry has a targetPath plus the references that point to it
  const sources = link.references.map((r) => r.sourcePath).join(', ');
  console.log(` - "${link.targetPath}" (referenced from ${sources})`);
}

Garden Tending

Set aside regular time (weekly or monthly) to:

  1. Review recently created notes and add wikilinks
  2. Look at isolated nodes in the graph and connect them
  3. Resolve broken wikilinks by writing the missing note
  4. Upgrade budding notes to evergreen status when ready
  • Use tags (tags: [productivity]) to categorise notes by topic — they power filtered views in the published vault
  • Use wikilinks for specific conceptual relationships — they build the graph and drive backlinks
  • Both complement each other; neither replaces the other

What's Next

Your digital garden is now ready to grow. Here are some directions to take it further: