Skip to content

Instantly share code, notes, and snippets.

@KenwoodFox
Created July 7, 2026 19:31
Show Gist options
  • Select an option

  • Save KenwoodFox/906b5a2e621266f09790a852c947f617 to your computer and use it in GitHub Desktop.

Select an option

Save KenwoodFox/906b5a2e621266f09790a852c947f617 to your computer and use it in GitHub Desktop.
How to install KiCanvas as a renderer for your Gitea server

KiCanvas On Gitea

Ever wanted KiCanvas locally on your own gitea install? :)

1. Get the KiCanvas bundle

cd <path/to/your/gitea/data>
mkdir -p data/gitea/public/assets data/gitea/templates/custom data/gitea/scripts
wget -O data/gitea/public/assets/kicanvas.js https://kicanvas.org/kicanvas/kicanvas.js

2. Load kicanvas.js site-wide

data/gitea/templates/custom/header.tmpl:

<script type="module" src="{{AppSubUrl}}/assets/kicanvas.js"></script>

3. The render script

data/gitea/scripts/render-kicanvas.sh reads the file content and inlines it into a <kicanvas-source>

#!/bin/sh
FILE="$1"

if head -c 50 "$FILE" | grep -q "kicad_pcb"; then
  TYPE="board"
else
  TYPE="schematic"
fi

printf "<kicanvas-embed controls=\"full\">\n<kicanvas-source type=\"%s\">\n" "$TYPE"
sed -e "s/&/\\&amp;/g" -e "s/</\\&lt;/g" -e "s/>/\\&gt;/g" "$FILE"
printf "</kicanvas-source>\n</kicanvas-embed>\n"
chown git:git data/gitea/scripts/render-kicanvas.sh
chmod +x data/gitea/scripts/render-kicanvas.sh

Important: everything under data/gitea/{scripts,public,templates} must be owned by git:git

4. app.ini additions

Append to data/gitea/conf/app.ini:

[markup.kicad]
ENABLED = true
FILE_EXTENSIONS = .kicad_sch, .kicad_pcb
RENDER_COMMAND = "/data/gitea/scripts/render-kicanvas.sh"
IS_INPUT_FILE = true

[markup.sanitizer.kicad.1]
ELEMENT = kicanvas-embed
ALLOW_ATTR = controls

[markup.sanitizer.kicad.2]
ELEMENT = kicanvas-embed
ALLOW_ATTR = controlslist

[markup.sanitizer.kicad.3]
ELEMENT = kicanvas-embed
ALLOW_ATTR = id

[markup.sanitizer.kicad.4]
ELEMENT = kicanvas-source
ALLOW_ATTR = type

5. Restart

docker compose restart gitea
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment