Marketing site for FBIde — built with Astro and Bootstrap 5. Static, no JS framework, no PHP, no jQuery. Bootstrap and its bundle script are pulled from a CDN so the build has zero compiled JS of its own.
Replicates the look and feel of the original 2012-era PHP site.
fbide_website/
├── astro.config.mjs Astro config (static, single-output)
├── package.json
├── public/ Static assets served as-is
│ ├── favicon.png
│ └── images/
│ ├── horse.png Hero illustration
│ └── screenshots/ Gallery images (PNG)
└── src/
├── layouts/
│ └── BaseLayout.astro navbar + footer + Bootstrap scaffolding
├── components/
│ ├── Hero.astro home-page hero band
│ └── Gallery.astro modal-driven screenshot grid
├── pages/
│ ├── index.astro Overview / home
│ ├── download.astro Win64 + Win32 zip download cards
│ └── changelog.astro Release notes
├── data/
│ ├── release.json Single source of truth for current version
│ └── gallery.json List of screenshots shown on the home page
└── styles/
└── site.css Custom overrides on top of Bootstrap 5
npm install
npm run dev # dev server with hot-reload, http://localhost:4321
npm run build # static output in dist/
npm run preview # preview the built site locallyAfter cutting a new FBIde release, update src/data/release.json:
{
"version": "0.5.0.beta-2",
"tag": "v0.5.0.beta-2",
"isPrerelease": true,
"downloads": {
"win64": "https://github.com/albeva/fbide/releases/download/v0.5.0.beta-2/fbide-0.5.0.beta-2-win64.zip",
"win32": "https://github.com/albeva/fbide/releases/download/v0.5.0.beta-2/fbide-0.5.0.beta-2-win32.zip"
},
"releasePage": "https://github.com/albeva/fbide/releases/tag/v0.5.0.beta-2",
"releaseDate": "2026-MM-DD",
"githubRepo": "https://github.com/albeva/fbide"
}The home page hero, the download cards, and the changelog header all
read from this file — the version only needs to change in one place.
Add a new <article> to src/pages/changelog.astro per release.
Drop full-size PNGs into public/images/screenshots/ and reference
them in src/data/gallery.json. Each entry is { src, caption }; an
optional thumb key lets you ship a smaller thumbnail separately.
The layout is set up to grow — new pages can be added under src/pages/
and will pick up the navigation by passing an activeNav prop. Likely
candidates: a Build From Source guide, a Getting Started walkthrough,
and a Contributing page.
Google Analytics 4 (G-R2Q0EKY87R) is wired into BaseLayout. The
gtag tag is emitted only on production builds (npm run build) — local
npm run dev skips it, so personal browsing never hits GA. To change
the measurement ID or remove analytics entirely, edit
src/components/Analytics.astro.
npm run build produces a fully static dist/ directory. Drop it on
any static host. No server-side runtime required.
The current production deploy ships to the FreeBASIC FTP host via
.github/workflows/deploy.yml — every push to main rebuilds and
uploads only the changed files (SamKirkland/FTP-Deploy-Action keeps
a .ftp-deploy-sync-state.json on the remote for delta detection).
Required repository secrets (Settings → Secrets and variables → Actions → Secrets):
| Name | Value |
|---|---|
FTP_HOST |
hostname (no ftp:// prefix) |
FTP_USERNAME |
login user |
FTP_PASSWORD |
login password |
Optional repo variables (Variables tab):
| Name | Default | Notes |
|---|---|---|
FTP_SERVER_DIR |
/public_html/ |
Remote path to sync into. |
FTP_PROTOCOL |
ftps |
Set to ftp for plain FTP hosts. |
Optional secret FTP_PORT (default 21).
To trigger a deploy without pushing: Actions → Deploy → Run workflow.