A tool that changes shape with you.

Start with a clean editing experience. Gradually add structure, views and your own commands when you need them. SilverBullet grows into the tool you’d have built yourself, without having to build one from scratch.

Four SilverBullet spaces, each with a home page of its own: Sam’s notes with a greeting, buttons and counts in blue; the Driftwood team wiki in dark mode, with a terminal-style status line, its sprint and open tasks per person; the Bakers’ family space as a fridge door of tilted notes, with tonight’s dinner and the week’s meals; and SilverBullet’s own documentation with its custom navigation

Most tools make you choose: something simple that you outgrow, or something powerful that requires professional services to set up before it’s useful. And once you’ve set it up, it’s hard to evolve.

One SLIQ query: a list that keeps itself.

Tag a page #book and give it an author and a rating. Sam’s Reading List is a single query over every page tagged that way, so it stays up to date as he adds books, and every book in it is a link.

Show some code
${query[[
  from b = index.contentPages "book"
  order by b.rating desc nulls last
  select {
    Book = "[[" .. b.name .. "]]",
    Author = b.author,
    Rating = b.rating and string.rep("★", b.rating) or b.status,
  }
]]}
Sam’s Reading List: a table of every book tagged #book with its author and a star rating, or its status if it isn’t rated yet, each book a link with a book icon

A few lines of Lua: an icon on every person link.

A tag can change how the pages that carry it are shown. In Sam’s space, every link to a #person page gets a person icon, like Jo and Pete under People, and so does the page’s entry in the page picker. Books and ideas get theirs the same way.

Show some code
local function icon(i)
  return function(o)
    if o.tag == "page" then
      o.pageDecoration = { icon = i }
    end
    return o
  end
end

tag.define {
  name = "person",
  transform = icon "user",
}
space-lua
Sam’s space with the page picker docked on the left: books, people and ideas each have their own icon there and in the index page’s lists of projects, lists, people and ideas

Page templates: new pages that start out right.

A page template is a page too. Sam’s Book template adds a “Book: Add” command: it asks for the title, then starts a page already tagged #book with a status, and the cursor where he writes why he wants to read it. The Reading List picks the new book up straight away.

Show some code
---
description: A page for a book I want to read; the Reading List picks it up.
command: "Book: Add"
suggestedName: "Untitled Book"
confirmName: true
tags: meta/template/page
frontmatter: |
  tags: book
  author:
  status: to read
---
Why I want to read it: |^|
A new page for The Overstory created from the Book template, tagged #book with the cursor after “Why I want to read it”, next to the Reading List that now includes it

A diagram drawn from your page frontmatter.

Each of the Driftwood team’s component pages says in its frontmatter what it connects to. The Architecture page draws the diagram from that, live, using a library from the community. Add a component, and it shows up in the picture.

Show some code
---
tags: component
consumes:
- "[[Architecture/Photo Folders]]"
connectsTo:
- "[[Architecture/Catalog]]"
- "[[Architecture/Thumbnail Cache]]"
---
${mermaid.diagram(mermaid.relationGraph {
  pages = query[[from index.contentPages "component"]],
  direction = "LR",
})}
The Architecture page: a live diagram of how the importer, library browser, catalog, thumbnail cache and photo folders connect, above the list of components

A page that’s an app.

The Bakers’ home page is a fridge door: who’s cooking tonight, a note per dinner this week, chores per person and what’s coming up. Each part is a short Space Lua function that queries the family’s pages and builds the widget.

Show some code
function family.meals()
  local meals = query[[
    from m = index.items "meal"
    select m
  ]]
  table.sort(meals, function(a, b)
    return DAYS[a.day] < DAYS[b.day]
  end)
  local today = os.date "%a"
  local cards = {}
  for _, m in ipairs(meals) do
    table.insert(cards, dom.div {
      class = m.day == today and "fam-meal fam-today" or "fam-meal",
      dom.div { class = "fam-day", m.day },
      dom.div { class = "fam-dish", m.name },
      dom.div { class = "fam-cook", m.cook },
    })
  end
  return widget.htmlBlock(dom.div {
    class = "fam fam-meals",
    table.unpack(cards),
  })
end
space-lua
The Bakers’ home page as a fridge door: a taped note with the family’s faces, one with tonight’s dinner, a tilted note per dinner this week with who cooks, the shopping list as tasks, chores per person and what’s coming up

A space that looks like no other.

Space Style is CSS in a page. The Driftwood team wiki opens in dark mode, with flat, square panels and a terminal-style status line; the Bakers’ space is warm paper with crooked notes. Same SilverBullet, each restyled by its own page of CSS.

Show some code
.team-header,
.team-sprint,
.team-person {
  border: 1px solid #1f3b3a;
  background: #0b1514;
}

.team-pill {
  padding: 2px 10px;
  border: 1px solid #2dd4bf;
  color: #5eead4 !important;
  font-size: 0.8em;
}
.team-pill::before {
  content: "● ";
}
space-style
The Driftwood team wiki’s home page in dark mode: a terminal-style status line, Phoenix Sprint 3 with its tasks and owners, open tasks per team member and the decisions by status, with the space tree docked on the left

Even the navigation is yours.

SilverBullet’s own documentation replaces the standard page tree with custom navigation: a hand-curated tree of sections, each page with its own icon, that follows along as you read. It’s a view defined in Space Lua, in a page anyone can curate.

Show some code

-- Simplified version
view.define {
  name = "docs.navigate",
  title = "Navigate",
  dock = "lhs",
  followEditor = true,
  source = function()
    local rows = {}
    for _, entry in ipairs(docsNav.pages) do
      rows[#rows + 1] = { name = entry.name, ref = entry.ref, icon = entry.icon }
    end
    return rows
  end,
  presentation = {
    mode = "tree",
  },
  onSelect = function(o)
    editor.navigate(o.ref)
  end,
}
space-lua
The documentation’s own Navigate view: a hand-curated tree of sections with an icon per page, following the page that’s open

Borrow what others made.

Install libraries shared by the community, like the diagram library the Driftwood team uses, and read exactly what they do: they’re pages in your space like any other.

The Library Manager: the built-in Std library and the installed Mermaid diagrams library, above the recommended libraries still available to install

Same tool, wildly different spaces.

Put all of that together and no two spaces look alike. Sam’s personal notes revolve around a daily journal, the Driftwood team wiki around decisions and sprints, SilverBullet’s own documentation lives in git next to its code, and the Bakers’ family space revolves around dinners and chores. Each is a SilverBullet space, set up the way its owners needed it.

This is sometimes called malleable software: software that you can reshape to fit, instead of the other way round.

Start simple. Grow when you’re ready.

Get started