Building a Modern Web Application with Astro
Astro is a modern web framework built for content-heavy sites that need strong performance without giving up developer ergonomics.
Why Astro?
In the ever-evolving landscape of web development, choosing the right framework can make or break your project. Astro stands out for several compelling reasons:
- Performance First — Ship less JavaScript and keep the default runtime light
- Content Focused — A strong fit for blogs, docs, landing pages, and design-heavy sites
- Flexible — Use Astro components first, and add React, Vue, Svelte, or other UI islands only where they help
- Composable Rendering — Mix static pages, content collections, and server routes when the project actually needs them
The best code is no code at all. Astro embraces this philosophy by minimizing client-side JavaScript.
Getting Started
Start by creating a new Astro project:
npm create astro@latest my-project
cd my-project
npm install
npm run devOnce the project is running, Astro gives you a fast baseline: file-based routing, .astro components, Markdown support, and a production build that stays close to the shape of your content.
Project Structure
A typical content-focused Astro project might look like this:
├── src/
│ ├── components/
│ │ └── Card.astro
│ ├── content/
│ │ └── blog/
│ │ └── hello-world.md
│ ├── layouts/
│ │ └── BaseLayout.astro
│ ├── pages/
│ │ ├── index.astro
│ │ └── api/
│ │ └── health.json.ts
│ └── styles/
│ └── global.css
├── public/
│ └── favicon.svg
├── src/content.config.ts
├── astro.config.mjs
└── package.jsonCreating Components
Astro components use the .astro extension and let you keep data loading, markup, and component-scoped styles in one file:
---
// Component script
const { title, description } = Astro.props;
const publishDate = new Intl.DateTimeFormat('en-US', {
dateStyle: 'long'
}).format(new Date());
---
<article class="card">
<h2>{title}</h2>
<p>{description}</p>
<time>{publishDate}</time>
</article>
<style>
.card {
padding: 1.5rem;
border-radius: 8px;
background: #f5f5f4;
}
</style>Why The Baseline Feels Fast
Astro’s default model is simple:
- static HTML is generated ahead of time when possible
- client-side JavaScript is opt-in instead of automatic
- content and route structure stay close to the filesystem
- interactive widgets can be isolated instead of turning the whole page into an app shell
Key Features
Content Collections
Content Collections provide type-safe content management and work especially well for blogs, docs, changelogs, and internal knowledge bases:
// src/content.config.ts
import { defineCollection } from 'astro:content';
import { glob } from 'astro/loaders';
import { z } from 'astro/zod';
const posts = defineCollection({
loader: glob({ pattern: '**/*.md', base: './src/content/posts' }),
schema: z.object({
title: z.string(),
description: z.string().optional(),
date: z.coerce.date(),
tags: z.array(z.string()).default([]),
draft: z.boolean().default(false),
}),
});
export const collections = { posts };Server Routes When You Need Them
Astro can stay fully static, but you can also add server routes for read-only JSON, form handling, or authenticated actions when the deployment target supports them:
// src/pages/api/health.json.ts
import type { APIRoute } from 'astro';
export const GET: APIRoute = () => {
return new Response(
JSON.stringify({ ok: true, updatedAt: new Date().toISOString() }),
{
headers: {
'Content-Type': 'application/json; charset=utf-8'
}
}
);
};Deployment
For a content-focused site, the default deployment loop is still pleasantly small:
npm run build
npm run previewIf the site is mostly static, you can ship the generated output to any static host. If you need on-demand server logic, Astro also supports adapter-based deployment targets.
The important part is to choose the smallest runtime that still matches the problem you’re solving.
Conclusion
Astro works best when you want a site to feel fast, stay maintainable, and let content drive the structure. Whether you’re building a personal blog, a product handbook, or a theme demo, it gives you a clean baseline and enough escape hatches for the parts that genuinely need more power.
This article was written for demonstration purposes to showcase the Astro-Whono theme’s typography.