Render Obsidian Canvas (.canvas) files as visual diagrams on your Flowershow site.
Flowershow supports rendering Obsidian Canvas files (.canvas). Canvas files follow the open JSON Canvas specification and are displayed as SVG diagrams showing your nodes, connections, and colors.
Demo
Here's a simple canvas embedded inline in this page:
Create in Obsidian
Draw on Canvas
Bloom on Flowershow
Share with the world
Customize
Custom styles
Creating the file
Create a new file named custom.css in the root of your repository (or the root directory of your site if you're publishing from a subfolder)
Add your CSS rules to customize colors, fonts, layouts, and more
Publish it along with your content.
custom.css loads after the default theme, so a rule in custom.css wins over the theme when its selector is equally or more specific, without needing !important. Overriding the variables in :root is the most reliable way to restyle the site.
Start with the theme variables below for broad visual changes. When you need to
target a particular component or state, use the
semantic theme class reference, which
groups Flowershow's stable CSS hooks by the UI area that emits them.
Theme variables
Flowershow exposes CSS custom properties (variables) in :root.
You can override them in custom.css without touching app code.
The variables below are drawn from two source files in the Flowershow repository — browse them directly for the full picture:
:root{--color-code-bg:#fafafa;/* light mode */--color-code-bg-dark:#2f2f2f;/* dark mode */}
CTA button colors
The navbar call-to-action button is unstyled by default (inherits foreground tones). Override these to brand it:
:root{--color-cta-bg:/* defaults to --color-foreground-700 */--color-cta-bg-hover:/* defaults to --color-foreground-500 */--color-cta-text:/* defaults to #ffffff */;}
Tag pill colors
Tag pills (the frontmatter tag row in page headers, inline #tags in your content, and the /tags pages) take their colors from four variables. The defaults are pink:
Variable
Light default
Dark default
--color-tag-pill-text
#db2777
#f472b6
--color-tag-pill-bg
rgb(219 39 119 / 0.1)
rgb(244 114 182 / 0.12)
--color-tag-pill-text-hover
#be185d
#f9a8d4
--color-tag-pill-bg-hover
rgb(219 39 119 / 0.16)
rgb(244 114 182 / 0.2)
Unlike the --color-l-* / --color-d-* pairs, there is one set of tag variables. Values you set on :root apply in both light and dark mode. To use different colors in dark mode, also set them on :root[data-theme="dark"]:
Paths resolve from your site root. Every page loads custom.css as a stylesheet from /custom.css, so url() paths resolve against your site root, not the page's URL. url('/fonts/Brand.woff2') and url('fonts/Brand.woff2') both point to the fonts folder at your site root, on every page. We recommend starting paths with / because it's clearer.
Put @import at the very top. Only comments may come before it. An @import after any other rule is silently ignored. Don't add layer(...): rules inside a cascade layer lose to the default theme.
Publish the files. Fonts (.woff2, .woff, .ttf, .otf) are served like any other site file. If you use contentInclude, include the folder that holds them.
Don't embed fonts as base64 data: URLs. They bloat custom.css, so first visits to your site load slower. Separate font files load only when needed and are cached on their own.
--navbar-height sets the height of the navbar itself, and everything that has to clear it follows: the sticky sidebar, table of contents and mobile breadcrumb bar, the anchor scroll offset for headings (--navbar-height + 0.5rem) and the changelog's sticky date (--navbar-height + 1rem). Change it in one place to resize the navbar, e.g. --navbar-height: 3rem for a 48px header. When a page or site hides the navbar (showNavbar: false) it is set to 0px automatically.
:root{--navbar-height:4rem;--subnav-height:3rem;/* mobile breadcrumb/sidebar toggle bar */}
Callout colors
Each callout type maps to one of these tokens. Override them to retheme all callouts of that category at once.
:root{--callout-note-color:oklch(0.6230.214259);/* blue */--callout-tip-color:oklch(0.7140.143215);/* cyan */--callout-success-color:oklch(0.7230.219142);/* green */--callout-warning-color:oklch(0.7050.19155);/* orange */--callout-danger-color:oklch(0.6270.25829);/* red */--callout-example-color:oklch(0.6270.265303);/* purple */--callout-quote-color:oklch(0.5540.014286);/* zinc */}
Callout type → color token mapping:
Token
Types
--callout-note-color
note, info, todo
--callout-tip-color
tip, hint, important, abstract, summary, tldr
--callout-success-color
success, check, done
--callout-warning-color
warning, caution, attention, question, help, faq
--callout-danger-color
danger, error, bug, failure, fail, missing
--callout-example-color
example
--callout-quote-color
quote, cite
Full-width sections
On a page with layout: plain in its frontmatter, your content is not constrained: Flowershow adds no max-width, padding or margin around it, so every block already spans the full width between the navbar and the footer. You own the layout.
That means you don't need a width: 100vw breakout to make a band reach the edges. Don't add one: 100vw includes the width of the vertical scrollbar, so on browsers that draw a classic scrollbar (Windows, and macOS or Linux with "always show scrollbars") it makes the page a few pixels wider than the window and adds a horizontal scrollbar.
Instead, build the page from full-width bands, each with a centred inner container for its text:
<sectionclass="band"><divclass="band-inner"><h2>Our mission</h2><p>Full-width background, readable text column.</p></div></section>
If you want most of the page in a narrow column with a few bands between, close the column, add the band, and open a new column, rather than wrapping the whole page in one narrow container.
Plain pages also drop the default Markdown typography: headings, lists, links and paragraph spacing get no prose styling, so style them yourself in custom.css.
On the default layout, content sits in a readable column next to the sidebar and table of contents, and full-width sections are not supported. Use layout: plain for landing-page-style pages.
Canvas files (.canvas) are JSON files created by Obsidian's Canvas feature. When you sync your Obsidian vault to Flowershow, canvas files are automatically detected and rendered as visual diagrams – no configuration needed.
Standalone Canvas Pages
Any .canvas file in your content is automatically rendered as its own page, at the file's path without the extension, like a Markdown page:
Roadmap.canvas renders at /Roadmap
notes/architecture.canvas renders at /notes/architecture
The URL with the .canvas extension returns the raw JSON file. Avoid giving a canvas the same name as a Markdown file in the same folder, since both would want the same URL.
Canvas files also appear in the sidebar navigation alongside your markdown pages.
Inline Canvas Embeds
You can embed a canvas inside any markdown page using either Obsidian wiki-link or standard markdown image syntax:
![[my-diagram.canvas]]

The canvas renders as an inline SVG diagram within the page content.
Supported Features
Rich text nodes – text nodes render full markdown including GFM tables, wiki-links, callouts, math (KaTeX), and syntax-highlighted code
Image embeds – file nodes referencing images (.png, .jpg, .gif, .svg, .webp, .bmp, .ico) display the actual image inside the node
Note embeds – file nodes referencing .md files render the note's content with full markdown formatting and a title heading
Colored nodes – all 6 Obsidian color presets plus custom hex colors (e.g. #ff6600)
Edges – connections between nodes render as bezier curves with support for edge colors, labels, and arrow markers on both ends