A multi-page landing site built with Astro that showcases your collection of software tools, organised into categories.
astro-tools-site/
├── public/
│ └── screenshots/ ← Drop tool screenshots here (1280×800 recommended)
├── src/
│ ├── data/
│ │ └── tools.ts ← ⭐ THE MAIN CONFIG FILE — edit this first
│ ├── components/
│ │ ├── Nav.astro — Sticky navigation with all categories
│ │ ├── Footer.astro — Site-wide footer with tool directory
│ │ ├── CategoryCard.astro — Card used on the home page grid
│ │ └── ToolCard.astro — Tool card used on category pages
│ ├── layouts/
│ │ └── Base.astro — HTML shell, fonts, global CSS tokens
│ └── pages/
│ ├── index.astro — Home page
│ ├── 404.astro — Not found page
│ └── category/
│ └── [id].astro — Dynamic category page (auto-generated per category)
├── astro.config.mjs
└── package.json
npm install
npm run dev # http://localhost:4321
npm run build # production build → dist/
npm run preview # preview the buildAll content lives in src/data/tools.ts. You don't need to touch any page
files to add categories or tools — just edit the data file.
{
id: 'my-category', // URL slug → /category/my-category
name: 'My Category',
icon: '🧩',
accent: '#f59e0b', // Hex colour used as the category accent
description: 'Short description shown on the home page and category header.',
tools: [
// ...see below
],
}{
id: 'my-tool', // used as the anchor #my-tool
name: 'My Tool',
tagline: 'One-line value proposition',
description: 'Two–three sentence description shown on the tool card.',
screenshot: '/screenshots/my-tool.png', // put the file in /public/screenshots/
screenshotAlt: 'My Tool screenshot',
url: 'https://my-tool.example.com',
badge: 'New', // optional: "New", "Beta", "v2.0", etc.
}- Open
src/components/Nav.astroand replace the inline<svg>with your logo. - Do the same in
src/pages/index.astroin the hero section. - Optionally replace the
Toolboxtext references with your company name.
- Place PNG/JPEG files in
public/screenshots/ - Recommended: 1280 × 800 px (16:10 ratio)
- In
ToolCard.astro, swap the placeholder<div>for a real<img>tag:(A comment in the file marks this spot.)<img src={tool.screenshot} alt={tool.screenshotAlt} loading="lazy" />
Global design tokens are in src/layouts/Base.astro inside :root { ... }.
| Token | Default | Purpose |
|---|---|---|
--bg |
#0c0d10 |
Page background |
--surface |
#13151a |
Card / nav background |
--border |
#1e2029 |
Borders |
--text |
#e8eaf0 |
Primary text |
--muted |
#6b7280 |
Secondary / placeholder text |
--accent |
#5b8eff |
Global accent (hero CTA etc.) |
Fonts are loaded from Google Fonts: Syne (display) + DM Sans (body).
Change them in the <link> tag in Base.astro.
The site builds to a static dist/ directory and can be hosted on any static
hosting platform:
- Netlify: connect the repo, set build command to
npm run build, publish dir todist - Vercel: same settings, zero-config Astro support
- GitHub Pages: add
basetoastro.config.mjsif serving from a sub-path
Update site in astro.config.mjs to your real domain before deploying.