Astro + Starlight site for shinylib.net, deployed to GitHub Pages.
.
├── .github/workflows/deploy.yml CI: builds the site and deploys to Pages
├── astro.config.mjs Astro + Starlight config, redirects
├── package.json
├── public/ Static assets copied verbatim into dist/
│ └── playground/index.html Landing page linking out to the six
│ per-library demo deployments
└── src/
├── assets/
├── components/ Custom Starlight component overrides
├── content/docs/ Documentation pages (.md / .mdx)
├── sidebar-topics.mjs Shared sidebar topic config
└── styles/
| Command | Action |
|---|---|
npm install |
Install dependencies |
npm run dev |
Start the Astro dev server |
npm run build |
Build the production site to dist/ |
npm run preview |
Preview the built site locally |
npm run astro … |
Run Astro CLI commands directly |
Each library demo lives in its own sibling repo and deploys to its own GitHub Pages site. This docs repo links out to them — it does not build or host them.
| Library | URL | Source repo |
|---|---|---|
| AI Conversation | https://shinyorg.github.io/aiconversation/ | shinyorg/aiconversation |
| Controls | https://shinyorg.github.io/controls/ | shinyorg/controls |
| DocumentDb | https://shinyorg.github.io/DocumentDb/ | shinyorg/DocumentDb |
| Mediator | https://shinyorg.github.io/mediator/ | shinyorg/mediator |
| Shiny Core | https://shinyorg.github.io/shiny/ | shinyorg/shiny |
| Speech | https://shinyorg.github.io/speech/ | shinyorg/speech |
public/playground/index.html is a static landing page on this site that cards out to those URLs — kept so old /playground/ bookmarks still resolve. Each library's sidebar in Starlight also has a direct "Blazor Playground" link to the corresponding external URL.
Each demo is deployed by its own .github/workflows/deploy-blazor-sample.yml in the sibling repo: triggers on push to that repo's active branch (paths-scoped to the sample + relevant src), publishes the WASM app, rewrites <base href> to /<repo-name>/, and uploads to GitHub Pages.
Blog posts get a giscus comment widget rendered after the article body. Any docs page can opt in by adding comments: true to its frontmatter.
The widget is wired through three pieces:
giscusConfiginastro.config.mjs— repo, repo-id, category, category-id, etc., exposed to components viaimport.meta.env.GISCUS.src/components/Giscus.astro— loadsgiscus.app/client.jsand syncs the iframe theme with Starlight's light/dark toggle.src/components/MarkdownContent.astro— Starlight override that injects<Giscus />after page content when the entry lives underblog/or hascomments: true.
- Install the giscus GitHub App on the
shinyorg/documentationrepo: https://github.com/apps/giscus. Grant it access to that repo only. - Enable Discussions on the repo: Settings → General → Features → check Discussions.
- Create (or pick) a Discussion category for comments. The default
Announcementsworks, but a dedicatedCommentscategory with the Announcement format is recommended so only maintainers can start threads (giscus creates them on demand). - Visit https://giscus.app, fill in:
- Repository:
shinyorg/documentation - Page ↔ Discussions Mapping:
pathname(matches the default inastro.config.mjs) - Discussion Category: the one created above
- Repository:
- Scroll to the Enable giscus snippet at the bottom of giscus.app and copy the four
data-*values:data-repo-id→giscusConfig.repoIddata-category→giscusConfig.categorydata-category-id→giscusConfig.categoryId- (
data-reposhould already match)
- Paste them into
giscusConfiginastro.config.mjs, replacing theREPLACE_WITH_*placeholders. npm run build && npm run preview, open any blog post, and confirm the widget loads.
Add comments: true to the page's frontmatter:
---
title: My page
comments: true
---The comments field is declared on the docs schema in src/content.config.ts, so unknown-field warnings won't fire.
.github/workflows/deploy.yml:
actions/checkout@v6withastro/action@v6— runsnpm ci && npm run buildand uploadsdist/as the Pages artifactactions/deploy-pages@v4— pushes the artifact to GitHub Pages
Builds run on every push to main and dev; only main deploys.