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 sheetProject labelsPrint 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.
faderOS
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-2010PANEL I/O
faderOSCONTROL + MAPPINGS
OBS
vMix
ATEM
kavtor
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-failure
Early 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.

faderOS colour logo
\ 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')