Repository files navigation

Avior Studio web

The public avior.studio site. Three static Astro pages: an index, /devtools, and /games.

There is no authentication, no application state, no backend and no runtime environment configuration. The pages ship no JavaScript, which is why there are no integrations in astro.config.mjs and why CI fails on a <script src> in any build output.

Commands

CommandAction
bun installInstall dependencies
bun devStart the Astro development server
bun run buildGenerate the static site in dist/
bun previewPreview the static build

Pages

  • / — what the studio is, the two doors, and how the tools and games relate. The door lists name their contents rather than saying "and more", so the index cannot promise a page something that is not on it.
  • /devtools — GDAM and gdlint, with install commands and links, then the fourteen gd-* addons on the registry.
  • /games — termcade, Castle Drop, Prizm and Fields of Revik.

src/components/Entry.astro is the shared product block used by both inner pages: a fixed-width head column (name, tagline, status, meta) beside a body that flows.

The addons on /devtools deliberately do not use it. Entry is sized for a product with a status, a platform line and an install command of its own; fourteen of them would bury the two tools the page is mostly about. They are a card grid instead, defined as an addons array at the top of the page the way index.astro defines its doors. The install line is stated once above the grid because it is gdam install @aviorstudio/<name> for all fourteen, and each card links to its repository rather than carrying its own link row.

Status and links

Every product on the site is either linkable or explicitly not, and the page says which. Three of the six product repositories are private, and a link to a repository a reader cannot open is worse than no link:

ProductRepositoryPublic link on the site
GDAMpublicgdam.dev and GitHub
gdlintpublicgdlint.dev and GitHub
termcadepublicGitHub (termcade.com is still a placeholder, so it is not linked)
Castle Dropprivatenone — labelled Prototype
Prizmprivatenone — labelled Prototype
Fields of Revikprivatefieldsofrevik.com, which is live

The status dot is hollow by default and filled only for something a reader can run today — a difference told by fill rather than by colour, so it survives greyscale and colour blindness both. Only termcade, GDAM and gdlint are filled.

All fourteen addons are public on GitHub and resolve on the registry, so every card links to its repository and none carries a status dot: there is no third state to tell apart. Two more gd-* directories exist in the workspace — gd-animate and gd-storybook — and are not on the page. Both are empty repositories with a one-line README, no addon/, no release and no registry entry; api.gdam.dev returns a placeholder rather than a package for them. They go on the page when they resolve.

Copy

Every blurb comes from the product's own repository — the READMEs, the design docs, and the config that decides defaults — not from a positioning exercise. The claims worth re-checking when a product changes:

  • GDAM: the separate gdam.link.json, and that publishing is authenticated with an owner-scoped secret key while the CLI itself carries none.
  • gdlint: four rules enabled by default out of sixteen, and that it is deliberately not an architecture checker.
  • termcade: games are sandboxed wasm under wazero with no filesystem and no network, a broken one shows up dimmed rather than taking the arcade down, and the arcade binary is also the dev kit.
  • Castle Drop: progression is castle upgrades only; waves, enemies, towers and tuning are Inspector-authored resources.
  • Prizm: no avatar, combat, health, timer or fail state in the MVP.
  • Fields of Revik: one deterministic core shared by the client and a headless Godot server; online play is fully server-authoritative.
  • The addons: the count. "Fourteen" is written out in the /devtools headline and intro, in the / door list, closing line and first principle, and in three meta descriptions, so publishing a fifteenth is a seven-place edit. Also each blurb's stated boundary — gd-network leaving auth and reconnect to the game, gd-supabase and gd-pocketbase decoding tokens rather than verifying them, gd-redis keeping flushdb behind an explicit opt-in, gd-playwright's CLI being strictly read-only — since those are the claims a reader would act on before installing.

Colour and the mark

The background is #252424, sampled out of src/assets/aviorstudio-logo.png — the mark ships with that colour baked in behind it, and matching it is what lets the ibis sit on the page instead of inside a visible square. The remaining few shades of difference are handled by fading the image's edges out with a radial mask rather than by repainting the asset.

Everything else is greyscale on purpose. Each product has a colour of its own — gdlint wears the Godot editor blue, gdam.dev its slate, Fields of Revik its parchment — and a studio that invented a seventh would be competing with the six things it exists to point at.

public/logo.png, public/logo-mark.png and public/favicon.png are generated from src/assets/aviorstudio-logo.png, which is the source of record:

magick src/assets/aviorstudio-logo.png -resize 512x512 -strip public/logo.png
magick src/assets/aviorstudio-logo.png -crop 810x810+120+112 +repage -resize 96x96 -strip public/logo-mark.png
magick src/assets/aviorstudio-logo.png -crop 810x810+120+112 +repage -resize 256x256 -strip public/favicon.png

The crop is tighter for the small sizes: at 30px the uncropped mark is a smudge, because the artwork's own margin eats most of the space.

Fonts are the platform's own. No font is fetched, so no visitor's IP reaches a font CDN and no CSP exception is needed to render the pages.

Domain

The site is https://avior.studio. The host appears in exactly three places — the canonical and structured-data URLs in src/layouts/Full.astro, the sitemap line in public/robots.txt, and the three <loc> entries in public/sitemap.xml — so moving it is a three-file change.

aviorstudio.com is a different domain and is not this site. Nothing here should point at it.

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

Avior Studio web

The public avior.studio site. Three static Astro pages: an index, /devtools, and /games.

There is no authentication, no application state, no backend and no runtime environment configuration. The pages ship no JavaScript, which is why there are no integrations in astro.config.mjs and why CI fails on a <script src> in any build output.

Commands

CommandAction
bun installInstall dependencies
bun devStart the Astro development server
bun run buildGenerate the static site in dist/
bun previewPreview the static build

Pages

  • / — what the studio is, the two doors, and how the tools and games relate. The door lists name their contents rather than saying "and more", so the index cannot promise a page something that is not on it.
  • /devtools — GDAM and gdlint, with install commands and links, then the fourteen gd-* addons on the registry.
  • /games — termcade, Castle Drop, Prizm and Fields of Revik.

src/components/Entry.astro is the shared product block used by both inner pages: a fixed-width head column (name, tagline, status, meta) beside a body that flows.

The addons on /devtools deliberately do not use it. Entry is sized for a product with a status, a platform line and an install command of its own; fourteen of them would bury the two tools the page is mostly about. They are a card grid instead, defined as an addons array at the top of the page the way index.astro defines its doors. The install line is stated once above the grid because it is gdam install @aviorstudio/<name> for all fourteen, and each card links to its repository rather than carrying its own link row.

Status and links

Every product on the site is either linkable or explicitly not, and the page says which. Three of the six product repositories are private, and a link to a repository a reader cannot open is worse than no link:

ProductRepositoryPublic link on the site
GDAMpublicgdam.dev and GitHub
gdlintpublicgdlint.dev and GitHub
termcadepublicGitHub (termcade.com is still a placeholder, so it is not linked)
Castle Dropprivatenone — labelled Prototype
Prizmprivatenone — labelled Prototype
Fields of Revikprivatefieldsofrevik.com, which is live

The status dot is hollow by default and filled only for something a reader can run today — a difference told by fill rather than by colour, so it survives greyscale and colour blindness both. Only termcade, GDAM and gdlint are filled.

All fourteen addons are public on GitHub and resolve on the registry, so every card links to its repository and none carries a status dot: there is no third state to tell apart. Two more gd-* directories exist in the workspace — gd-animate and gd-storybook — and are not on the page. Both are empty repositories with a one-line README, no addon/, no release and no registry entry; api.gdam.dev returns a placeholder rather than a package for them. They go on the page when they resolve.

Copy

Every blurb comes from the product's own repository — the READMEs, the design docs, and the config that decides defaults — not from a positioning exercise. The claims worth re-checking when a product changes:

  • GDAM: the separate gdam.link.json, and that publishing is authenticated with an owner-scoped secret key while the CLI itself carries none.
  • gdlint: four rules enabled by default out of sixteen, and that it is deliberately not an architecture checker.
  • termcade: games are sandboxed wasm under wazero with no filesystem and no network, a broken one shows up dimmed rather than taking the arcade down, and the arcade binary is also the dev kit.
  • Castle Drop: progression is castle upgrades only; waves, enemies, towers and tuning are Inspector-authored resources.
  • Prizm: no avatar, combat, health, timer or fail state in the MVP.
  • Fields of Revik: one deterministic core shared by the client and a headless Godot server; online play is fully server-authoritative.
  • The addons: the count. "Fourteen" is written out in the /devtools headline and intro, in the / door list, closing line and first principle, and in three meta descriptions, so publishing a fifteenth is a seven-place edit. Also each blurb's stated boundary — gd-network leaving auth and reconnect to the game, gd-supabase and gd-pocketbase decoding tokens rather than verifying them, gd-redis keeping flushdb behind an explicit opt-in, gd-playwright's CLI being strictly read-only — since those are the claims a reader would act on before installing.

Colour and the mark

The background is #252424, sampled out of src/assets/aviorstudio-logo.png — the mark ships with that colour baked in behind it, and matching it is what lets the ibis sit on the page instead of inside a visible square. The remaining few shades of difference are handled by fading the image's edges out with a radial mask rather than by repainting the asset.

Everything else is greyscale on purpose. Each product has a colour of its own — gdlint wears the Godot editor blue, gdam.dev its slate, Fields of Revik its parchment — and a studio that invented a seventh would be competing with the six things it exists to point at.

public/logo.png, public/logo-mark.png and public/favicon.png are generated from src/assets/aviorstudio-logo.png, which is the source of record:

magick src/assets/aviorstudio-logo.png -resize 512x512 -strip public/logo.png
magick src/assets/aviorstudio-logo.png -crop 810x810+120+112 +repage -resize 96x96 -strip public/logo-mark.png
magick src/assets/aviorstudio-logo.png -crop 810x810+120+112 +repage -resize 256x256 -strip public/favicon.png

The crop is tighter for the small sizes: at 30px the uncropped mark is a smudge, because the artwork's own margin eats most of the space.

Fonts are the platform's own. No font is fetched, so no visitor's IP reaches a font CDN and no CSP exception is needed to render the pages.

Domain

The site is https://avior.studio. The host appears in exactly three places — the canonical and structured-data URLs in src/layouts/Full.astro, the sitemap line in public/robots.txt, and the three <loc> entries in public/sitemap.xml — so moving it is a three-file change.

aviorstudio.com is a different domain and is not this site. Nothing here should point at it.

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Avior Studio web

The public avior.studio site. Three static Astro pages: an index, /devtools, and /games.

There is no authentication, no application state, no backend and no runtime environment configuration. The pages ship no JavaScript, which is why there are no integrations in astro.config.mjs and why CI fails on a <script src> in any build output.

Commands

CommandAction
bun installInstall dependencies
bun devStart the Astro development server
bun run buildGenerate the static site in dist/
bun previewPreview the static build

Pages

  • / — what the studio is, the two doors, and how the tools and games relate. The door lists name their contents rather than saying "and more", so the index cannot promise a page something that is not on it.
  • /devtools — GDAM and gdlint, with install commands and links, then the fourteen gd-* addons on the registry.
  • /games — termcade, Castle Drop, Prizm and Fields of Revik.

src/components/Entry.astro is the shared product block used by both inner pages: a fixed-width head column (name, tagline, status, meta) beside a body that flows.

The addons on /devtools deliberately do not use it. Entry is sized for a product with a status, a platform line and an install command of its own; fourteen of them would bury the two tools the page is mostly about. They are a card grid instead, defined as an addons array at the top of the page the way index.astro defines its doors. The install line is stated once above the grid because it is gdam install @aviorstudio/<name> for all fourteen, and each card links to its repository rather than carrying its own link row.

Status and links

Every product on the site is either linkable or explicitly not, and the page says which. Three of the six product repositories are private, and a link to a repository a reader cannot open is worse than no link:

ProductRepositoryPublic link on the site
GDAMpublicgdam.dev and GitHub
gdlintpublicgdlint.dev and GitHub
termcadepublicGitHub (termcade.com is still a placeholder, so it is not linked)
Castle Dropprivatenone — labelled Prototype
Prizmprivatenone — labelled Prototype
Fields of Revikprivatefieldsofrevik.com, which is live

The status dot is hollow by default and filled only for something a reader can run today — a difference told by fill rather than by colour, so it survives greyscale and colour blindness both. Only termcade, GDAM and gdlint are filled.

All fourteen addons are public on GitHub and resolve on the registry, so every card links to its repository and none carries a status dot: there is no third state to tell apart. Two more gd-* directories exist in the workspace — gd-animate and gd-storybook — and are not on the page. Both are empty repositories with a one-line README, no addon/, no release and no registry entry; api.gdam.dev returns a placeholder rather than a package for them. They go on the page when they resolve.

Copy

Every blurb comes from the product's own repository — the READMEs, the design docs, and the config that decides defaults — not from a positioning exercise. The claims worth re-checking when a product changes:

  • GDAM: the separate gdam.link.json, and that publishing is authenticated with an owner-scoped secret key while the CLI itself carries none.
  • gdlint: four rules enabled by default out of sixteen, and that it is deliberately not an architecture checker.
  • termcade: games are sandboxed wasm under wazero with no filesystem and no network, a broken one shows up dimmed rather than taking the arcade down, and the arcade binary is also the dev kit.
  • Castle Drop: progression is castle upgrades only; waves, enemies, towers and tuning are Inspector-authored resources.
  • Prizm: no avatar, combat, health, timer or fail state in the MVP.
  • Fields of Revik: one deterministic core shared by the client and a headless Godot server; online play is fully server-authoritative.
  • The addons: the count. "Fourteen" is written out in the /devtools headline and intro, in the / door list, closing line and first principle, and in three meta descriptions, so publishing a fifteenth is a seven-place edit. Also each blurb's stated boundary — gd-network leaving auth and reconnect to the game, gd-supabase and gd-pocketbase decoding tokens rather than verifying them, gd-redis keeping flushdb behind an explicit opt-in, gd-playwright's CLI being strictly read-only — since those are the claims a reader would act on before installing.

Colour and the mark

The background is #252424, sampled out of src/assets/aviorstudio-logo.png — the mark ships with that colour baked in behind it, and matching it is what lets the ibis sit on the page instead of inside a visible square. The remaining few shades of difference are handled by fading the image's edges out with a radial mask rather than by repainting the asset.

Everything else is greyscale on purpose. Each product has a colour of its own — gdlint wears the Godot editor blue, gdam.dev its slate, Fields of Revik its parchment — and a studio that invented a seventh would be competing with the six things it exists to point at.

public/logo.png, public/logo-mark.png and public/favicon.png are generated from src/assets/aviorstudio-logo.png, which is the source of record:

magick src/assets/aviorstudio-logo.png -resize 512x512 -strip public/logo.png
magick src/assets/aviorstudio-logo.png -crop 810x810+120+112 +repage -resize 96x96 -strip public/logo-mark.png
magick src/assets/aviorstudio-logo.png -crop 810x810+120+112 +repage -resize 256x256 -strip public/favicon.png

The crop is tighter for the small sizes: at 30px the uncropped mark is a smudge, because the artwork's own margin eats most of the space.

Fonts are the platform's own. No font is fetched, so no visitor's IP reaches a font CDN and no CSP exception is needed to render the pages.

Domain

The site is https://avior.studio. The host appears in exactly three places — the canonical and structured-data URLs in src/layouts/Full.astro, the sitemap line in public/robots.txt, and the three <loc> entries in public/sitemap.xml — so moving it is a three-file change.

aviorstudio.com is a different domain and is not this site. Nothing here should point at it.

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Avior Studio web

The public avior.studio site. Three static Astro pages: an index, /devtools, and /games.

There is no authentication, no application state, no backend and no runtime environment configuration. The pages ship no JavaScript, which is why there are no integrations in astro.config.mjs and why CI fails on a <script src> in any build output.

Commands

CommandAction
bun installInstall dependencies
bun devStart the Astro development server
bun run buildGenerate the static site in dist/
bun previewPreview the static build

Pages

  • / — what the studio is, the two doors, and how the tools and games relate. The door lists name their contents rather than saying "and more", so the index cannot promise a page something that is not on it.
  • /devtools — GDAM and gdlint, with install commands and links, then the fourteen gd-* addons on the registry.
  • /games — termcade, Castle Drop, Prizm and Fields of Revik.

src/components/Entry.astro is the shared product block used by both inner pages: a fixed-width head column (name, tagline, status, meta) beside a body that flows.

The addons on /devtools deliberately do not use it. Entry is sized for a product with a status, a platform line and an install command of its own; fourteen of them would bury the two tools the page is mostly about. They are a card grid instead, defined as an addons array at the top of the page the way index.astro defines its doors. The install line is stated once above the grid because it is gdam install @aviorstudio/<name> for all fourteen, and each card links to its repository rather than carrying its own link row.

Status and links

Every product on the site is either linkable or explicitly not, and the page says which. Three of the six product repositories are private, and a link to a repository a reader cannot open is worse than no link:

ProductRepositoryPublic link on the site
GDAMpublicgdam.dev and GitHub
gdlintpublicgdlint.dev and GitHub
termcadepublicGitHub (termcade.com is still a placeholder, so it is not linked)
Castle Dropprivatenone — labelled Prototype
Prizmprivatenone — labelled Prototype
Fields of Revikprivatefieldsofrevik.com, which is live

The status dot is hollow by default and filled only for something a reader can run today — a difference told by fill rather than by colour, so it survives greyscale and colour blindness both. Only termcade, GDAM and gdlint are filled.

All fourteen addons are public on GitHub and resolve on the registry, so every card links to its repository and none carries a status dot: there is no third state to tell apart. Two more gd-* directories exist in the workspace — gd-animate and gd-storybook — and are not on the page. Both are empty repositories with a one-line README, no addon/, no release and no registry entry; api.gdam.dev returns a placeholder rather than a package for them. They go on the page when they resolve.

Copy

Every blurb comes from the product's own repository — the READMEs, the design docs, and the config that decides defaults — not from a positioning exercise. The claims worth re-checking when a product changes:

  • GDAM: the separate gdam.link.json, and that publishing is authenticated with an owner-scoped secret key while the CLI itself carries none.
  • gdlint: four rules enabled by default out of sixteen, and that it is deliberately not an architecture checker.
  • termcade: games are sandboxed wasm under wazero with no filesystem and no network, a broken one shows up dimmed rather than taking the arcade down, and the arcade binary is also the dev kit.
  • Castle Drop: progression is castle upgrades only; waves, enemies, towers and tuning are Inspector-authored resources.
  • Prizm: no avatar, combat, health, timer or fail state in the MVP.
  • Fields of Revik: one deterministic core shared by the client and a headless Godot server; online play is fully server-authoritative.
  • The addons: the count. "Fourteen" is written out in the /devtools headline and intro, in the / door list, closing line and first principle, and in three meta descriptions, so publishing a fifteenth is a seven-place edit. Also each blurb's stated boundary — gd-network leaving auth and reconnect to the game, gd-supabase and gd-pocketbase decoding tokens rather than verifying them, gd-redis keeping flushdb behind an explicit opt-in, gd-playwright's CLI being strictly read-only — since those are the claims a reader would act on before installing.

Colour and the mark

The background is #252424, sampled out of src/assets/aviorstudio-logo.png — the mark ships with that colour baked in behind it, and matching it is what lets the ibis sit on the page instead of inside a visible square. The remaining few shades of difference are handled by fading the image's edges out with a radial mask rather than by repainting the asset.

Everything else is greyscale on purpose. Each product has a colour of its own — gdlint wears the Godot editor blue, gdam.dev its slate, Fields of Revik its parchment — and a studio that invented a seventh would be competing with the six things it exists to point at.

public/logo.png, public/logo-mark.png and public/favicon.png are generated from src/assets/aviorstudio-logo.png, which is the source of record:

magick src/assets/aviorstudio-logo.png -resize 512x512 -strip public/logo.png
magick src/assets/aviorstudio-logo.png -crop 810x810+120+112 +repage -resize 96x96 -strip public/logo-mark.png
magick src/assets/aviorstudio-logo.png -crop 810x810+120+112 +repage -resize 256x256 -strip public/favicon.png

The crop is tighter for the small sizes: at 30px the uncropped mark is a smudge, because the artwork's own margin eats most of the space.

Fonts are the platform's own. No font is fetched, so no visitor's IP reaches a font CDN and no CSP exception is needed to render the pages.

Domain

The site is https://avior.studio. The host appears in exactly three places — the canonical and structured-data URLs in src/layouts/Full.astro, the sitemap line in public/robots.txt, and the three <loc> entries in public/sitemap.xml — so moving it is a three-file change.

aviorstudio.com is a different domain and is not this site. Nothing here should point at it.

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

Avior Studio web

The public avior.studio site. Three static Astro pages: an index, /devtools, and /games.

There is no authentication, no application state, no backend and no runtime environment configuration. The pages ship no JavaScript, which is why there are no integrations in astro.config.mjs and why CI fails on a <script src> in any build output.

Commands

CommandAction
bun installInstall dependencies
bun devStart the Astro development server
bun run buildGenerate the static site in dist/
bun previewPreview the static build

Pages

  • / — what the studio is, the two doors, and how the tools and games relate. The door lists name their contents rather than saying "and more", so the index cannot promise a page something that is not on it.
  • /devtools — GDAM and gdlint, with install commands and links, then the fourteen gd-* addons on the registry.
  • /games — termcade, Castle Drop, Prizm and Fields of Revik.

src/components/Entry.astro is the shared product block used by both inner pages: a fixed-width head column (name, tagline, status, meta) beside a body that flows.

The addons on /devtools deliberately do not use it. Entry is sized for a product with a status, a platform line and an install command of its own; fourteen of them would bury the two tools the page is mostly about. They are a card grid instead, defined as an addons array at the top of the page the way index.astro defines its doors. The install line is stated once above the grid because it is gdam install @aviorstudio/<name> for all fourteen, and each card links to its repository rather than carrying its own link row.

Status and links

Every product on the site is either linkable or explicitly not, and the page says which. Three of the six product repositories are private, and a link to a repository a reader cannot open is worse than no link:

ProductRepositoryPublic link on the site
GDAMpublicgdam.dev and GitHub
gdlintpublicgdlint.dev and GitHub
termcadepublicGitHub (termcade.com is still a placeholder, so it is not linked)
Castle Dropprivatenone — labelled Prototype
Prizmprivatenone — labelled Prototype
Fields of Revikprivatefieldsofrevik.com, which is live

The status dot is hollow by default and filled only for something a reader can run today — a difference told by fill rather than by colour, so it survives greyscale and colour blindness both. Only termcade, GDAM and gdlint are filled.

All fourteen addons are public on GitHub and resolve on the registry, so every card links to its repository and none carries a status dot: there is no third state to tell apart. Two more gd-* directories exist in the workspace — gd-animate and gd-storybook — and are not on the page. Both are empty repositories with a one-line README, no addon/, no release and no registry entry; api.gdam.dev returns a placeholder rather than a package for them. They go on the page when they resolve.

Copy

Every blurb comes from the product's own repository — the READMEs, the design docs, and the config that decides defaults — not from a positioning exercise. The claims worth re-checking when a product changes:

  • GDAM: the separate gdam.link.json, and that publishing is authenticated with an owner-scoped secret key while the CLI itself carries none.
  • gdlint: four rules enabled by default out of sixteen, and that it is deliberately not an architecture checker.
  • termcade: games are sandboxed wasm under wazero with no filesystem and no network, a broken one shows up dimmed rather than taking the arcade down, and the arcade binary is also the dev kit.
  • Castle Drop: progression is castle upgrades only; waves, enemies, towers and tuning are Inspector-authored resources.
  • Prizm: no avatar, combat, health, timer or fail state in the MVP.
  • Fields of Revik: one deterministic core shared by the client and a headless Godot server; online play is fully server-authoritative.
  • The addons: the count. "Fourteen" is written out in the /devtools headline and intro, in the / door list, closing line and first principle, and in three meta descriptions, so publishing a fifteenth is a seven-place edit. Also each blurb's stated boundary — gd-network leaving auth and reconnect to the game, gd-supabase and gd-pocketbase decoding tokens rather than verifying them, gd-redis keeping flushdb behind an explicit opt-in, gd-playwright's CLI being strictly read-only — since those are the claims a reader would act on before installing.

Colour and the mark

The background is #252424, sampled out of src/assets/aviorstudio-logo.png — the mark ships with that colour baked in behind it, and matching it is what lets the ibis sit on the page instead of inside a visible square. The remaining few shades of difference are handled by fading the image's edges out with a radial mask rather than by repainting the asset.

Everything else is greyscale on purpose. Each product has a colour of its own — gdlint wears the Godot editor blue, gdam.dev its slate, Fields of Revik its parchment — and a studio that invented a seventh would be competing with the six things it exists to point at.

public/logo.png, public/logo-mark.png and public/favicon.png are generated from src/assets/aviorstudio-logo.png, which is the source of record:

magick src/assets/aviorstudio-logo.png -resize 512x512 -strip public/logo.png
magick src/assets/aviorstudio-logo.png -crop 810x810+120+112 +repage -resize 96x96 -strip public/logo-mark.png
magick src/assets/aviorstudio-logo.png -crop 810x810+120+112 +repage -resize 256x256 -strip public/favicon.png

The crop is tighter for the small sizes: at 30px the uncropped mark is a smudge, because the artwork's own margin eats most of the space.

Fonts are the platform's own. No font is fetched, so no visitor's IP reaches a font CDN and no CSP exception is needed to render the pages.

Domain

The site is https://avior.studio. The host appears in exactly three places — the canonical and structured-data URLs in src/layouts/Full.astro, the sitemap line in public/robots.txt, and the three <loc> entries in public/sitemap.xml — so moving it is a three-file change.

aviorstudio.com is a different domain and is not this site. Nothing here should point at it.

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Avior Studio web

The public avior.studio site. Three static Astro pages: an index, /devtools, and /games.

There is no authentication, no application state, no backend and no runtime environment configuration. The pages ship no JavaScript, which is why there are no integrations in astro.config.mjs and why CI fails on a <script src> in any build output.

Commands

CommandAction
bun installInstall dependencies
bun devStart the Astro development server
bun run buildGenerate the static site in dist/
bun previewPreview the static build

Pages

  • / — what the studio is, the two doors, and how the tools and games relate. The door lists name their contents rather than saying "and more", so the index cannot promise a page something that is not on it.
  • /devtools — GDAM and gdlint, with install commands and links, then the fourteen gd-* addons on the registry.
  • /games — termcade, Castle Drop, Prizm and Fields of Revik.

src/components/Entry.astro is the shared product block used by both inner pages: a fixed-width head column (name, tagline, status, meta) beside a body that flows.

The addons on /devtools deliberately do not use it. Entry is sized for a product with a status, a platform line and an install command of its own; fourteen of them would bury the two tools the page is mostly about. They are a card grid instead, defined as an addons array at the top of the page the way index.astro defines its doors. The install line is stated once above the grid because it is gdam install @aviorstudio/<name> for all fourteen, and each card links to its repository rather than carrying its own link row.

Status and links

Every product on the site is either linkable or explicitly not, and the page says which. Three of the six product repositories are private, and a link to a repository a reader cannot open is worse than no link:

ProductRepositoryPublic link on the site
GDAMpublicgdam.dev and GitHub
gdlintpublicgdlint.dev and GitHub
termcadepublicGitHub (termcade.com is still a placeholder, so it is not linked)
Castle Dropprivatenone — labelled Prototype
Prizmprivatenone — labelled Prototype
Fields of Revikprivatefieldsofrevik.com, which is live

The status dot is hollow by default and filled only for something a reader can run today — a difference told by fill rather than by colour, so it survives greyscale and colour blindness both. Only termcade, GDAM and gdlint are filled.

All fourteen addons are public on GitHub and resolve on the registry, so every card links to its repository and none carries a status dot: there is no third state to tell apart. Two more gd-* directories exist in the workspace — gd-animate and gd-storybook — and are not on the page. Both are empty repositories with a one-line README, no addon/, no release and no registry entry; api.gdam.dev returns a placeholder rather than a package for them. They go on the page when they resolve.

Copy

Every blurb comes from the product's own repository — the READMEs, the design docs, and the config that decides defaults — not from a positioning exercise. The claims worth re-checking when a product changes:

  • GDAM: the separate gdam.link.json, and that publishing is authenticated with an owner-scoped secret key while the CLI itself carries none.
  • gdlint: four rules enabled by default out of sixteen, and that it is deliberately not an architecture checker.
  • termcade: games are sandboxed wasm under wazero with no filesystem and no network, a broken one shows up dimmed rather than taking the arcade down, and the arcade binary is also the dev kit.
  • Castle Drop: progression is castle upgrades only; waves, enemies, towers and tuning are Inspector-authored resources.
  • Prizm: no avatar, combat, health, timer or fail state in the MVP.
  • Fields of Revik: one deterministic core shared by the client and a headless Godot server; online play is fully server-authoritative.
  • The addons: the count. "Fourteen" is written out in the /devtools headline and intro, in the / door list, closing line and first principle, and in three meta descriptions, so publishing a fifteenth is a seven-place edit. Also each blurb's stated boundary — gd-network leaving auth and reconnect to the game, gd-supabase and gd-pocketbase decoding tokens rather than verifying them, gd-redis keeping flushdb behind an explicit opt-in, gd-playwright's CLI being strictly read-only — since those are the claims a reader would act on before installing.

Colour and the mark

The background is #252424, sampled out of src/assets/aviorstudio-logo.png — the mark ships with that colour baked in behind it, and matching it is what lets the ibis sit on the page instead of inside a visible square. The remaining few shades of difference are handled by fading the image's edges out with a radial mask rather than by repainting the asset.

Everything else is greyscale on purpose. Each product has a colour of its own — gdlint wears the Godot editor blue, gdam.dev its slate, Fields of Revik its parchment — and a studio that invented a seventh would be competing with the six things it exists to point at.

public/logo.png, public/logo-mark.png and public/favicon.png are generated from src/assets/aviorstudio-logo.png, which is the source of record:

magick src/assets/aviorstudio-logo.png -resize 512x512 -strip public/logo.png
magick src/assets/aviorstudio-logo.png -crop 810x810+120+112 +repage -resize 96x96 -strip public/logo-mark.png
magick src/assets/aviorstudio-logo.png -crop 810x810+120+112 +repage -resize 256x256 -strip public/favicon.png

The crop is tighter for the small sizes: at 30px the uncropped mark is a smudge, because the artwork's own margin eats most of the space.

Fonts are the platform's own. No font is fetched, so no visitor's IP reaches a font CDN and no CSP exception is needed to render the pages.

Domain

The site is https://avior.studio. The host appears in exactly three places — the canonical and structured-data URLs in src/layouts/Full.astro, the sitemap line in public/robots.txt, and the three <loc> entries in public/sitemap.xml — so moving it is a three-file change.

aviorstudio.com is a different domain and is not this site. Nothing here should point at it.

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Avior Studio web

The public avior.studio site. Three static Astro pages: an index, /devtools, and /games.

There is no authentication, no application state, no backend and no runtime environment configuration. The pages ship no JavaScript, which is why there are no integrations in astro.config.mjs and why CI fails on a <script src> in any build output.

Commands

CommandAction
bun installInstall dependencies
bun devStart the Astro development server
bun run buildGenerate the static site in dist/
bun previewPreview the static build

Pages

  • / — what the studio is, the two doors, and how the tools and games relate. The door lists name their contents rather than saying "and more", so the index cannot promise a page something that is not on it.
  • /devtools — GDAM and gdlint, with install commands and links, then the fourteen gd-* addons on the registry.
  • /games — termcade, Castle Drop, Prizm and Fields of Revik.

src/components/Entry.astro is the shared product block used by both inner pages: a fixed-width head column (name, tagline, status, meta) beside a body that flows.

The addons on /devtools deliberately do not use it. Entry is sized for a product with a status, a platform line and an install command of its own; fourteen of them would bury the two tools the page is mostly about. They are a card grid instead, defined as an addons array at the top of the page the way index.astro defines its doors. The install line is stated once above the grid because it is gdam install @aviorstudio/<name> for all fourteen, and each card links to its repository rather than carrying its own link row.

Status and links

Every product on the site is either linkable or explicitly not, and the page says which. Three of the six product repositories are private, and a link to a repository a reader cannot open is worse than no link:

ProductRepositoryPublic link on the site
GDAMpublicgdam.dev and GitHub
gdlintpublicgdlint.dev and GitHub
termcadepublicGitHub (termcade.com is still a placeholder, so it is not linked)
Castle Dropprivatenone — labelled Prototype
Prizmprivatenone — labelled Prototype
Fields of Revikprivatefieldsofrevik.com, which is live

The status dot is hollow by default and filled only for something a reader can run today — a difference told by fill rather than by colour, so it survives greyscale and colour blindness both. Only termcade, GDAM and gdlint are filled.

All fourteen addons are public on GitHub and resolve on the registry, so every card links to its repository and none carries a status dot: there is no third state to tell apart. Two more gd-* directories exist in the workspace — gd-animate and gd-storybook — and are not on the page. Both are empty repositories with a one-line README, no addon/, no release and no registry entry; api.gdam.dev returns a placeholder rather than a package for them. They go on the page when they resolve.

Copy

Every blurb comes from the product's own repository — the READMEs, the design docs, and the config that decides defaults — not from a positioning exercise. The claims worth re-checking when a product changes:

  • GDAM: the separate gdam.link.json, and that publishing is authenticated with an owner-scoped secret key while the CLI itself carries none.
  • gdlint: four rules enabled by default out of sixteen, and that it is deliberately not an architecture checker.
  • termcade: games are sandboxed wasm under wazero with no filesystem and no network, a broken one shows up dimmed rather than taking the arcade down, and the arcade binary is also the dev kit.
  • Castle Drop: progression is castle upgrades only; waves, enemies, towers and tuning are Inspector-authored resources.
  • Prizm: no avatar, combat, health, timer or fail state in the MVP.
  • Fields of Revik: one deterministic core shared by the client and a headless Godot server; online play is fully server-authoritative.
  • The addons: the count. "Fourteen" is written out in the /devtools headline and intro, in the / door list, closing line and first principle, and in three meta descriptions, so publishing a fifteenth is a seven-place edit. Also each blurb's stated boundary — gd-network leaving auth and reconnect to the game, gd-supabase and gd-pocketbase decoding tokens rather than verifying them, gd-redis keeping flushdb behind an explicit opt-in, gd-playwright's CLI being strictly read-only — since those are the claims a reader would act on before installing.

Colour and the mark

The background is #252424, sampled out of src/assets/aviorstudio-logo.png — the mark ships with that colour baked in behind it, and matching it is what lets the ibis sit on the page instead of inside a visible square. The remaining few shades of difference are handled by fading the image's edges out with a radial mask rather than by repainting the asset.

Everything else is greyscale on purpose. Each product has a colour of its own — gdlint wears the Godot editor blue, gdam.dev its slate, Fields of Revik its parchment — and a studio that invented a seventh would be competing with the six things it exists to point at.

public/logo.png, public/logo-mark.png and public/favicon.png are generated from src/assets/aviorstudio-logo.png, which is the source of record:

magick src/assets/aviorstudio-logo.png -resize 512x512 -strip public/logo.png
magick src/assets/aviorstudio-logo.png -crop 810x810+120+112 +repage -resize 96x96 -strip public/logo-mark.png
magick src/assets/aviorstudio-logo.png -crop 810x810+120+112 +repage -resize 256x256 -strip public/favicon.png

The crop is tighter for the small sizes: at 30px the uncropped mark is a smudge, because the artwork's own margin eats most of the space.

Fonts are the platform's own. No font is fetched, so no visitor's IP reaches a font CDN and no CSP exception is needed to render the pages.

Domain

The site is https://avior.studio. The host appears in exactly three places — the canonical and structured-data URLs in src/layouts/Full.astro, the sitemap line in public/robots.txt, and the three <loc> entries in public/sitemap.xml — so moving it is a three-file change.

aviorstudio.com is a different domain and is not this site. Nothing here should point at it.

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

Avior Studio web

The public avior.studio site. Three static Astro pages: an index, /devtools, and /games.

There is no authentication, no application state, no backend and no runtime environment configuration. The pages ship no JavaScript, which is why there are no integrations in astro.config.mjs and why CI fails on a <script src> in any build output.

Commands

CommandAction
bun installInstall dependencies
bun devStart the Astro development server
bun run buildGenerate the static site in dist/
bun previewPreview the static build

Pages

  • / — what the studio is, the two doors, and how the tools and games relate. The door lists name their contents rather than saying "and more", so the index cannot promise a page something that is not on it.
  • /devtools — GDAM and gdlint, with install commands and links, then the fourteen gd-* addons on the registry.
  • /games — termcade, Castle Drop, Prizm and Fields of Revik.

src/components/Entry.astro is the shared product block used by both inner pages: a fixed-width head column (name, tagline, status, meta) beside a body that flows.

The addons on /devtools deliberately do not use it. Entry is sized for a product with a status, a platform line and an install command of its own; fourteen of them would bury the two tools the page is mostly about. They are a card grid instead, defined as an addons array at the top of the page the way index.astro defines its doors. The install line is stated once above the grid because it is gdam install @aviorstudio/<name> for all fourteen, and each card links to its repository rather than carrying its own link row.

Status and links

Every product on the site is either linkable or explicitly not, and the page says which. Three of the six product repositories are private, and a link to a repository a reader cannot open is worse than no link:

ProductRepositoryPublic link on the site
GDAMpublicgdam.dev and GitHub
gdlintpublicgdlint.dev and GitHub
termcadepublicGitHub (termcade.com is still a placeholder, so it is not linked)
Castle Dropprivatenone — labelled Prototype
Prizmprivatenone — labelled Prototype
Fields of Revikprivatefieldsofrevik.com, which is live

The status dot is hollow by default and filled only for something a reader can run today — a difference told by fill rather than by colour, so it survives greyscale and colour blindness both. Only termcade, GDAM and gdlint are filled.

All fourteen addons are public on GitHub and resolve on the registry, so every card links to its repository and none carries a status dot: there is no third state to tell apart. Two more gd-* directories exist in the workspace — gd-animate and gd-storybook — and are not on the page. Both are empty repositories with a one-line README, no addon/, no release and no registry entry; api.gdam.dev returns a placeholder rather than a package for them. They go on the page when they resolve.

Copy

Every blurb comes from the product's own repository — the READMEs, the design docs, and the config that decides defaults — not from a positioning exercise. The claims worth re-checking when a product changes:

  • GDAM: the separate gdam.link.json, and that publishing is authenticated with an owner-scoped secret key while the CLI itself carries none.
  • gdlint: four rules enabled by default out of sixteen, and that it is deliberately not an architecture checker.
  • termcade: games are sandboxed wasm under wazero with no filesystem and no network, a broken one shows up dimmed rather than taking the arcade down, and the arcade binary is also the dev kit.
  • Castle Drop: progression is castle upgrades only; waves, enemies, towers and tuning are Inspector-authored resources.
  • Prizm: no avatar, combat, health, timer or fail state in the MVP.
  • Fields of Revik: one deterministic core shared by the client and a headless Godot server; online play is fully server-authoritative.
  • The addons: the count. "Fourteen" is written out in the /devtools headline and intro, in the / door list, closing line and first principle, and in three meta descriptions, so publishing a fifteenth is a seven-place edit. Also each blurb's stated boundary — gd-network leaving auth and reconnect to the game, gd-supabase and gd-pocketbase decoding tokens rather than verifying them, gd-redis keeping flushdb behind an explicit opt-in, gd-playwright's CLI being strictly read-only — since those are the claims a reader would act on before installing.

Colour and the mark

The background is #252424, sampled out of src/assets/aviorstudio-logo.png — the mark ships with that colour baked in behind it, and matching it is what lets the ibis sit on the page instead of inside a visible square. The remaining few shades of difference are handled by fading the image's edges out with a radial mask rather than by repainting the asset.

Everything else is greyscale on purpose. Each product has a colour of its own — gdlint wears the Godot editor blue, gdam.dev its slate, Fields of Revik its parchment — and a studio that invented a seventh would be competing with the six things it exists to point at.

public/logo.png, public/logo-mark.png and public/favicon.png are generated from src/assets/aviorstudio-logo.png, which is the source of record:

magick src/assets/aviorstudio-logo.png -resize 512x512 -strip public/logo.png
magick src/assets/aviorstudio-logo.png -crop 810x810+120+112 +repage -resize 96x96 -strip public/logo-mark.png
magick src/assets/aviorstudio-logo.png -crop 810x810+120+112 +repage -resize 256x256 -strip public/favicon.png

The crop is tighter for the small sizes: at 30px the uncropped mark is a smudge, because the artwork's own margin eats most of the space.

Fonts are the platform's own. No font is fetched, so no visitor's IP reaches a font CDN and no CSP exception is needed to render the pages.

Domain

The site is https://avior.studio. The host appears in exactly three places — the canonical and structured-data URLs in src/layouts/Full.astro, the sitemap line in public/robots.txt, and the three <loc> entries in public/sitemap.xml — so moving it is a three-file change.

aviorstudio.com is a different domain and is not this site. Nothing here should point at it.

Releases

Packages

Contributors

Languages