A step-by-step how-to guide for Discourse admins who want a clean, lightweight logo without needing Photoshop, Inkscape, or design skills. We’ll use digitallysovereign.org and a tilted gold crown as our example.
What We’re Building
A full set of Discourse logo and icon files using nothing but:
- A FontAwesome SVG icon as the graphic element
- A text editor (Sublime Text, VS Code, even Notepad) to assemble the SVGs
- Python + cairosvg for the few slots that require PNG
No design software needed. No subscriptions. No fussing with image editors.
The result for digitallysovereign.org is a gold crown ♛ tipped 10° to the right — simple, unique, and unmistakably ours.
Before You Start
You’ll need:
- Admin access to your Discourse site
- A text editor
- Python 3 (only for the favicon and PWA icons — optional if you skip those)
- About 30 minutes
Part 1 — Choose Your FontAwesome Icon
1.1 Browse the free icon set
Go to fontawesome.com/icons and search for an icon. Filter by Free to stick to the no-cost set.
For digitallysovereign.org we chose the crown — it nods to sovereignty without being heavy-handed.
1.2 Get the raw SVG
On the icon’s page, click SVG to copy the raw code. You’ll get something like:
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512">
<path d="M313 87.2c9.2-7.3 15-18.6 ..."/>
</svg>
You only need the
viewBoxdimensions and the<path d="..."/>. Everything else (the comment, width, height, fill on the root element) you’ll replace.
Note down the viewBox — for the crown it is 0 0 576 512, meaning the icon lives in a coordinate space 576 units wide and 512 units tall. You’ll use these numbers in the transform math below.
Part 2 — Understand the One Transform That Does Everything
Every file in this guide uses the same SVG transform pattern to position and rotate the icon:
transform="translate(tx, ty) scale(s) rotate(deg, cx, cy)"
SVG applies these right to left:
- rotate — tips the icon
degdegrees around the icon’s center point(cx, cy)in its original coordinate space - scale — shrinks the icon to fit your logo dimensions
- translate — moves it into position
Working out the numbers
For a FontAwesome icon with viewBox="0 0 W H":
- The icon’s center is at
(W/2, H/2)— for the crown:(288, 256) - Use
rotate(10, 288, 256)to tip it 10° around that center
To land the (now rotated, now scaled) icon center at coordinates (X, Y) in your logo:
tx = X − (W/2 × s)
ty = Y − (H/2 × s)
Example: crown centered at (80, 80) in a logo, scaled to 25% (s = 0.25):
tx = 80 − (288 × 0.25) = 80 − 72 = 8
ty = 80 − (256 × 0.25) = 80 − 64 = 16
→ transform="translate(8, 16) scale(0.25) rotate(10, 288, 256)"
You’ll see this same pattern repeated in every file below, with different scale and target center values.
Part 3 — The Full Crown Path
To avoid repetition, here is the crown path string used in every file below. It is the d attribute from the FontAwesome crown SVG:
M313 87.2c9.2-7.3 15-18.6 15-31.2 0-22.1-17.9-40-40-40s-40 17.9-40 40c0 12.6 5.9 23.9 15 31.2L194.6 194.8c-10 15.7-31.3 19.6-46.2 8.4L88.9 158.7c4.5-6.4 7.1-14.3 7.1-22.7 0-22.1-17.9-40-40-40s-40 17.9-40 40c0 21.8 17.5 39.6 39.2 40L87.8 393.5c4.7 31.3 31.6 54.5 63.3 54.5l273.8 0c31.7 0 58.6-23.2 63.3-54.5L520.8 176c21.7-.4 39.2-18.2 39.2-40 0-22.1-17.9-40-40-40s-40 17.9-40 40c0 8.4 2.6 16.3 7.1 22.7l-59.4 44.6c-14.9 11.2-36.2 7.3-46.2-8.4L313 87.2z
Replace this with your own icon’s path d value throughout.
Part 4 — Discourse’s Image Slots
Go to Admin → Settings and search for logo. Here are all the slots and what each file will do:
| Discourse slot | File | Format | Notes |
|---|---|---|---|
| Logo | logo-light.svg |
SVG |
Wide, shown in light mode header |
| Logo (dark mode) | logo-dark.svg |
SVG |
Same layout, dark mode colours |
| Logo (small) | logo-small-light.svg |
SVG |
Icon only, mobile / narrow header |
| Logo (small, dark) | logo-small-dark.svg |
SVG |
Icon only, dark mode |
| Favicon | favicon.svg |
SVG |
Browser tab; fall back to PNG if needed |
| Apple touch icon | icon-180.png |
PNG |
iOS home screen |
| PWA icon (192) | icon-192.png |
PNG |
Progressive web app |
| PWA icon (512) | icon-512.png |
PNG |
PWA splash screen |
Discourse accepts SVG for all logo slots — upload directly without exporting to PNG. Only the favicon and PWA/Apple touch icons strictly require PNG.
Part 5 — Create the SVG Files
Open your text editor and create each file below. For each one:
- Create a new file with the filename shown
- Paste the SVG code exactly
- Save it
logo-light.svg
Wide header logo — light mode: gold crown + dark text on transparent background
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1200 160">
<g transform="translate(8, 16) scale(0.25) rotate(10, 288, 256)">
<path fill="#ffd43b" d="M313 87.2c9.2-7.3 15-18.6 15-31.2 0-22.1-17.9-40-40-40s-40 17.9-40 40c0 12.6 5.9 23.9 15 31.2L194.6 194.8c-10 15.7-31.3 19.6-46.2 8.4L88.9 158.7c4.5-6.4 7.1-14.3 7.1-22.7 0-22.1-17.9-40-40-40s-40 17.9-40 40c0 21.8 17.5 39.6 39.2 40L87.8 393.5c4.7 31.3 31.6 54.5 63.3 54.5l273.8 0c31.7 0 58.6-23.2 63.3-54.5L520.8 176c21.7-.4 39.2-18.2 39.2-40 0-22.1-17.9-40-40-40s-40 17.9-40 40c0 8.4 2.6 16.3 7.1 22.7l-59.4 44.6c-14.9 11.2-36.2 7.3-46.2-8.4L313 87.2z"/>
</g>
<text x="170" y="80" dominant-baseline="middle"
font-family="Arial, 'Helvetica Neue', sans-serif"
font-weight="800" font-size="76" fill="#2d2d2d">digitallysovereign.org</text>
</svg>
logo-dark.svg
Wide header logo — dark mode: white crown + white text on transparent background
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1200 160">
<g transform="translate(8, 16) scale(0.25) rotate(10, 288, 256)">
<path fill="#ffffff" d="M313 87.2c9.2-7.3 15-18.6 15-31.2 0-22.1-17.9-40-40-40s-40 17.9-40 40c0 12.6 5.9 23.9 15 31.2L194.6 194.8c-10 15.7-31.3 19.6-46.2 8.4L88.9 158.7c4.5-6.4 7.1-14.3 7.1-22.7 0-22.1-17.9-40-40-40s-40 17.9-40 40c0 21.8 17.5 39.6 39.2 40L87.8 393.5c4.7 31.3 31.6 54.5 63.3 54.5l273.8 0c31.7 0 58.6-23.2 63.3-54.5L520.8 176c21.7-.4 39.2-18.2 39.2-40 0-22.1-17.9-40-40-40s-40 17.9-40 40c0 8.4 2.6 16.3 7.1 22.7l-59.4 44.6c-14.9 11.2-36.2 7.3-46.2-8.4L313 87.2z"/>
</g>
<text x="170" y="80" dominant-baseline="middle"
font-family="Arial, 'Helvetica Neue', sans-serif"
font-weight="800" font-size="76" fill="#ffffff">digitallysovereign.org</text>
</svg>
Only two things change between light and dark: the
fillon the path (#ffd43b→#ffffff) and thefillon the text (#2d2d2d→#ffffff). Everything else is identical.
logo-small-light.svg
Square icon — light mode: gold crown on transparent background
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 160 160">
<g transform="translate(8, 16) scale(0.25) rotate(10, 288, 256)">
<path fill="#ffd43b" d="M313 87.2c9.2-7.3 15-18.6 15-31.2 0-22.1-17.9-40-40-40s-40 17.9-40 40c0 12.6 5.9 23.9 15 31.2L194.6 194.8c-10 15.7-31.3 19.6-46.2 8.4L88.9 158.7c4.5-6.4 7.1-14.3 7.1-22.7 0-22.1-17.9-40-40-40s-40 17.9-40 40c0 21.8 17.5 39.6 39.2 40L87.8 393.5c4.7 31.3 31.6 54.5 63.3 54.5l273.8 0c31.7 0 58.6-23.2 63.3-54.5L520.8 176c21.7-.4 39.2-18.2 39.2-40 0-22.1-17.9-40-40-40s-40 17.9-40 40c0 8.4 2.6 16.3 7.1 22.7l-59.4 44.6c-14.9 11.2-36.2 7.3-46.2-8.4L313 87.2z"/>
</g>
</svg>
Same transform as the wide logos — the crown sits in an identically-sized area, the viewBox just drops the space reserved for text.
logo-small-dark.svg
Square icon — dark mode: white crown on transparent background
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 160 160">
<g transform="translate(8, 16) scale(0.25) rotate(10, 288, 256)">
<path fill="#ffffff" d="M313 87.2c9.2-7.3 15-18.6 15-31.2 0-22.1-17.9-40-40-40s-40 17.9-40 40c0 12.6 5.9 23.9 15 31.2L194.6 194.8c-10 15.7-31.3 19.6-46.2 8.4L88.9 158.7c4.5-6.4 7.1-14.3 7.1-22.7 0-22.1-17.9-40-40-40s-40 17.9-40 40c0 21.8 17.5 39.6 39.2 40L87.8 393.5c4.7 31.3 31.6 54.5 63.3 54.5l273.8 0c31.7 0 58.6-23.2 63.3-54.5L520.8 176c21.7-.4 39.2-18.2 39.2-40 0-22.1-17.9-40-40-40s-40 17.9-40 40c0 8.4 2.6 16.3 7.1 22.7l-59.4 44.6c-14.9 11.2-36.2 7.3-46.2-8.4L313 87.2z"/>
</g>
</svg>
favicon.svg
Tiny browser tab icon — 32×32 coordinate space, gold crown
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32">
<g transform="translate(1.6, 3.2) scale(0.05) rotate(10, 288, 256)">
<path fill="#ffd43b" d="M313 87.2c9.2-7.3 15-18.6 15-31.2 0-22.1-17.9-40-40-40s-40 17.9-40 40c0 12.6 5.9 23.9 15 31.2L194.6 194.8c-10 15.7-31.3 19.6-46.2 8.4L88.9 158.7c4.5-6.4 7.1-14.3 7.1-22.7 0-22.1-17.9-40-40-40s-40 17.9-40 40c0 21.8 17.5 39.6 39.2 40L87.8 393.5c4.7 31.3 31.6 54.5 63.3 54.5l273.8 0c31.7 0 58.6-23.2 63.3-54.5L520.8 176c21.7-.4 39.2-18.2 39.2-40 0-22.1-17.9-40-40-40s-40 17.9-40 40c0 8.4 2.6 16.3 7.1 22.7l-59.4 44.6c-14.9 11.2-36.2 7.3-46.2-8.4L313 87.2z"/>
</g>
</svg>
Transform math for 32×32:
s = 0.05→ crown center(288×0.05, 256×0.05) = (14.4, 12.8)→ to land at(16, 16):tx = 1.6,ty = 3.2
icon.svg
Source file for all PNG exports — 200×200, gold crown on a dark rounded background
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 200">
<rect width="200" height="200" rx="40" fill="#1e1e2e"/>
<g transform="translate(13.6, 23.2) scale(0.3) rotate(10, 288, 256)">
<path fill="#ffd43b" d="M313 87.2c9.2-7.3 15-18.6 15-31.2 0-22.1-17.9-40-40-40s-40 17.9-40 40c0 12.6 5.9 23.9 15 31.2L194.6 194.8c-10 15.7-31.3 19.6-46.2 8.4L88.9 158.7c4.5-6.4 7.1-14.3 7.1-22.7 0-22.1-17.9-40-40-40s-40 17.9-40 40c0 21.8 17.5 39.6 39.2 40L87.8 393.5c4.7 31.3 31.6 54.5 63.3 54.5l273.8 0c31.7 0 58.6-23.2 63.3-54.5L520.8 176c21.7-.4 39.2-18.2 39.2-40 0-22.1-17.9-40-40-40s-40 17.9-40 40c0 8.4 2.6 16.3 7.1 22.7l-59.4 44.6c-14.9 11.2-36.2 7.3-46.2-8.4L313 87.2z"/>
</g>
</svg>
Transform math for 200×200:
s = 0.3→ crown center(288×0.3, 256×0.3) = (86.4, 76.8)→ to land at(100, 100):tx = 13.6,ty = 23.2
Part 6 — Export PNGs from icon.svg
The Apple touch icon and PWA slots require PNG. Generate all three sizes at once:
pip install cairosvg
import cairosvg
for size in [180, 192, 512]:
cairosvg.svg2png(
url="icon.svg",
write_to=f"icon-{size}.png",
output_width=size,
output_height=size
)
print(f"✅ icon-{size}.png")
Save as export_icons.py and run with python3 export_icons.py.
Part 7 — Upload to Discourse
- Go to Admin → Settings and search for
logo - Upload each file to its matching slot:
| Setting name | File |
|---|---|
logo |
logo-light.svg |
logo dark |
logo-dark.svg |
small logo |
logo-small-light.svg |
small logo dark |
logo-small-dark.svg |
favicon |
favicon.svg (or icon-32.png if SVG isn’t accepted) |
apple touch icon url |
icon-180.png |
pwa icon 192 |
icon-192.png |
pwa icon 512 |
icon-512.png |
- Hard-refresh your browser (
Ctrl+Shift+R/Cmd+Shift+R) to see the new logos immediately.
Adapting This for Your Own Site
| What to change | Where |
|---|---|
| Icon | Replace the <path d="..."/> contents with your own FontAwesome path |
| Icon viewBox | Update rotate(10, W/2, H/2) with your icon’s actual center point |
| Tilt angle | Change 10 in rotate(10, ...) — try 5°–15° for a subtle tip, 0° for upright |
| Icon colour | Change fill="#ffd43b" on the path |
| Text | Replace digitallysovereign.org with your site name |
| Text colour | Change fill="#2d2d2d" (light) and fill="#ffffff" (dark) |
| Dark background | Change fill="#1e1e2e" on the <rect> in icon.svg |
| Corner radius | Change rx="40" on the <rect> — rx="0" for square corners |
Quick Reference Checklist
- FontAwesome icon chosen and raw SVG path copied
-
logo-light.svgcreated and tested in browser -
logo-dark.svgcreated (onlyfillvalues differ from light) -
logo-small-light.svgcreated (same transform, no text) -
logo-small-dark.svgcreated -
favicon.svgcreated -
icon.svgcreated (source for PNG exports) -
cairosvginstalled and PNGs exported at 180, 192, 512px - All files uploaded to correct Discourse settings slots
- Hard-refreshed browser to verify logos appear correctly in both light and dark mode
Questions or ran into something unexpected? Drop a reply below — Discourse installations vary and your icon’s viewBox dimensions may need different transform numbers. ![]()
This topic is available in our Outline documentation library. If you find it useful, please let us know by adding a reply below. You can also add comments in Outline to point out issues or suggest improvements. Thank you!
→ View in Outline