Built-in Astro native i18n routing, defaulting to zh_CN and also providing en_US, with content stored in JSON files under the i18n directory
LandingPage — Astro Portfolio Template
By Vncntvx
A minimalist personal landing page theme built with Astro, featuring built-in Chinese and English routing, dark mode, RSS aggregation, and an EmailJS contact form, with content driven by i18n JSON files.
Explore the design
Compare the page layouts and mobile experience. Open any screenshot for a closer look.
Actual screenshot captured by the server browser.
All pages & views 2
Screenshots show visual appearance; interactive behavior may differ.
What stands out
A quick read of the recorded project description.
Dark mode supports system preference detection and localStorage persistence, controlled by the React island ThemeToggle
The featured posts section can aggregate RSS/Atom sources; before build, a Bun script fetches them and generates rss-posts.json, supporting multiple feeds and item limits
The contact form comes with EmailJS integration and form validation, configured via environment variables for service, template, and public key
The content structure is validated by the Zod schema in src/content.config.ts, with fields covering site, navigation, Hero, works, About, Contact, and footer
Integrated automatic generation of sitemap and robots.txt, and support for the Astro Image API to handle local and remote images
Template Details
LandingPage is a minimalist personal landing page theme built with Astro. The repository uses the MIT license, and the demo site is wenjiexu.site. The page structure centers on a personal homepage: the homepage includes a Hero introduction, a website portfolio section (WebsitesSection), and a featured posts section (FeaturedPostsSection), along with About, Contact, and 404 pages, with routes distinguished by language prefix.
Content is not written into components but is centralized in two files, i18n/zh_CN.json and i18n/en_US.json. The fields cover site information, navigation, avatar, Hero, website list, featured posts, footer registration and social links, About timeline and values, Contact cards and form copy, and more, and are validated through the Zod schema in src/content.config.ts. The theme includes Astro's native i18n routing and middleware, with the default language being zh_CN and support for zh_CN and en_US.
The interactive parts use React islands: HeaderBar, PrimaryNav, LanguageSwitcher, ThemeToggle, the Contact form, and ErrorBoundary; the static display parts are Astro components. Dark mode switches automatically based on system preference and writes to localStorage. Featured posts can be fetched from RSS/Atom sources; before build, scripts/fetch-rss.bun.js pulls them and generates src/data/rss-posts.json, with configurable multiple feeds, parsers, and item limits. The contact form relies on EmailJS and requires configuring the corresponding environment variables; Google Analytics is optional. The site outputs static files, with build artifacts in the dist/ directory.
Before use, note the following: the licenses for third-party assets such as demo images, fonts, and icons must be checked separately; external services such as EmailJS, hosting, and domains may incur costs; the theme does not state specific production environment behavior.
Is it right for your project?
Use Cases
- Building a personal homepage to centrally display self-introduction, portfolio websites, and selected blog posts
- Personal sites or small corporate landing pages that need Chinese-English language switching
- Maintaining site copy and navigation structure through JSON files rather than code
- Aggregating an existing blog's RSS/Atom sources into the featured posts area of the landing page
- Needing a static personal site starting point with dark mode and a contact form
Suitable For
- Developers familiar with Astro and React basics who are willing to maintain content through JSON files
- Independent developers and designers who need a bilingual personal homepage or portfolio page
- Users who want to deploy as static output and configure external services such as EmailJS themselves
Getting started & customization
Use these recorded setup notes alongside the repository instructions for your chosen version.
- 1
Requires Bun 1.0+ or Node.js 18+. After cloning the repository, run bun install, then start the development server with bun run dev (default http://localhost:4321)
- 2
The contact form requires creating a .env in the project root and filling in PUBLIC_EMAILJS_SERVICE_ID, PUBLIC_EMAILJS_TEMPLATE_ID, and PUBLIC_EMAILJS_PUBLIC_KEY; Google Analytics is optional via PUBLIC_GA_ID
- 3
Site URL, i18n languages and routing, remote image domains, and other configurations are located in astro.config.mjs; before deployment, change site to the actual domain
- 4
The build command bun run build first fetches RSS sources, outputs artifacts to the dist/ directory, and can be previewed with bun run preview
- 5
The licenses for third-party assets such as demo images, fonts, and icons must be checked separately; external services such as EmailJS, domains, and hosting may incur additional charges
License & source material
Usage conditions & limitations
Free to use · keep license noticeThis listing covers the free version under the MIT license in the public repository; the free scope is the code of that version and does not mean external services or third-party assets are free.
Must comply with when using
- Free use, modification, commercial use, and distribution of that version's code are permitted.
- When distributing copies or substantial portions of the code, retain the original author's copyright notice and the complete MIT license notice.
- The code is provided as is; warranties and limitations of liability are governed by the original license and applicable law.
Additional costs & items to verify
- Demo images, fonts, icons, and other third-party assets must be checked under their respective licenses and cannot be judged solely by the code's MIT license.
- External services such as domains, hosting, databases, payments, or AI may incur additional charges.
- The contact form functionality depends on the external EmailJS service; you must register yourself and configure the three environment variables SERVICE_ID, TEMPLATE_ID, and PUBLIC_KEY, otherwise the form cannot send emails.
- Google Analytics is an optional integration; you must provide your own GA measurement ID and configure the environment variable. If not configured, analytics will not be enabled.
- Running and building require a Bun 1.0+ or Node.js 18+ environment, which is a local toolchain requirement before use.
- Featured post aggregation requires you to provide accessible RSS/Atom source URLs; during build, content is fetched from these external sources, and unavailable sources will affect the data in that area.
- The footer copyright text is placeholder sample content; users must replace it with their own attribution and year and cannot directly reuse the sample content.
View Original Text Basis
Permission is hereby granted, free of charge
Original License Text
# EmailJS (required for contact form) PUBLIC_EMAILJS_SERVICE_ID=your_service_id PUBLIC_EMAILJS_TEMPLATE_ID=your_template_id PUBLIC_EMAILJS_PUBLIC_KEY=your_public_key
Original README
# Google Analytics (optional) PUBLIC_GA_ID=G-XXXXXXXXXX
Original README
- [Bun](https://bun.sh/) 1.0+ (recommended) or [Node.js](https://nodejs.org/) 18+
Original README
"feeds": [ { "url": "https://blog.example.com/feed.xml", "parser": "default" } ],
Original README
https://github.com/Vncntvx/LandingPage/blob/main/LICENSEhttps://github.com/Vncntvx/LandingPage/blob/main/README.md"copyright": "© 2024 Your Name. All rights reserved.",
Original README
Compiled by DeepSeek based on repository license and README ·2026-10-11. Results only cover the materials read; dependencies, images, fonts, and subsequent term changes are subject to their respective original texts.
Project checks & description sources
Template Information
- Source platforms
- GitHub
- Documentation and maintenance reference score
- More documented · 85 / 100
- Technologies
- Astro
- Website type
- Portfolio · Corporate Website
How this score is calculated
Our heuristic uses license records (up to 30), a demo link (12), a preview (10), stars (15), recorded maintenance (15), description completeness (8), feature records (5) and classification data (5). It is not a code, security or performance test, or a Google score. A link does not establish tested functionality.
What to verify for this project
- Repository update recorded
- 2026-10-11
- Screenshot last checked
- 2026-10-11
A demo link is listed. Check it with your own content and viewport sizes; its presence does not confirm that forms, authentication or payments work.
The catalog identifies Astro as the primary stack. Check the actual dependency manifest and lockfile for versions and hosting requirements. These notes use recorded metadata, not a code audit or a deployment test.
Use a selection guide →How this description was prepared
AI-assisted description based on catalog records and repository material. Repository authors are not automatically the reviewers of this description.
Review declaration: [email protected] · 2026-10-11
Inspect the recorded source material
SHA-256: fb0b3f16e86c4de3d1dcb045a1657af553eef53792287b1371800e2c2583c031
2026-10-11T09:06:57.456Z
Source file / repository<p align="center">
<img src="public/assets/img/website.png" alt="LandingPage Preview" width="800" />
</p>
<h1 align="center">LandingPage</h1>
<p align="center">
<strong>A modern, minimalist personal landing page theme built with Astro 5, React 19 and Tailwind CSS</strong>
</p>
<p align="center">
<a href="https://github.com/Vncntvx/LandingPage/blob/main/LICENSE">
<img src="https://img.shields.io/badge/license-MIT-blue.svg" alt="License" />
</a>
<a href="https://astro.build/">
<img src="https://img.shields.io/badge/Astro-5.x-ff5d01.svg?logo=astro" alt="Astro" />
</a>
<a href="https://react.dev/">
<img src="https://img.shields.io/badge/React-19.x-61dafb.svg?logo=react" alt="React" />
</a>
<a href="https://tailwindcss.com/">
<img src="https://img.shields.io/badge/Tailwind-3.x-38bdf8.svg?logo=tailwindcss" alt="Tailwind CSS" />
</a>
<a href="https://bun.sh/">
<img src="https://img.shields.io/badge/Bun-1.x-fbf0df.svg?logo=bun" alt="Bun" />
</a>
</p>
<p align="center">
<a href="#features">Features</a> •
<a href="#quick-start">Quick Start</a> •
<a href="#project-structure">Project Structure</a> •
<a href="#configuration">Configuration</a> •
<a href="#deployment">Deployment</a> •
<a href="#contributing">Contributing</a>
</p>
<p align="center">
<a href="README.md">English</a> | <a href="README_zh.md">中文</a>
</p>
---
## ✨ Features
| Feature | Description |
| ----------------------------- | ------------------------------------------------------------------------------------------------------- |
| **🌐 Internationalization** | Built-in i18n with Astro's native routing and Content Collections with TypeScript validation |
| **🌙 Dark Mode** | Automatic theme switching with system preference detection and localStorage persistence |
| **📱 Responsive Design** | Mobile-first design optimized for all devices |
| **📰 RSS Aggregation** | Advanced RSS/Atom feed system with multiple parsers, automatic image generation, and pre-build fetching |
| **📧 Contact Form** | Pre-configured EmailJS integration with form validation |
| **📊 Analytics** | Optional Google Analytics 4 integration |
| **🏝️ Islands Architecture** | React components loaded on demand, minimizing JS bundle size |
| **🔍 SEO Optimized** | Auto-generated sitemap.xml and robots.txt with i18n support |
| **⚡ Fast Performance** | Static site generation with optimized assets and image processing |
| **🖼️ Image Optimization** | Astro's Image API integration with responsive image generation |
| **📝 Content Validation** | Zod schema validation for all content with TypeScript type safety |
| **🔄 Automated RSS Fetching** | Pre-build RSS fetching with retry logic and error handling |
## 🚀 Quick Start
### Prerequisites
- [Bun](https://bun.sh/) 1.0+ (recommended) or [Node.js](https://nodejs.org/)
18+
### Create Your Site
```bash
# Clone the repository
git clone https://github.com/Vncntvx/LandingPage.git my-site
cd my-site
# Install dependencies
bun install
# Start development server
bun run dev
```
Open [http://localhost:4321](http://localhost:4321) to see your site.
### Build for Production
```bash
# Build the site (RSS feeds are automatically fetched)
bun run build
# Preview the production build
bun run preview
```
Output is generated in the `dist/` directory, ready for deployment.
## 📁 Project Structure
```
src/
├── components/
│ ├── react/ # React Islands (interactive components)
│ │ ├── Contact.jsx # Contact form with EmailJS
│ │ ├── ErrorBoundary.jsx # React error boundary
│ │ ├── HeaderBar.jsx # Navigation header with language switcher
│ │ ├── LanguageSwitcher.jsx # Language selector component
│ │ ├── PrimaryNav.jsx # Primary navigation menu
│ │ ├── ThemeToggle.jsx # Dark/light mode toggle
│ │ └── UnderlineEffects.jsx # Underline hover effects
│ │
│ └── ui/ # Astro Components (static components)
│ ├── Hero.astro # Hero section
│ ├── Footer.astro # Site footer
│ ├── WebsiteItem.astro # Website showcase item
│ ├── WebsitesSection.astro # Websites showcase section
│ ├── FeaturedPostItem.astro # Featured post item
│ └── FeaturedPostsSection.astro # Featured posts section
│
├── layouts/
│ └── BaseLayout.astro # Global layout with SEO and meta tags
│
├── lib/
│ ├── i18n.ts # Internationalization utilities
│ ├── utils.ts # Common utility functions
│ ├── localImages.ts # Local image processing utilities
│ └── websiteImages.ts # Website image processing utilities
│
├── pages/
│ ├── index.astro # Root homepage (renders Chinese version)
│ ├── 404.astro # Root 404 page
│ └── [lang]/ # Dynamic routes for languages
│ ├── index.astro # Language-specific homepage
│ ├── about.astro # About page
│ ├── contact.astro # Contact page
│ └── 404.astro # Language-specific 404 page
│
├── data/
│ └── rss-posts.json # RSS aggregated posts data (auto-generated)
│
└── styles/
└── global.css # Global styles and custom CSS
i18n/ # Internationalization content
├── zh_CN.json # Chinese content
└── en_US.json # English content
scripts/
└── fetch-rss.bun.js # RSS fetching script with advanced parsing
src/
├── content.config.ts # Content collections schema and validation
└── middleware.ts # Internationalization routing middleware
```
## ⚙️ Configuration
### Environment Variables
Create a `.env` file in the project root:
```env
# EmailJS (required for contact form)
PUBLIC_EMAILJS_SERVICE_ID=your_service_id
PUBLIC_EMAILJS_TEMPLATE_ID=your_template_id
PUBLIC_EMAILJS_PUBLIC_KEY=your_public_key
# Google Analytics (optional)
PUBLIC_GA_ID=G-XXXXXXXXXX
```
### Site Configuration
Main configuration is in `astro.config.mjs`:
```js
export default defineConfig({
// Site URL for production
site: 'https://your-domain.com',
// Static site generation
output: 'static',
// Internationalization
i18n: {
defaultLocale: 'zh_CN',
locales: ['zh_CN', 'en_US'],
routing: {
prefixDefaultLocale: true,
redirectToDefaultLocale: false,
},
},
// Integrations
integrations: [
react(), // React support
mdx(), // MDX support
tailwind(), // Tailwind CSS
icon(), // Iconify icons
sitemap({
// Auto-generate sitemap.xml with i18n support
i18n: {
defaultLocale: 'zh_CN',
locales: {
zh_CN: 'zh-CN',
en_US: 'en-US',
},
},
}),
robotsTxt(), // Auto-generate robots.txt
],
// Image optimization
image: {
domains: ['images.unsplash.com', 'unsplash.com', 'picsum.photos'],
remotePatterns: [
{
protocol: 'https',
hostname: '**.unsplash.com',
},
{
protocol: 'https',
hostname: 'picsum.photos',
},
],
},
});
```
### Content Management
All site content is managed through JSON files in `i18n/`:
| File | Description |
| ------------ | --------------- |
| `zh_CN.json` | Chinese content |
| `en_US.json` | English content |
Content structure follows a strict schema defined in `src/content.config.ts`
with Zod validation:
```json
{
"site": {
"title": "Site Title",
"author": "Your Name",
"description": "Site description",
"keywords": "keywords, for, seo"
},
"nav": [
{ "label": "Home", "href": "index.html" },
{ "label": "About", "href": "about.html" },
{ "label": "Contact", "href": "contact.html" }
],
"header": {
"avatar": "/img/prof_pic.png",
"name": "Your Name"
},
"hero": {
"subtitle": "Welcome",
"title": "Your Name",
"description": "Your introduction text..."
},
"websites": {
"title": "My Websites",
"items": [
{
"id": "website-1",
"title": "Website Title",
"image": "/websites/website.png",
"url": "https://example.com",
"description": "Website description"
}
]
},
"featuredPosts": {
"title": "Featured Posts",
"rss": {
"enabled": true,
"feeds": [
{ "url": "https://blog.example.com/feed.xml", "parser": "default" }
],
"limit": 6
},
"items": [],
"seeAllText": "See all posts",
"seeAllUrl": "https://blog.example.com"
},
"footer": {
"copyright": "© 2024 Your Name. All rights reserved.",
"icp": {
"text": "ICP备案号",
"url": "https://beian.miit.gov.cn"
},
"mps": {
"text": "公安备案号",
"url": "https://www.beian.gov.cn",
"logo": "/assets/img/mps-logo.png"
},
"socialLinks": [
{
"icon": "mdi:github",
"url": "https://github.com/yourusername",
"title": "GitHub"
}
]
},
"about": {
"hero": {
"subtitle": "About",
"title": "About Me",
"description": "About me description..."
},
"timeline": {
"subtitle": "Journey",
"title": "My Timeline",
"period": "2018 - Present",
"items": [
{
"period": "2020-2023",
"title": "Job Title",
"description": "Job description..."
}
]
},
"values": {
"subtitle": "Values",
"title": "My Values",
"items": [
{
"label": "Value 1",
"text": "Value description..."
}
],
"product": {
"subtitle": "Product",
"title": "My Product",
"description": "Product description...",
"linkText": "Learn more",
"linkUrl": "https://product.example.com"
}
},
"philosophy": {
"subtitle": "Philosophy",
"title": "My Philosophy",
"description": "Philosophy description...",
"ctaText": "Get in touch",
"ctaUrl": "/contact"
}
},
"contact": {
"hero": {
"subtitle": "Contact",
"title": "Get in Touch",
"description": "Contact description..."
},
"cards": {
"email": {
"subtitle": "Email",
"address": "[email protected]",
"note": "Response within 24 hours"
},
"social": {
"subtitle": "Social Media",
"items": [
{
"label": "GitHub",
"url": "https://github.com/yourusername",
"icon": "mdi:github",
"handle": "@yourusername"
}
]
}
},
"form": {
"subtitle": "Send Message",
"title": "Contact Form",
"note": "All fields are required"
},
"actions": {
"writeEmail": "Write Email",
"copy": "Copy",
"copied": "Copied!"
},
"formLabels": {
"name": "Name",
"email": "Email",
"topic": "Topic",
"message": "Message"
},
"formPlaceholders": {
"name": "Your name",
"email": "[email protected]",
"message": "Your message..."
},
"formOptions": {
"consulting": "Consulting",
"content": "Content Creation",
"share": "Share Ideas",
"other": "Other"
},
"formSubmit": {
"default": "Send Message",
"sending": "Sending...",
"success": "Message Sent!",
"error": "Error Sending"
},
"services": {
"items": [
{
"subtitle": "Service 1",
"title": "Service Title",
"description": "Service description..."
}
]
}
}
}
```
### RSS Configuration
Configure RSS aggregation in your locale JSON:
```json
{
"featuredPosts": {
"rss": {
"enabled": true,
"feeds": [
{ "url": "https://blog.example.com/feed.xml", "parser": "default" },
{
"url": "https://astro-paper.vercel.app/rss.xml",
"parser": "astroPaper"
}
],
"limit": 6
}
}
}
```
#### Supported RSS Parsers
| Parser | Description | Use Case |
| ------------ | ------------------------ | ----------------------------- |
| `default` | Standard RSS/Atom parser | Most RSS feeds |
| `astroPaper` | Astro Paper theme parser | Blogs using Astro Paper theme |
| `jekyllFeed` | Jekyll feed parser | Jekyll-based blogs |
#### RSS Features
- **Multi-parser support**: Different parsers for different feed formats
- **Automatic image generation**: Deterministic hash-based images from Picsum
- **Retry logic**: Exponential backoff for failed requests
- **Content validation**: Type-safe content processing
- **Pre-build fetching**: Automatically runs before build
Fetch RSS feeds manually:
```bash
bun run fetch:rss
```
## 🛠️ Customization
### Adding a New Language
1. **Update Astro configuration** (`astro.config.mjs`):
```js
i18n: {
defaultLocale: 'zh_CN',
locales: ['zh_CN', 'en_US', 'NEW_LOCALE'],
},
// Update sitemap i18n config
sitemap({
i18n: {
defaultLocale: 'zh_CN',
locales: {
zh_CN: 'zh-CN',
en_US: 'en-US',
NEW_LOCALE: 'new-locale',
},
},
}),
```
2. **Update i18n utilities** (`src/lib/i18n.ts`):
```ts
export const locales = ['zh_CN', 'en_US', 'NEW_LOCALE'] as const;
export const localeConfig: Record<
Locale,
{ label: string; name: string; hrefLang: string }
> = {
NEW_LOCALE: {
label: 'XX',
name: 'Language Name',
hrefLang: 'new-locale',
},
};
```
3. **Create translation file** (`i18n/NEW_LOCALE.json`): Copy `en_US.json` and
translate all content.
4. **Create page routes** (`src/pages/[lang]/`): Copy existing language pages
and update content references.
### Styling
- **Colors & Theme**: Edit `tailwind.config.mjs`
- **Global Styles**: Edit `src/styles/global.css`
- **Dark Mode**: Use Tailwind's `dark:` prefix
- **Custom Icons**: Add to `public/assets/css/custom-icons.css`
### Components
| Component | Purpose | Client Directive |
| ---------------------- | --------------------------------- | ---------------- |
| `HeaderBar.jsx` | Navigation with language switcher | `client:load` |
| `Contact.jsx` | Contact form with EmailJS | `client:load` |
| `ErrorBoundary.jsx` | React error boundary | - |
| `LanguageSwitcher.jsx` | Language selector | `client:load` |
| `PrimaryNav.jsx` | Primary navigation | `client:load` |
| `ThemeToggle.jsx` | Dark/light mode toggle | `client:load` |
| `UnderlineEffects.jsx` | Underline hover effects | `client:idle` |
## 🚀 Deployment
### Environment Variables for Production
Set these environment variables in your hosting platform:
```env
# EmailJS (required for contact form)
PUBLIC_EMAILJS_SERVICE_ID=your_service_id
PUBLIC_EMAILJS_TEMPLATE_ID=your_template_id
PUBLIC_EMAILJS_PUBLIC_KEY=your_public_key
# Google Analytics (optional)
PUBLIC_GA_ID=G-XXXXXXXXXX
```
## 📦 Scripts
| Command | Description |
| ---------------------- | -------------------------------------------------------- |
| `bun run dev` | Start development server (Bun runtime) |
| `bun run dev:node` | Start development server (Node.js runtime) |
| `bun run build` | Build for production (Bun runtime) |
| `bun run build:node` | Build for production (Node.js runtime) |
| `bun run preview` | Preview production build |
| `bun run fetch:rss` | Fetch RSS feeds manually |
| `bun run prebuild` | Pre-build RSS fetching (runs automatically before build) |
| `bun run format` | Format code with Prettier |
| `bun run format:check` | Check code formatting |
| `bun run type-check` | TypeScript type checking |
| `bun run lint` | Astro code linting |
| `bun run clean` | Clean build artifacts |
| `bun run reinstall` | Clean and reinstall dependencies |
## 🏗️ Tech Stack
- **Framework**: [Astro](https://astro.build/) 5.x
- **UI**: [React](https://react.dev/) 19.x
- **Styling**: [Tailwind CSS](https://tailwindcss.com/) 3.x
- **Runtime**: [Bun](https://bun.sh/) 1.x (recommended) or Node.js 18+
- **Email**: [EmailJS](https://www.emailjs.com/)
- **Icons**: [Iconify](https://iconify.design/) (Material Design Icons)
- **Content**: Astro Content Collections with TypeScript validation
- **SEO**: Auto-generated sitemap.xml and robots.txt with i18n support
- **Images**: Astro Image API with responsive optimization
## 📊 Performance
### PageSpeed Insights Results
<p align="center">
<strong>Desktop Performance</strong><br>
<img src="public/assets/img/desktop_pagespeed.png" alt="Desktop PageSpeed Insights" width="600" />
</p>
<p align="center">
<strong>Mobile Performance</strong><br>
<img src="public/assets/img/mobile_pagespeed.png" alt="Mobile PageSpeed Insights" width="600" />
</p>
## 🤝 Contributing
Contributions are welcome! Please read our [Contributing Guide](CONTRIBUTING.md)
before submitting a PR.
1. Fork the repository
2. Create a feature branch (`git checkout -b feature/amazing-feature`)
3. Commit your changes (`git commit -m 'Add amazing feature'`)
4. Push to the branch (`git push origin feature/amazing-feature`)
5. Open a Pull Request
## 📄 License
This project is licensed under the [MIT License](LICENSE).
---
<p align="center">
Made with ❤️ by <a href="https://github.com/Vncntvx">Wenjie Xu</a>
</p>
Explore similar templates
Compare previews and descriptions within the same stack and category.

astrowind
AstroWind is a free, open-source Astro starter theme using Astro and Tailwind CSS, released under the MIT license.
Astro · Blog

astro-theme-cactus
Astro Cactus is an Astro-based blog and portfolio theme that uses Markdown/MDX content collections to manage posts, notes, and tags, with frontmatter type-checked by a schema.
Astro · Portfolio

astrofy
Astrofy is a free and open-source personal portfolio website template built with Astro and TailwindCSS, with built-in blog, CV timeline, project showcase, store, and RSS feed modules.
Astro · Portfolio

astro-nano
Astro Nano is a static, minimalist portfolio and blog template built with Astro, Tailwind, and TypeScript without frontend frameworks. It includes light/dark themes, animated UI, automatic sitemap and RSS feed generation, and Markdown/MDX support with component imports.
Astro · Portfolio

astro-erudite
astro-erudite is an opinionated, unstyled static blog template built with Astro and native CSS, with no UI or CSS framework and minimal dependencies.
Astro · Portfolio

astro-sphere
Astro Sphere is a static, minimalist portfolio and blog theme maintained by markhorn-dev, built mainly with Astro, Tailwind, and TypeScript, with a small amount of SolidJS for stateful components.
Astro · Portfolio
