Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
426 commits
Select commit Hold shift + click to select a range
200d7f7
content(academy): address #12 review — align table names with actual …
WilcoLouwerse Jun 8, 2026
4e18cbd
ci(docs): deploy only from documentation branch (decouple from releas…
Jun 8, 2026
6369257
ci(docs): deploy only from documentation branch (decouple from releas…
Jun 8, 2026
f8f35a2
ci(docs): documentation-branch deploy standard
Jun 8, 2026
ba54e8b
feat(apps): canonical AppGlyph logos, per-app docs subdomains, combin…
juanclaude-conduction Jun 8, 2026
0044b0f
Merge pull request 'tutorial(academy): rewrite MCP server tutorial — …
Jun 8, 2026
6e242cc
Merge pull request 'academy: OpenSpec tutorial Part 3 (optional) — re…
Jun 8, 2026
2285d9e
Updated website
remko48 Jun 11, 2026
00e2a76
Updated website
remko48 Jun 11, 2026
2b9c769
academy: expand OpenSpec + Hydra series, English slugs fleet-wide
Jun 11, 2026
04140bc
Merge remote-tracking branch 'origin/development' into development
Jun 11, 2026
c8ea8b4
fix(redirects): restore old Dutch slugs in redirect from-fields
Jun 11, 2026
6d1444e
Merge branch 'development' into documentation
Jun 11, 2026
842afd3
docs(academy): add Woo tutorial Parts 3-4 (publish/harvest catalog + …
Jun 15, 2026
b25b9ab
Merge pull request 'Academy: Woo tutorial Parts 3-4 (publish/harvest …
Jun 15, 2026
7f559f5
fix(docs-build): keep app-downloads stub when stats fetch fails
Jun 15, 2026
b5ff9fe
Merge pull request 'fix(docs-build): keep app-downloads stub when sta…
Jun 15, 2026
1ab86f4
docs(academy): rewrite Woo tutorial series UI-first (Parts 1-4) + DCA…
Jun 15, 2026
a893cc8
Merge pull request 'Academy: Woo tutorial series rewritten UI-first (…
Jun 15, 2026
219a869
docs(academy): host woo/dcat configs + fix tutorial import URLs and P…
Jun 16, 2026
acbcaae
fix(academy): unblock build + add tutorial series navigation
Jun 16, 2026
a8a9eda
docs(academy): render Woo API responses as json code blocks, not scre…
Jun 16, 2026
f976ed2
docs(academy): Part 4 — UI/API/PHP synced tabs per step
Jun 16, 2026
6d05cf8
fix(academy): point NL Woo tutorial at conduction.nl/oas (dead Codebe…
Jun 18, 2026
7e173f6
Update src/data/partners-catalog.js
Jun 19, 2026
6d4bbdc
academy/2026-05-19-openwoo-community-meetings/index.mdx bijwerken
Jun 19, 2026
6b0b271
chore: add secret patterns to .gitignore (.env, *.pem, *.key, *_rsa, …
MWest2020 Jun 19, 2026
00ec954
partners: correct Acato location from Almere to Den Haag in NL page
MWest2020 Jun 19, 2026
aabd30a
docs(academy): fix Hydra clone URL + add 'follow along' clone callouts
WilcoLouwerse Jun 25, 2026
5d5904e
Merge pull request 'docs(academy): fix Hydra clone URL + add 'follow …
Jun 25, 2026
79a7525
docs(academy): explain two-repo split + add quick-setup TL;DR callouts
WilcoLouwerse Jun 25, 2026
7bac857
Merge remote-tracking branch 'origin/documentation' into docs/repo-pu…
WilcoLouwerse Jun 25, 2026
623dd3b
docs(academy/nl): sync NL translations with EN drift from PR #20 + PR…
WilcoLouwerse Jun 25, 2026
d5dd0b1
Merge pull request 'docs(academy): explain two-repo split + quick-set…
Jun 25, 2026
7201cbd
docs(academy): sync OS list EN↔NL + fix /nl/ prefix on Deel 5 link
WilcoLouwerse Jun 25, 2026
479c40d
Merge pull request 'docs(academy): sync OS list EN↔NL + fix /nl/ pref…
Jun 25, 2026
e473380
academy: add "Build a Nextcloud app with OpenBuild, no code required"
rubenvdlinde Jun 27, 2026
c2abd6b
academy: fix image imports + add Flow (Step 10) and MCP/AI (Step 11) …
rubenvdlinde Jun 27, 2026
b979f91
academy: refresh dashboard + pet-detail screenshots (no double-titles…
rubenvdlinde Jun 27, 2026
9b5227c
academy(openbuild): no-code rewrite + a screenshot for every step
rubenvdlinde Jun 27, 2026
e1965c8
academy(openbuild): clean screenshots — no walkthrough, app-branded t…
rubenvdlinde Jun 27, 2026
ef59780
academy(openbuild): rendered-app shots show white paw icon in top-bar
rubenvdlinde Jun 27, 2026
c4e5101
academy(openbuild): Step 10 uses the new visual Edit flows editor
rubenvdlinde Jun 27, 2026
ad1c68e
academy(openbuild): drop the raw flow JSON from Step 10 (no-code)
rubenvdlinde Jun 27, 2026
9d969b5
academy(openbuild): show the schema editor (Step 2) + real MCP proofs…
rubenvdlinde Jun 27, 2026
38a5cd1
academy(openbuild): step 9 search now shows the pet object itself
Jun 27, 2026
b297cb9
academy(openbuild): show HOW to author — edit menu, every editor, edi…
Jun 28, 2026
d7dd3bd
academy(openbuild): big detail-page section — widgets, with worked ex…
Jun 28, 2026
836e0a9
academy(openbuild): Conduction voice sweep, widget screenshots, onboa…
Jun 28, 2026
b5b6585
docs(academy): OpenBuild tutorial — onboarding, chrome, sidebar logs,…
Jun 28, 2026
20643fd
Merge pull request 'Deploy: publish academy content (OpenBuild tutori…
Jun 28, 2026
edc2fae
fix(academy): escape {name} in OpenBuild tutorial so MDX build passes
Jun 28, 2026
94befb6
Merge pull request 'Deploy: MDX build fix for OpenBuild tutorial' (#2…
Jun 28, 2026
4d0aa01
docs(academy): data-pipeline capstone + OpenCatalogi deep tutorial
Jun 28, 2026
4dbede2
docs(academy): add Hydra / Manifesting / OpenBuild webinar pages
Jun 30, 2026
a26c0a1
Merge pull request 'docs(academy): add Hydra / Manifesting / OpenBuil…
Jun 30, 2026
6482945
Merge pull request 'Deploy: publish Hydra / Manifesting / OpenBuild w…
Jun 30, 2026
4d54cf2
fix(academy): remove dangling BlogSeriesNav reference that broke the …
Jun 30, 2026
103cfc1
Merge pull request 'fix(academy): remove dangling BlogSeriesNav refer…
Jun 30, 2026
e60d5a6
Merge pull request 'Deploy: fix docs build (remove BlogSeriesNav) + p…
Jun 30, 2026
8829406
Merge pull request 'Reconcile: bring data-pipeline / OpenCatalogi cap…
Jun 30, 2026
f6dcdca
docs(academy): embed YouTube recordings on the three webinar pages
Jun 30, 2026
5aa6322
Merge pull request 'docs(academy): embed YouTube recordings on the th…
Jun 30, 2026
03e377f
feat(academy): webinar video in the hero + link each webinar to its t…
Jul 1, 2026
3d8866b
Merge pull request 'feat(academy): webinar video in hero + link webin…
Jul 1, 2026
88d4a8b
fix(academy): use local Conduction avatar; remove placeholder OpenTel…
Jul 1, 2026
8a10c85
Merge pull request 'fix(academy): local Conduction avatar + remove pl…
Jul 1, 2026
76687e2
fix(academy): only feature a card on the unfiltered view so counts ma…
Jul 2, 2026
20fe215
Merge pull request 'fix(academy): featured card only on unfiltered vi…
Jul 2, 2026
5018fcd
fix(academy): use cobalt Conduction avatar instead of gold
Jul 2, 2026
e95f6aa
Merge pull request 'fix(academy): cobalt Conduction avatar (was gold,…
Jul 2, 2026
5f96576
partners: drop incorrect city from Acato summary
Jul 2, 2026
43526bc
fix(apps): render canonical app glyphs from the preset AppGlyph
Jul 3, 2026
9128f99
Merge pull request 'fix(apps): render canonical app glyphs from the p…
Jul 3, 2026
3fca55d
Merge documentation into development: consolidate recent academy content
Jul 3, 2026
ebd2a38
Merge development into main: promote consolidated website + academy c…
Jul 3, 2026
44344fa
chore: dedupe .gitignore after the main-merge union
Jul 3, 2026
a608a8b
chore: dedupe .gitignore (align with development)
Jul 3, 2026
8ca971c
academy/2026-05-19-openwoo-community-meetings/index.mdx bijwerken
Jul 3, 2026
2002dc7
fix(apps): stop filled app glyphs being stroked (readability)
Jul 3, 2026
58ea9ad
fix(apps): stop filled app glyphs being stroked (readability)
Jul 3, 2026
bfd1288
chore(deps): bump preset to ^3.27.1, drop the app-glyph CSS bridge
Jul 3, 2026
f7b79f8
chore(deps): bump preset to ^3.27.1, drop the app-glyph CSS bridge
Jul 3, 2026
9674092
content(academy): add "Big tech de deur uit" part 2 — Nextcloud
rjzondervan Jul 3, 2026
fd9f24c
Add remark about Euro Office
rjzondervan Jul 3, 2026
60a8be1
revise titles with the series name
rjzondervan Jul 3, 2026
e4ce498
Fix some style issues
rjzondervan Jul 3, 2026
fdc9ee2
content: mydash→launchpad rebrand + app page/i18n updates + AppGlyph/…
Jul 9, 2026
c1839be
Merge remote-tracking branch 'origin/main' into HEAD
Jul 9, 2026
eb9ae32
Merge pull request 'content(academy): add "Big tech de deur uit" part…
Jul 9, 2026
5af5b91
academy: add GitHub publish/pull round-trip to the OpenBuild app tuto…
Jul 9, 2026
44477ac
Merge origin/academy/blue-conduction-avatar: reconcile OpenBuild GitH…
Jul 9, 2026
51073a2
content(academy): add Shillinq getting-started tutorial
Jul 10, 2026
11a286b
content(academy): add 'Build personalised dashboards with LaunchPad' …
Jul 10, 2026
8fa9134
Merge pull request 'content(academy): add 'Build personalised dashboa…
Jul 10, 2026
72ca862
docs(academy): update OpenBuild tutorial Step 1 + edit-menu list to m…
Jul 10, 2026
94d57ab
Merge pull request 'docs(academy): OpenBuild tutorial Step 1 + edit-m…
Jul 10, 2026
0bc9dc9
wip: preserve uncommitted work (cw-tut4, 2026-07-10)
Jul 10, 2026
fae9b20
wip: preserve uncommitted main-checkout work (2026-07-10)
Jul 10, 2026
f028fef
Merge academy/blue-conduction-avatar (consolidation 2026-07-10)
Jul 10, 2026
42c5f25
Merge wip/cw-app-pages-2026-07-10 (consolidation 2026-07-10)
Jul 10, 2026
8d80b10
Merge tutorial/openbuild-no-code (consolidation 2026-07-10)
Jul 10, 2026
cf934de
feat(support): submit the support + partner forms as Pipelinq leads
Jul 12, 2026
a4f8678
Merge pull request 'Support + partner forms: capture enquiries as Pip…
Jul 12, 2026
fe3d89f
content(academy): add OpenBuild demo as a webinar entry
Jul 13, 2026
9524e0a
Merge pull request 'content(academy): add OpenBuild demo as a webinar…
Jul 13, 2026
02b6c62
content(academy): rewrite OpenBuild demo in Conduction voice
Jul 13, 2026
69f62c0
Merge pull request 'content(academy): rewrite OpenBuild demo in Condu…
Jul 13, 2026
4395805
content(apps): refresh HRMQ page — payroll engine, filings, full HR s…
Jul 15, 2026
b03f8b9
Merge pull request 'content(apps): refresh HRMQ page — payroll engine…
Jul 15, 2026
0749f5f
Merge remote-tracking branch 'github/development' into development
Jul 23, 2026
a35a0e1
docs: drop obsolete 'moved to Codeberg' banner — GitHub is primary again
Jul 23, 2026
18a1d3d
Merge remote-tracking branch 'origin/development' into HEAD
rubenvdlinde Jul 23, 2026
e3908cd
Merge pull request #35 from ConductionNL/feature/tutorial-nextcloud-h…
rubenvdlinde Jul 23, 2026
a75ab66
chore(deps): bump the npm_and_yarn group across 1 directory with 9 up…
dependabot[bot] Jul 23, 2026
75c84eb
chore(deps): bump @docusaurus/core from 3.10.1 to 3.10.2 (#125)
dependabot[bot] Jul 23, 2026
4cc6eca
docs(academy): Hermiq skills tutorial series (4 parts) (#128)
rubenvdlinde Jul 28, 2026
9fdbdee
docs(academy): real captures for hermiq tutorials + deployment archit…
rubenvdlinde Jul 28, 2026
d999431
docs(academy): voice calibration pass on hermiq skills tutorials (#131)
rubenvdlinde Jul 29, 2026
52c4db7
docs(academy): add Doriath, Hermiq and NLDesign webinars (#132)
rubenvdlinde Aug 3, 2026
9b4495e
chore(ci): retire the stale Forgejo deploy workflow (#133)
rubenvdlinde Aug 3, 2026
a78e89e
feat(privacy): ship the cookie consent banner and make it reachable (…
rubenvdlinde Aug 5, 2026
ded0d5f
content(ai): add a How we use AI page in both locales (#138)
rubenvdlinde Aug 5, 2026
26b8d97
content(ai): IBM quote, blogs in our voice, AI Act scope incl. Articl…
rubenvdlinde Aug 5, 2026
687955a
fix(cookies): on-demand banner, plus the terminal shell and Space Inv…
rubenvdlinde Aug 5, 2026
994a263
ci: deploy to Cloudflare from Actions, retire GitHub Pages (#141)
rubenvdlinde Aug 5, 2026
9f1cb50
test(e2e): Playwright suite gating the deploy, + npm release path for…
rubenvdlinde Aug 5, 2026
1f80b63
test(e2e): run the suite against a deployed site, and close a typing …
rubenvdlinde Aug 5, 2026
9ed3226
build(deps): bump @conduction/docusaurus-preset to 3.28.0 (#145)
rubenvdlinde Aug 5, 2026
1b26338
chore(deps): bump postcss in the npm_and_yarn group across 1 director…
dependabot[bot] Aug 6, 2026
93a8050
fix(pages): repair hydration on five pages, add a site-wide smoke sui…
rubenvdlinde Aug 6, 2026
518dde6
fix(a11y): give every page an h1, stop /connext/ scrolling sideways (…
rubenvdlinde Aug 6, 2026
1247f63
content(ai): answer the images and own-products questions with facts …
rubenvdlinde Aug 6, 2026
ba3b118
test(e2e): run the remote suite serially (#149)
rubenvdlinde Aug 6, 2026
0e24dcd
content(academy): governance is the silent killer of open source (Nix…
rubenvdlinde Aug 10, 2026
cda92be
content(academy): move governance blog to /academy/opinion/ with titl…
rubenvdlinde Aug 10, 2026
f575d01
content(academy): opinion section under /academy/opinion/, two-wolves…
rubenvdlinde Aug 10, 2026
0c09109
fix(academy): align NL platform-moment slug with opinion section; eul…
rubenvdlinde Aug 10, 2026
70c0cff
content(academy): drop the La Suite case from the governance post (#154)
rubenvdlinde Aug 10, 2026
6ee163d
content(academy): positive rewrite of the two-wolves post — shorter, …
rubenvdlinde Aug 10, 2026
b538f7b
content(academy): give each wolf its own portrait — cultures, stakes,…
rubenvdlinde Aug 10, 2026
a112f55
content(academy): scope the hook to government projects; 'care to cou…
rubenvdlinde Aug 10, 2026
4cf55fb
content(academy): the 1944 Simple Sabotage Field Manual mirror — bad …
rubenvdlinde Aug 10, 2026
2f956c6
content(academy): nobody meaning harm makes bad governance harder to …
rubenvdlinde Aug 10, 2026
534b644
content(academy): bold the sabotage claim (#160)
rubenvdlinde Aug 10, 2026
6662516
content(academy): ai: assisted disclosure on the two-wolves post (EU …
rubenvdlinde Aug 10, 2026
aa4d546
fix(academy): mount the AiDisclosure banner in the swizzled BlogPostP…
rubenvdlinde Aug 10, 2026
c6c9608
fix(academy): subtle byline-style AI mark linking to /ai; featured-ca…
rubenvdlinde Aug 10, 2026
d044d10
content(academy): This is going to hurt — six-part opinion series (#164)
rubenvdlinde Aug 10, 2026
03af03d
fix(academy): app CTAs above the Sources endnotes; Hermiq glyph (inte…
rubenvdlinde Aug 11, 2026
8b692ee
content(academy): hurt-series polish round — reader-feedback voice sw…
rubenvdlinde Aug 11, 2026
0bd0c28
content(academy)+fix(academy): part-5 info wells + Opinions chip on t…
rubenvdlinde Aug 11, 2026
c7300c5
fix(academy): inline app CTA above Sources on the feed-the-wolf post …
rubenvdlinde Aug 11, 2026
21ac411
feat(academy): configurable post hero + Dutch translation of the two-…
rubenvdlinde Aug 11, 2026
bb9f01b
content(academy): reclassify the hurt series as blog, add VideoEmbed,…
rubenvdlinde Aug 11, 2026
c051237
content(academy): swap the Software Catalog app CTA on the two-wolves…
rubenvdlinde Aug 11, 2026
95e3513
feat(academy): topical hero glyph per post (#173)
rubenvdlinde Aug 11, 2026
0d8db0f
content(academy): the end of self-hosted software, in the ownership p…
rubenvdlinde Aug 11, 2026
4c8ebad
content(academy): SharePoint, where lapsing your licence means uninst…
rubenvdlinde Aug 11, 2026
bc6e60c
content(academy): reflow the Terminator and lowest-common-denominator…
rubenvdlinde Aug 11, 2026
317520f
chore(deps): bump the npm_and_yarn group across 1 directory with 3 up…
dependabot[bot] Aug 11, 2026
cc63eb2
content(academy): drop two placeholder posts
rubenvdlinde Aug 12, 2026
389ac49
fix(academy): restore markdown spacing inside hfaw-split and hfaw-well
rubenvdlinde Aug 12, 2026
66c8ada
content(academy): La Frankendesk
rubenvdlinde Aug 12, 2026
34f2e7e
Merge pull request #177 from ConductionNL/dependabot/npm_and_yarn/npm…
rubenvdlinde Aug 14, 2026
50d3bdc
docs(apps): add an App health page with per-branch Code Quality status
rubenvdlinde Aug 17, 2026
eee8355
Merge pull request #178 from ConductionNL/feat/app-health-page
rubenvdlinde Aug 17, 2026
3aec9d0
revert(apps): remove App health page — it belongs on docs.conduction.…
rubenvdlinde Aug 17, 2026
8b8b1e3
content(apps): rewrite all 21 product pages for the business owner, N…
rubenvdlinde Aug 18, 2026
a21e1c1
content(apps): round-2 review — four ways, live atomics, full widget …
rubenvdlinde Aug 18, 2026
78af225
test(e2e): product-page suite + preset 3.35, every atomic animated (#…
rubenvdlinde Aug 18, 2026
ef0a53c
feat: adopt the -iq product names across the site (display names only…
rubenvdlinde Aug 21, 2026
4027bbc
fix: Planninq (not Planiq), Pipelinq casing, and e2e coverage for the…
rubenvdlinde Aug 21, 2026
2604cfb
fix(ci): the Cloudflare secrets are CF_API_TOKEN / CF_ACCOUNT_ID (#186)
rubenvdlinde Aug 23, 2026
1b23e8a
ci: name the real cause when the Pages deploy is refused, and gate pr…
rubenvdlinde Aug 24, 2026
29ab3f8
feat(apps): move the twelve renamed app pages to their -iq paths (#188)
rubenvdlinde Aug 24, 2026
55ae36d
fix: repoint stale Codeberg URLs to GitHub across the public site (#189)
rubenvdlinde Aug 24, 2026
843d5eb
content: product pages in the reader's language, and Vae Victis 1-3 (…
rubenvdlinde Aug 24, 2026
3abc608
feat(site): app descriptions (interim), VideoEmbed component, part-1 …
rubenvdlinde Aug 24, 2026
8d53f8a
feat(connext): a downloadable ecosystem compose and the tutorial for …
rubenvdlinde Aug 27, 2026
702c473
docs(connext): the sample output says thematiq, because that is what …
rubenvdlinde Aug 27, 2026
a918714
docs(academy): a Run-locally tutorial for each of the 21 apps (#193)
rubenvdlinde Aug 28, 2026
36cc7d8
content(academy): La Frankendesk, a voice pass and four animated diag…
rubenvdlinde Sep 18, 2026
6938a4c
feat(arcade): the Contributor Week giveaway page and campaign config …
rubenvdlinde Sep 18, 2026
22c48b7
chore(preset): 3.41.1, which names the pick-wear bar (#201)
rubenvdlinde Sep 18, 2026
cabdfb6
feat(arcade): sixteen games, each behind its own way in (#202)
rubenvdlinde Sep 19, 2026
5e8baad
build(deps): resolve @conduction/docusaurus-preset to 3.37.0
remko48 Sep 19, 2026
c5bc0f5
build(deps): add Font Awesome 7 for contact icons
remko48 Sep 19, 2026
79f0472
feat(navbar): swizzle Navbar with a custom mobile drawer
remko48 Sep 19, 2026
41a223d
feat(about): add local EmployeeCard with photo and brand-icon support
remko48 Sep 19, 2026
75e6039
feat(about): render the team with the local EmployeeCard
remko48 Sep 19, 2026
0ab9ac7
content(arcade): the games as a table, with what each one is (#205)
rubenvdlinde Sep 19, 2026
ff0eb13
content(about): update the team roster
remko48 Sep 19, 2026
0b22b2e
fix(site): give every page a layout that fits a phone (#203)
rubenvdlinde Sep 19, 2026
92f9d92
fix(arcade): the game-over card fits the window, and two tests that s…
rubenvdlinde Sep 19, 2026
fcab09f
feat(traffic): measure this site from our own portal, when told to (#…
rubenvdlinde Sep 19, 2026
4e9f4fe
feat(arcade): every app and post game opens in its own hero (#209)
rubenvdlinde Sep 19, 2026
4b895cf
fix(site): make dark mode readable on every page (#208)
rubenvdlinde Sep 19, 2026
3a8e61c
feat(forms): the website forms reach the CRM (#204)
rubenvdlinde Sep 19, 2026
abd3bb8
fix(site): the cookie panel flips, and two more pages get covered (#210)
rubenvdlinde Sep 19, 2026
6b05bb7
Merge remote-tracking branch 'origin/development' into employee-cards
remko48 Sep 19, 2026
b13b383
fix(site): the contact form flips, and /contact/ joins the suite (#211)
rubenvdlinde Sep 19, 2026
5643db4
fix: the Dutch locale gets the same dark mode and mobile fixes as Eng…
rubenvdlinde Sep 19, 2026
d7cc04f
fix(arcade): the mini-game takes the mock's place in the hero (#213)
rubenvdlinde Sep 19, 2026
cbb3c5f
fix(a11y): a real mobile and dark-mode review, and an instrument to r…
rubenvdlinde Sep 20, 2026
7836d7a
test(a11y): match the navbar drawer by id suffix, not by its exact id…
rubenvdlinde Sep 20, 2026
aaaf4a6
feat(lint): ink and surface must both follow the theme, or both be fi…
rubenvdlinde Sep 20, 2026
d64a80b
Merge remote-tracking branch 'origin/development' into employee-cards
remko48 Sep 20, 2026
04b36a5
feat(about): take the team cards from the design system
remko48 Sep 20, 2026
d2b37e7
fix(about): drop the cobalt ring around the team portraits
remko48 Sep 20, 2026
5c9956b
fix(navbar): let the bar follow the colour mode
remko48 Sep 20, 2026
71e1525
revert(navbar): drop the swizzle, the preset ships the drawer
remko48 Sep 20, 2026
6a10f20
fix(support): the Dutch certified badge is gold again, on preset 3.47…
rubenvdlinde Sep 20, 2026
4b60a99
Merge pull request #218 from ConductionNL/employee-cards
remko48 Sep 21, 2026
fb64757
content(arcade): name Konami in the Dossiq hint (#220)
rubenvdlinde Sep 21, 2026
5f1fc5f
content(arcade): clearer ways in for Keepiq and Larpinq, and Larpinq …
rubenvdlinde Sep 21, 2026
f8a0e1c
feat(arcade): preset 3.48.0, which swaps record run for the stacking …
rubenvdlinde Sep 21, 2026
20e247a
chore(dev): keep the installed preset on webpack's watch list
remko48 Sep 21, 2026
e21ff8f
feat(roster): give each roster entry the page it belongs to
remko48 Sep 21, 2026
6488a22
chore(sitemap): stop advertising the /arcade index
remko48 Sep 21, 2026
a41d7b8
content(arcade): describe the kade strip as it now behaves
remko48 Sep 21, 2026
46dd4f9
chore(deps): preset 3.49.0
remko48 Sep 21, 2026
ac8f85b
Merge pull request #223 from ConductionNL/fix/canal-footer-rendering-…
remko48 Sep 21, 2026
07dec6d
ci(traffic): wire the Portaliq traffic variables, with a guard both w…
rubenvdlinde Sep 22, 2026
997928d
feat(a11y): measure interactive states, focus visibility, and Safari …
rubenvdlinde Sep 22, 2026
2bf4b96
build(deps): take preset 3.49.1, so the focus indicator reaches the s…
rubenvdlinde Sep 22, 2026
66a5572
fix(e2e): the suite must not post page views to the live collector (#…
rubenvdlinde Sep 22, 2026
d41da4c
fix(a11y): gate on WebKit, and stop the checks reporting things a fin…
rubenvdlinde Sep 22, 2026
8e049bf
fix(e2e): answer the collector beacon instead of aborting it (#229)
rubenvdlinde Sep 22, 2026
645c53a
feat(a11y): retire the brand-citation allowlist, and fix what it was …
rubenvdlinde Sep 22, 2026
1662625
Merge pull request #230 from ConductionNL/feat/text-safe-brand-citations
rubenvdlinde Sep 22, 2026
ccf568e
fix(a11y): clear the last three contrast defects the sweep found
rubenvdlinde Sep 23, 2026
565d608
chore(deps): preset 3.50.4, for the opener's focus indicator
rubenvdlinde Sep 23, 2026
4db2abe
Merge pull request #232 from ConductionNL/fix/last-three-contrast-def…
rubenvdlinde Sep 23, 2026
c255cde
feat(code): code blocks render the kit, and the diagram arrows get a …
rubenvdlinde Sep 23, 2026
b85ec68
Merge pull request #233 from ConductionNL/fix/brand-code-blocks
rubenvdlinde Sep 23, 2026
bdf8be2
docs(academy): workstation tutorial is GitHub-first — gh over HTTPS r…
WilcoLouwerse Sep 28, 2026
c2d930d
Merge pull request #234 from ConductionNL/docs/workstation-tutorial-g…
WilcoLouwerse Sep 28, 2026
02ea2f7
docs(academy): the remaining tutorials are GitHub-first — Hydra CI, i…
WilcoLouwerse Sep 28, 2026
1897a46
docs(hydra-tutorial-7): quote the summary so the front matter parses,…
WilcoLouwerse Sep 28, 2026
ecabb0e
Merge pull request #235 from ConductionNL/docs/academy-tutorials-gith…
WilcoLouwerse Sep 28, 2026
929eb20
fix(downloads): count GitHub as the live download source, Codeberg as…
WilcoLouwerse Sep 29, 2026
dcf9dc0
docs(academy): hydra part 5 runs stages locally instead of a supervisor
WilcoLouwerse Sep 29, 2026
05a0648
docs(academy): hydra parts 2 and 7 describe the flows and brokered cr…
WilcoLouwerse Sep 29, 2026
a94f7f1
Merge pull request #237 from ConductionNL/docs/codeberg-legacy-downlo…
WilcoLouwerse Sep 29, 2026
2fae571
docs(academy): hydra parts 1-3 describe the pipeline the flows run
WilcoLouwerse Sep 29, 2026
135a633
docs(academy): hydra parts 4-7 match the flows, the images and the sk…
WilcoLouwerse Sep 29, 2026
9a2d0aa
Merge pull request #238 from ConductionNL/docs/hydra-tutorial-matches…
WilcoLouwerse Sep 29, 2026
83a62c6
fix(buildiq): product page shows v0.7, matching buildiq 0.7.15
rubenvdlinde Oct 7, 2026
ffac0d4
Merge pull request #240 from ConductionNL/fix/buildiq-version-v0-7
rubenvdlinde Oct 7, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
312 changes: 238 additions & 74 deletions .github/scripts/app_downloads.py

Large diffs are not rendered by default.

268 changes: 268 additions & 0 deletions .github/workflows/deploy.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,268 @@
# Build the site and deploy it to Cloudflare Pages.
#
# Replaces the old `documentation.yml`, which published to the `gh-pages`
# branch for GitHub Pages. GitHub Pages no longer serves this site:
# www.conduction.nl is a Cloudflare Pages project (`conduction-website`),
# and DNS has pointed there for some time. The gh-pages branch was still
# being written on every push, and GitHub Pages still claimed the custom
# domain, so the repo carried a second publishing path that produced
# nothing anyone could see. Both are retired now.
#
# Requires two ORG secrets (they already exist; the names matter):
# CF_API_TOKEN - token with the "Cloudflare Pages: Edit" permission
# CF_ACCOUNT_ID - the account owning the conduction-website project
#
# ConductionNL/.github's deploy-docs.yml uses the same two names; this workflow
# asked for CLOUDFLARE_API_TOKEN, which is not a secret anywhere, so wrangler
# got an empty token.
#
# Until those exist the deploy step fails loudly, which is the intended
# behaviour: a deploy that cannot authenticate must not look like a
# success. Builds on pull requests do not need them.

name: Deploy

on:
push:
branches: [development]
pull_request:
branches: [development]
# Nightly rebuild so app-downloads.json (regenerated by the npm prebuild
# step) reflects fresh GitHub release-asset counts. 07:00 UTC = 09:00
# Amsterdam (CEST) / 08:00 (CET). Inherited from the workflow this
# replaces; the counts are fetched at build time, so a rebuild is the
# only way they change.
schedule:
- cron: '0 7 * * *'
workflow_dispatch:

# A newer push should win rather than race an in-flight deploy to the same
# production URL. PRs are grouped per-branch so they cancel their own runs.
concurrency:
group: deploy-${{ github.ref }}
cancel-in-progress: true

permissions:
contents: read

jobs:
build:
runs-on: ubuntu-latest
# Build, a Chromium download, and an e2e suite whose slowest test spends
# 40 seconds proving the game cannot end.
timeout-minutes: 45
steps:
- uses: actions/checkout@v4

- uses: actions/setup-node@v4
with:
node-version: '20'
cache: npm

# The prebuild step shells out to python3 to refresh app-downloads.json.
- uses: actions/setup-python@v5
with:
python-version: '3.12'

- name: Install dependencies
run: npm ci --legacy-peer-deps

# Runs prebuild (app-downloads) then `docusaurus build`, producing
# build/ with the English site and build/nl/ with the Dutch one.
#
# GITHUB_TOKEN is not optional in practice. The prebuild step counts
# release-asset downloads across the ConductionNL repos, and an
# unauthenticated caller is rate-limited long before it finishes: the
# fetch then fails soft, keeps whatever app-downloads.json is
# committed, and the build goes green with frozen numbers. Since
# refreshing those numbers is the entire purpose of the nightly run,
# a silent fallback would make this job theatre.
# PIPELINQ_ENQUIRY_ENDPOINT is what makes the forms work at all. Without
# it the build falls back to the localhost dev default, EnquiryForm sees
# an http endpoint on an https page, and every visitor is shown the email
# fallback instead of a form that submits. That is not hypothetical: it
# is what production did until this line existed, which is why no website
# enquiry ever reached the CRM.
#
# A repository VARIABLE, not a secret: it is a public URL that every
# visitor's browser sends a request to, so hiding it buys nothing and
# costs the ability to read the deploy log and see where leads went.
- name: Build
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
PIPELINQ_ENQUIRY_ENDPOINT: ${{ vars.PIPELINQ_ENQUIRY_ENDPOINT }}
# Traffic measurement, from our own Portaliq portal. Unset and the
# plugin is not wired at all, which is what production did until
# now: the app was installed on the portal and the site sent it
# nothing, so there was no measurement and nothing said so.
#
# A variable rather than a secret, for the same reason as the
# endpoint above: it is an origin every visitor's browser fetches a
# script from, so it is public by construction.
PORTALIQ_TRAFFIC_ORIGIN: ${{ vars.PORTALIQ_TRAFFIC_ORIGIN }}
PORTALIQ_TRAFFIC_PORTAL: ${{ vars.PORTALIQ_TRAFFIC_PORTAL }}
run: npm run build

# The build cannot fail on a missing endpoint, because a preview build of
# a docs-only PR has no reason to carry one. It CAN refuse to deploy a
# production build that would ship forms nobody can submit, which is the
# failure this whole change exists to end.
- name: The production build must carry a real enquiry endpoint
# Same condition as the Deploy step below, deliberately: this guards
# what actually ships, so if the two ever disagree the guard is either
# blocking a build nobody deploys or waving through one they do.
if: github.event_name != 'pull_request' && github.ref == 'refs/heads/development'
run: |
# Matched on the CONFIG KEY, never on the bare host. `localhost:8080`
# on its own appears in 19 bundle files, because the academy
# tutorials are full of "Host http://localhost:8080, basic auth
# admin:admin" and they are supposed to be. Grepping for the host
# alone made this step fail every single deploy while looking like a
# careful safety check, which is worse than not having one. Measured
# against a real build, not assumed: key+host matches exactly one
# file, the config in main.*.js.
if grep -rqF 'pipelinqEnquiryEndpoint:"http://localhost' build/assets/js/; then
echo "::error::The build baked in the localhost dev endpoint. Set the PIPELINQ_ENQUIRY_ENDPOINT repository variable, or every form on the site degrades to the email fallback and no enquiry reaches the CRM."
exit 1
fi
echo "Enquiry endpoint is not the dev default."

# A variable that is set but does nothing is worse than one that is
# unset, because it reads as measurement being on. The plugin only
# emits its tag when the origin is present, so if the variable is set
# the built pages must carry the script; if it is unset, they must not.
# Both directions, because either way round is a lie about whether
# visitors are being measured.
- name: Traffic measurement is on exactly when it is configured
if: github.event_name != 'pull_request' && github.ref == 'refs/heads/development'
run: |
# Matched on the client ROUTE, which nothing else on the site
# requests, rather than on the portal host: that host is also the
# enquiry endpoint and appears in the bundle regardless.
if grep -rqF 'api/traffic-client.js' build/index.html; then
found=yes
else
found=no
fi
if [ -n "${{ vars.PORTALIQ_TRAFFIC_ORIGIN }}" ] && [ "$found" = no ]; then
echo "::error::PORTALIQ_TRAFFIC_ORIGIN is set but the build carries no traffic client, so nothing is being measured."
exit 1
fi
if [ -z "${{ vars.PORTALIQ_TRAFFIC_ORIGIN }}" ] && [ "$found" = yes ]; then
echo "::error::The build carries a traffic client with no origin configured."
exit 1
fi
echo "Traffic client present: $found, which matches the configuration."

- name: Check the build produced both locales
run: |
test -f build/index.html || { echo "::error::build/index.html missing"; exit 1; }
test -f build/nl/index.html || { echo "::error::build/nl/index.html missing"; exit 1; }

# WebKit is Safari's engine and therefore most phones. The suite ran
# zero percent of it until 2026-09-22, because the mobile project was
# pinned to chromium on the grounds that layout is engine-agnostic.
# Largely, not entirely: the one difference that showed up was a race
# the drawer test was losing on WebKit and winning on Chromium.
# Both engines are installed in one step now that both gate the deploy.
# A failed install should look like the infrastructure problem it is,
# not like a silent gap in coverage.
- name: Install Playwright browsers
run: npx playwright install --with-deps chromium webkit

# Runs against the build produced above, not a dev server, because the
# failures worth catching here only exist in a production build:
# hydration mismatches need a server-rendered page to hydrate, and the
# cookie CLI's styling depends on hashed CSS-module class names.
# This gates the deploy on purpose. A page that fails to hydrate looks
# perfect in a screenshot, so "it built" is not evidence it works.
- name: End-to-end tests
run: npx playwright test --project=chromium --project=mobile --project=mobile-safari

- name: Upload the Playwright report on failure
if: failure()
uses: actions/upload-artifact@v4
with:
name: playwright-report
path: playwright-report/
retention-days: 7

# `--branch main` is load-bearing and has nothing to do with this
# repo's branches. Cloudflare Pages treats one branch name per project
# as production; for conduction-website that name is `main`. Deploying
# from `development` under its own name would create a *preview*
# deployment on a random *.pages.dev URL, succeed, and never reach
# www.conduction.nl. Push events on development are production.
# DIAGNOSTIC, and deliberately non-fatal. This workflow has never once
# deployed successfully: `--project-name=conduction-website` is the only
# name it has ever used, and Cloudflare answers
# `Authentication error [code: 10000]` on
# /accounts/*/pages/projects/conduction-website — while the SAME
# CF_API_TOKEN deploys the `conduction-docs` project from
# ConductionNL/.github without complaint. So the token is valid and the
# name or its scope is wrong. Listing the projects the token can actually
# reach turns that guess into a measurement, in the log, without anyone
# opening the dashboard.
#
# `continue-on-error` on purpose: a diagnostic that can fail the build is
# a second failure mode, not a diagnosis.
# PREFLIGHT, and deliberately non-fatal on its own — the deploy below is
# what fails. It exists because the deploy's own error says only
# "Authentication error [code: 10000]", which reads as a bad token and is
# not one.
#
# MEASURED 2026-08-23, after this workflow had failed 30 runs out of 30:
# /accounts/*/pages/projects -> Authentication error 10000
# /accounts/*/workers/scripts -> ok, 42 scripts
# /zones -> ok
# So CF_API_TOKEN carries Workers and zone-read and NO Pages permission at
# all. Not a wrong project name: the Pages LIST endpoint, which names no
# project, is refused too. `conduction-website` is real — it exists and
# serves www.conduction.nl, conduction.nl, academy., commonground. and
# connext. — the token just cannot see it.
#
# That also explains why ConductionNL/.github deploys docs.conduction.nl
# with this same token: every docs site in the fleet is a WORKER
# (`wrangler deploy`, name `<app>-docs`), and Workers is the permission
# this token has.
#
# THE FIX IS ONE DASHBOARD EDIT: add `Cloudflare Pages: Edit` to the org
# secret CF_API_TOKEN. Until then this step says so in the log, so the
# failure below names its cause instead of looking like a bad secret.
- name: Preflight — can this token see Cloudflare Pages
if: github.event_name != 'pull_request'
continue-on-error: true
env:
CF_API_TOKEN: ${{ secrets.CF_API_TOKEN }}
CF_ACCOUNT_ID: ${{ secrets.CF_ACCOUNT_ID || secrets.CLOUDFLARE_ACCOUNT_ID }}
run: |
set -u
if curl -sf -H "Authorization: Bearer $CF_API_TOKEN" \
"https://api.cloudflare.com/client/v4/accounts/$CF_ACCOUNT_ID/pages/projects" \
| grep -q '"success":true'; then
echo "Pages is readable with this token."
else
echo "::error title=CF_API_TOKEN has no Cloudflare Pages permission::The deploy below will fail with Authentication error 10000. This is NOT a wrong project name — the Pages list endpoint, which names no project, is refused as well, while Workers and zones both answer. Add 'Cloudflare Pages: Edit' to the org secret CF_API_TOKEN. The conduction-website project exists and serves www.conduction.nl."
fi

# Production publishing happens from `development` only. A
# workflow_dispatch on any other ref would otherwise push that branch
# straight to the production `main` alias below and replace
# www.conduction.nl with it.
- name: Deploy to Cloudflare Pages
if: github.event_name != 'pull_request' && github.ref == 'refs/heads/development'
uses: cloudflare/wrangler-action@v3
with:
# The org secrets are CF_API_TOKEN / CF_ACCOUNT_ID. This step asked
# for CLOUDFLARE_API_TOKEN, which does not exist, so wrangler received
# an empty token and every deploy since ~15 Aug failed — while PR
# checks stayed green, because this step is skipped on pull_request.
# The repo-level CLOUDFLARE_ACCOUNT_ID is kept as a fallback so this
# keeps working if the org secret is ever scoped away.
apiToken: ${{ secrets.CF_API_TOKEN }}
accountId: ${{ secrets.CF_ACCOUNT_ID || secrets.CLOUDFLARE_ACCOUNT_ID }}
command: >-
pages deploy build
--project-name=conduction-website
--branch main
--commit-dirty=true
28 changes: 0 additions & 28 deletions .github/workflows/documentation.yml

This file was deleted.

55 changes: 55 additions & 0 deletions .github/workflows/validate-ai-baseline.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
name: AI baseline validation

# Runs on every pull request so the AI-crawler baseline (robots.txt,
# llms.txt, sitemaps, JSON-LD on the homepage and per-app pages,
# FAQPage on /support /install /iso, og:image, twitter meta) is
# re-asserted at PR time, not just after merge. The centralised
# ConductionNL/.github documentation workflow only builds on push,
# so without this job, validation regressions reach development.
#
# What runs: `npm run ci` -> `npm ci --legacy-peer-deps && npm run build`,
# which triggers prebuild (app-downloads sync) + docusaurus build +
# postbuild (scripts/validate-ai-baseline.mjs). Any of the 15 checks
# failing exits non-zero and the workflow fails.
#
# The build is the same one production uses, so a green check here
# also tells reviewers the site actually builds with their changes.

on:
pull_request:
branches: [development, documentation]
workflow_dispatch:

jobs:
validate:
name: Build and validate AI baseline
runs-on: ubuntu-latest
timeout-minutes: 15
permissions:
contents: read

steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'

- name: Install dependencies and build
env:
# Pass the run-scoped token to the prebuild script's
# app-downloads fetch so it stays under GitHub's 60-req/hr
# unauthenticated limit. The token is auto-scoped to this
# job and expires when it ends.
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: npm run ci

- name: Confirm validation gate ran
# `npm run ci` -> `npm run build` -> postbuild runs the
# 15-check validator and exits non-zero on regression. This
# extra step is a belt-and-braces guarantee: if anyone ever
# removes the postbuild hook from package.json by accident,
# the explicit invocation here still catches it at PR time.
run: node scripts/validate-ai-baseline.mjs
20 changes: 20 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -10,5 +10,25 @@ node_modules/
# Misc
.DS_Store
*.log

# Env
.env
.env.*
!.env.example
.env.local
.env.*.local

# Secrets / credentials — never commit
*.pem
*.key
*_rsa
*.crt

__pycache__/

# Playwright
test-results/
playwright-report/

# Wrangler local cache — contains account identifiers, never committed.
.wrangler/
6 changes: 5 additions & 1 deletion .npmrc
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,8 @@
# 24h ago. Compromised first-party-Conduction packages are excluded via
# Dependabot cooldown (.github/dependabot.yml); for fresh @conduction/*
# releases, override per-install with `npm install --min-release-age=0`.
min-release-age=1
#
# TEMPORARILY DISABLED 2026-05-22 to install @conduction/docusaurus-preset@3.20.0
# (SetupSteps component) before its 24h cooldown elapsed. Re-enable tomorrow.
# Tracking issue: ConductionNL/conduction-website#115 (re-enable tomorrow).
# min-release-age=1
1 change: 1 addition & 0 deletions .nvmrc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
20
Loading
Loading