diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
new file mode 100644
index 0000000..3e9487a
--- /dev/null
+++ b/.github/workflows/ci.yml
@@ -0,0 +1,10 @@
+name: Site validation
+on: [push, pull_request]
+permissions:
+ contents: read
+jobs:
+ site-validation:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ - run: python3 tools/check_site.py
diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml
new file mode 100644
index 0000000..ee780c3
--- /dev/null
+++ b/.github/workflows/pages.yml
@@ -0,0 +1,26 @@
+name: Deploy GitHub Pages
+on:
+ push:
+ branches: [main]
+ workflow_dispatch:
+permissions:
+ contents: read
+ pages: write
+ id-token: write
+concurrency:
+ group: pages
+ cancel-in-progress: false
+jobs:
+ deploy:
+ runs-on: ubuntu-latest
+ environment:
+ name: github-pages
+ url: ${{ steps.deployment.outputs.page_url }}
+ steps:
+ - uses: actions/checkout@v4
+ - uses: actions/configure-pages@v5
+ - uses: actions/upload-pages-artifact@v3
+ with:
+ path: site
+ - uses: actions/deploy-pages@v4
+ id: deployment
diff --git a/README.md b/README.md
index e3b66ae..71ea202 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,10 @@
-# faderos.github.io
+# faderOS website
-Public project bootstrap. The reviewed initial source/site import follows in an issue-linked pull request.
+Static GitHub Pages site for https://faderos.github.io. English is the primary language.
+Content is in `site/`; source/docs links point to the canonical GitHub repositories.
-Licensed under GNU GPLv3.
+Preview: `python3 -m http.server --directory site 8080`.
+Deployment uses the minimal Pages workflow on `main`, with no external JS/fonts
+or build dependency. Branding is original outlined SVG; GNU GPLv3.
+
+Changes follow the issue-linked PR workflow in CONTRIBUTING.md.
diff --git a/site/.nojekyll b/site/.nojekyll
new file mode 100644
index 0000000..e69de29
diff --git a/site/assets/README.md b/site/assets/README.md
new file mode 100644
index 0000000..cf24453
--- /dev/null
+++ b/site/assets/README.md
@@ -0,0 +1,15 @@
+# faderOS brand assets
+
+Original AI-assisted concept with clean vector contour artwork. The exact product spelling is **faderOS**.
+
+Use `logo.svg` on light surfaces, `logo-on-dark.svg` on dark surfaces, and
+`logo-monochrome.svg` for one-colour printing. SVG artwork uses outlines and
+has no font dependency. PNG exports have transparent backgrounds.
+
+Accent: `#ff713d`. Main dark colour: `#141820`. Do not stretch the artwork.
+Leave at least the height of one slider cap around the logo. The concept PNG
+is retained as design provenance; use the vector master for print.
+
+Licensed under GNU GPLv3, matching the project.
+
+For A4 labels, choose A4 paper, no extra page margins, and Actual size / 100%. The sheet already contains print-safe margins.
diff --git a/site/assets/icon-on-dark.svg b/site/assets/icon-on-dark.svg
new file mode 100644
index 0000000..c3c2c9a
--- /dev/null
+++ b/site/assets/icon-on-dark.svg
@@ -0,0 +1,7 @@
+faderOS
+
+
+
+
+
+
diff --git a/site/assets/icon.png b/site/assets/icon.png
new file mode 100644
index 0000000..53801ad
Binary files /dev/null and b/site/assets/icon.png differ
diff --git a/site/assets/icon.svg b/site/assets/icon.svg
new file mode 100644
index 0000000..8f28bc6
--- /dev/null
+++ b/site/assets/icon.svg
@@ -0,0 +1,7 @@
+faderOS
+
+
+
+
+
+
diff --git a/site/assets/logo-monochrome.svg b/site/assets/logo-monochrome.svg
new file mode 100644
index 0000000..c9196f2
--- /dev/null
+++ b/site/assets/logo-monochrome.svg
@@ -0,0 +1,7 @@
+faderOS
+
+
+
+
+
+
diff --git a/site/assets/logo-on-dark.png b/site/assets/logo-on-dark.png
new file mode 100644
index 0000000..4588d74
Binary files /dev/null and b/site/assets/logo-on-dark.png differ
diff --git a/site/assets/logo-on-dark.svg b/site/assets/logo-on-dark.svg
new file mode 100644
index 0000000..06ce639
--- /dev/null
+++ b/site/assets/logo-on-dark.svg
@@ -0,0 +1,7 @@
+faderOS
+
+
+
+
+
+
diff --git a/site/assets/logo-white.svg b/site/assets/logo-white.svg
new file mode 100644
index 0000000..95c4160
--- /dev/null
+++ b/site/assets/logo-white.svg
@@ -0,0 +1,7 @@
+faderOS
+
+
+
+
+
+
diff --git a/site/assets/logo.png b/site/assets/logo.png
new file mode 100644
index 0000000..dbd5b92
Binary files /dev/null and b/site/assets/logo.png differ
diff --git a/site/assets/logo.svg b/site/assets/logo.svg
new file mode 100644
index 0000000..40da3b2
--- /dev/null
+++ b/site/assets/logo.svg
@@ -0,0 +1,7 @@
+faderOS
+
+
+
+
+
+
diff --git a/site/assets/stickers-a4.svg b/site/assets/stickers-a4.svg
new file mode 100644
index 0000000..1e2565b
--- /dev/null
+++ b/site/assets/stickers-a4.svg
@@ -0,0 +1,73 @@
+Project sticker sheet Project labels Print at 100% / Actual size. Cut on the dashed guides.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+85 × 28 mm labels · Original project artwork · GNU GPLv3
\ No newline at end of file
diff --git a/site/index.html b/site/index.html
new file mode 100644
index 0000000..2442bb9
--- /dev/null
+++ b/site/index.html
@@ -0,0 +1,3 @@
+
faderOS — Professional panels. Modern workflows. Professional panels. Modern workflows. Give your panel a new working life. A control platform for professional video hardware. Keep the tactile operation of a real panel while connecting it to modern software and switchers.
CONTROL / RENDEROPEN SOURCE
BKDS-2010 PANEL I/O
faderOS CONTROL + MAPPINGS
01 Physical panel validated03 Independent server profilesGPLv3 Open source
A clear division of responsibility One workflow, reusable components. Prepare the system deliberately, operate the live output explicitly, and keep hardware, control logic and rendering independently maintainable.
01 / THE PANEL Hardware-first operation Buttons, lamps, encoders, joystick, T-bar, LCD and segment displays are part of the control model. Sony BKDS-2010 is the first supported panel.
02 / THE CONTROLLER One surface, three servers OBS, vMix, ATEM and kavtor adapters share a control model. Three server profiles can stay connected, with mappings and settings in the embedded web interface.
03 / THE PLATFORM Linux now. Embedded next. The Linux controller is the working development platform. RP2350 + W5500 is the first embedded target; UART bring-up is available and the full embedded runtime is still being built.
Start here Documentation follows the code. Current guides live with the source. Examples and tests make the behavior reviewable; dedicated manuals will grow alongside the projects.
cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
+cmake --build build --parallel
+ctest --test-dir build --output-on-failureEarly development Controller 0.28.0 · panel firmware 0.24 The original Sony EPROM remains available for recovery. RAM update and remote boot are physically validated. The public tree excludes Sony ROMs, manuals and private backups.
What comes next The full RP2350 network runtime, additional panel integrations and network MIDI are roadmap work.
Development follows issue → pull request → reviewed merge, with CI and documented validation limits.
Contribute ↗ On screen. On the desk. Original artwork, ready to use. Vector masters for websites, manuals and equipment labels. Colour, dark-surface and one-colour versions are available, with no font dependency.
85 × 28 mm labels. Print at 100% / Actual size.
\ No newline at end of file
diff --git a/site/styles.css b/site/styles.css
new file mode 100644
index 0000000..5ece932
--- /dev/null
+++ b/site/styles.css
@@ -0,0 +1,2 @@
+*{box-sizing:border-box}html{scroll-behavior:smooth}body{margin:0;background:#0e1219;color:#edf2f7;font:16px/1.65 system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif}a{color:inherit;text-decoration:none}a:focus-visible,summary:focus-visible{outline:3px solid var(--accent);outline-offset:5px}p{color:#aebdca}header,main,footer{max-width:1180px;margin:auto;padding:0 28px}header{display:flex;align-items:center;justify-content:space-between;gap:28px;padding-top:26px;padding-bottom:26px;border-bottom:1px solid #26323d}.brand img{display:block;width:210px;height:auto}nav{display:flex;gap:24px;flex-wrap:wrap;font-size:14px;color:#c3cfda}nav a:hover{color:var(--accent)}.hero{padding:76px 0 62px;display:grid;grid-template-columns:1.1fr 1fr;gap:64px;align-items:center}.eyebrow{text-transform:uppercase;font-size:12px;letter-spacing:.16em;color:var(--accent);font-weight:700}h1{font-size:clamp(40px,5.5vw,68px);line-height:1.08;letter-spacing:-.055em;margin:20px 0;max-width:15ch}h2{font-size:34px;letter-spacing:-.035em;line-height:1.15;margin:0 0 16px}h3{font-size:19px;line-height:1.3;margin:0 0 12px}.lead{font-size:18px;max-width:52ch}.actions{display:flex;gap:12px;flex-wrap:wrap;margin-top:28px}.button{display:inline-block;padding:12px 18px;border:1px solid #394654;border-radius:8px;font-size:14px;font-weight:700}.primary{background:var(--accent);border-color:var(--accent);color:#0e1219}.button:hover{transform:translateY(-1px)}.system{background:#151d27;border:1px solid #34414e;border-radius:18px;padding:28px;box-shadow:0 20px 60px #0004}.system-head{display:flex;justify-content:space-between;margin-bottom:28px;font:12px/1.5 ui-monospace,monospace;color:#adc0cf}.indicator{width:8px;height:8px;background:var(--accent);border-radius:50%;display:inline-block;margin-right:8px}.flow{display:grid;gap:14px}.node{padding:18px;border:1px solid #334553;border-radius:8px;display:flex;align-items:center;justify-content:space-between;font-size:14px;background:#101820}.node strong{font-size:18px}.node span{font:12px ui-monospace,monospace;color:#a7bbcc}.arrow{height:14px;border-left:2px solid var(--accent);margin-left:28px;position:relative}.arrow:after{content:"";position:absolute;bottom:0;left:-5px;border-left:4px solid transparent;border-right:4px solid transparent;border-top:5px solid var(--accent)}.outputs{display:grid;grid-template-columns:repeat(2,1fr);gap:10px}.outputs .node{padding:12px;justify-content:center}.tally{border-color:#c8b433}.pgm{border-color:#fa6262}.pvw{border-color:#64d09d}.strip{display:flex;gap:28px;flex-wrap:wrap;padding:22px 0;border-top:1px solid #2c3946;border-bottom:1px solid #2c3946;font-size:13px;color:#bccbd6}.strip b{color:var(--accent);margin-right:8px}section{padding:66px 0;border-bottom:1px solid #26323d}.section-intro{max-width:700px}.cards{display:grid;grid-template-columns:repeat(3,1fr);gap:18px;margin-top:28px}.card{background:#151d27;border:1px solid #2c3946;border-radius:12px;padding:26px}.card .number{font:12px ui-monospace,monospace;color:var(--accent);display:block;margin-bottom:18px}.card p{font-size:14px;margin-bottom:0}.split{display:grid;grid-template-columns:1fr 1fr;gap:60px}.links{display:grid;gap:10px}.resource{display:flex;align-items:center;justify-content:space-between;border-bottom:1px solid #344452;padding:16px 0}.resource:hover{color:var(--accent)}.resource small{display:block;font-size:12px;color:#91a4b3}.resource i{font-style:normal;font-size:20px;color:var(--accent)}.status{border-left:3px solid var(--accent);padding-left:22px}.status p{margin:0 0 14px;font-size:14px}.badge{display:inline-block;color:var(--accent);border:1px solid var(--accent);border-radius:20px;padding:4px 10px;font-size:11px;font-weight:700;letter-spacing:.1em;text-transform:uppercase}.code{font:13px/1.6 ui-monospace,monospace;padding:18px;border-radius:10px;border:1px solid #344452;background:#080c12;overflow:auto;white-space:pre;color:#d7e2ec}.brand-card{background:#eef3f6;color:#141820;padding:22px;border-radius:12px;display:flex;align-items:center;justify-content:center;min-height:130px}.brand-card img{width:100%;max-width:350px;height:auto}footer{padding-top:28px;padding-bottom:32px;display:flex;justify-content:space-between;flex-wrap:wrap;gap:20px;color:#92a5b5;font-size:12px}.muted{color:#91a4b3;font-size:13px}@media(max-width:900px){.hero{grid-template-columns:1fr;gap:36px;padding:44px 0}.cards{grid-template-columns:1fr}.split{grid-template-columns:1fr;gap:28px}header{align-items:flex-start;flex-direction:column;gap:20px}.brand img{width:185px}section{padding:46px 0}h1{max-width:18ch}.system{max-width:620px}nav{gap:18px}header,main,footer{padding-left:20px;padding-right:20px}}@media(prefers-reduced-motion:reduce){html{scroll-behavior:auto}.button:hover{transform:none}}
+.hero>*,.split>*,.cards>*{min-width:0}.code{max-width:100%}.node{gap:8px;flex-wrap:wrap}
diff --git a/tools/check_site.py b/tools/check_site.py
new file mode 100644
index 0000000..9d6a1e4
--- /dev/null
+++ b/tools/check_site.py
@@ -0,0 +1,18 @@
+from html.parser import HTMLParser
+from pathlib import Path
+import xml.etree.ElementTree as ET
+class Audit(HTMLParser):
+ def __init__(self):super().__init__();self.links=[];self.ids=set();self.language='';self.h1=0
+ def handle_starttag(self,tag,attrs):
+ d=dict(attrs)
+ if tag=='html':self.language=d.get('lang','')
+ if tag=='h1':self.h1+=1
+ if 'id' in d:self.ids.add(d['id'])
+ for name in ('src','href'):
+ if name in d:self.links.append(d[name])
+root=Path('site');a=Audit();a.feed((root/'index.html').read_text());assert a.language=='en' and a.h1==1
+for link in a.links:
+ if link.startswith('#'):assert link[1:] in a.ids,link
+ elif '://' not in link:assert (root/link).is_file(),link
+for p in (root/'assets').glob('*.svg'):ET.parse(p)
+print('PASS English, heading structure, local links/anchors and SVG parsing')