Ideas are designed so that you can always hatch new ones without ceremony. The #idea function at its most basic takes the content of an idea.
#idea[Hatch a new idea.]You can think of an idea as an evergreen note, as an atomic unit of thought, as a generalization of the Orgmode TODO, or simply as a referenceable and taggable block of content. All ideas in your rookery are conceptually networked together so that you can treat a rookery as an associative archive.
An idea might be a short note you want to jot down, a record relating to a person or a place, a blog post, an academic paper, a todo item, a meeting note, a note associated to a citation, a tracking issue for a call for proposals, or any other kind of structured content fragment you can imagine. You can specify custom metadata structures for certain types of ideas using tags.
When you sit down at your computer, ready to jot down some ideas or write a piece, it wouldn’t be nice to have to always explicitly wrap your content in #idea blocks. You can use the #ideate function in combination with a Typst #show rule to implicitly parcel your writing into ideas:
#import "@rookery/core:0.1.0": ideate
#show: ideate
= Let's get rolling
Straight into it without ceremony.This will wrap your writing as an idea, taking the #document.title as its name. Importantly, you can parameterize the #ideate function to parcel your writing out into ideas differently:
#show: ideate.with(separator: heading.where(level: 2))
== First idea
The body of my first idea.
== Second idea
The body of my second idea.This is useful when you want to take writing in Typst that isn’t structured as ideas and import it into a rookery, as you don’t have to retrofit #idea blocks throughout: you just need to design the right #ideate show rule. Ideation also works nicely with Rheo spines, as it means that you can organize your ideas using files and folders and still have them appear in the flat idea space so that they can be further organized using tags.
You can add tags to any idea. Tags work as a lateral filter across many ideas that you can use to group windows on them, group outlines, or filter ideas in a search modal.
#idea(
"meeting-notes",
tags: ("draft", "review"),
)[ ... ]
/* Window over all ideas with the tag "draft" */
#window(tagged: "draft")Beneath their appearance as simple strings that can be used to organize ideas, tags are implemented as hash maps using strings as keys and abstract types as values. This means that you can use them to build up complex data structures that function as metadata for more structured ideas:
#idea(
title: [An idea with complex metadata],
tags: (
"opened": datetime(year: 2026, month: 9, day: 19),
"expected-length": duration(days: 2, hours: 1, minutes: 30),
"details": ("a": 1, "b": 2),
),
)For an example of treating tags as metadata to create more structured idea variants, see @rookery/timeline.
A footnote belongs to the idea in which you write it, just as citations do. So that rookery can track them correctly, you need to use the footnote function imported from rookery in ideas, rather than the Typst native function. (Using Typst’s own #footnote will cause a compilation error.)
#import "@rookery/core:0.1.0": idea, footnote
#idea("etal")[
A claim#footnote[The evidence.] worth qualifying.
]Footnote numbering is idea-local. This means that there may be two footnotes labeled 1 on the same page, if two ideas with footnotes are hatched in that context.1
Footnote listings occur at the end of each idea.2 On a standalone page, footnotes appear before the context and backlinks listings.
A footnote written outside an idea’s context proxies the native Typst function so that it behaves normally.
What you write inside a footnote belongs to the idea as well, and not to the footnote. A citation in a footnote is claimed by the surrounding idea and listed in its References,3 and a window or an @idea: reference in a footnote registers its backlink exactly as it would in the idea’s own prose.
limit which truncates the content.A citation belongs to the idea in which you write it, just as footnotes do. Bibliographies, like footnotes, are produced at the end of an idea.
In contrast to footnotes, however, all citations in a rookery draw from a global bibliography that is configured once like so:
#show: rookery.with(bibliography: arguments(
bytes(read("references.bib")),
style: "chicago-author-date",
))You must use bytes(read(...)) rather than a path to pass a reference file, but rookery bibliographies otherwise work the same as Typst bibliographies.
Once a rookery is configured with a bibliography, you can cite as you naturally would in Typst (Mädje 2022). Bibliographies will appear at the bottom of every idea with a citation under a ‘References’ heading.
Citation numbering is rookery-wide, which means that numeric styles will not be scoped to each idea. (An idea with one citation may show it as [7], for example, if it is the 7th citation in the rookery.) For this reason we recommend using citation styles that don’t employ numbers, such as "author-date".