{"id":30981127,"url":"https://github.com/leonism/astro-batavia","last_synced_at":"2026-05-18T03:31:53.203Z","repository":{"id":301848464,"uuid":"1010471198","full_name":"leonism/astro-batavia","owner":"leonism","description":"Astro Batavia — A modern, elegant Astro starter theme inspired by Jakarta’s vibrant spirit. Combining minimalist design, top-tier performance, and scalable architecture, it empowers you to launch fast, SEO-friendly sites with ease. Built with Astro, Tailwind CSS, and modern best practices.","archived":false,"fork":false,"pushed_at":"2026-05-14T02:18:44.000Z","size":23349,"stargazers_count":2,"open_issues_count":5,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-14T02:34:38.841Z","etag":null,"topics":["astro-theme","astrojs","blog","html-css-javascript","multilingual","seo-optimization","ssg","ssg-astro","ssg-build","ssg-theme","tailwindcss"],"latest_commit_sha":null,"homepage":"https://astro-batavia.pages.dev/","language":"Astro","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/leonism.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG","contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-06-29T06:20:56.000Z","updated_at":"2026-05-13T03:56:45.000Z","dependencies_parsed_at":"2025-07-15T08:17:59.589Z","dependency_job_id":"71635714-37e0-4593-a892-c9bd4e833cf1","html_url":"https://github.com/leonism/astro-batavia","commit_stats":null,"previous_names":["leonism/astro-batavia"],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/leonism/astro-batavia","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/leonism%2Fastro-batavia","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/leonism%2Fastro-batavia/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/leonism%2Fastro-batavia/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/leonism%2Fastro-batavia/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/leonism","download_url":"https://codeload.github.com/leonism/astro-batavia/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/leonism%2Fastro-batavia/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33163712,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-17T22:39:12.733Z","status":"online","status_checked_at":"2026-05-18T02:00:06.436Z","response_time":71,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["astro-theme","astrojs","blog","html-css-javascript","multilingual","seo-optimization","ssg","ssg-astro","ssg-build","ssg-theme","tailwindcss"],"created_at":"2025-09-12T08:09:06.649Z","updated_at":"2026-05-18T03:31:53.195Z","avatar_url":"https://github.com/leonism.png","language":"Astro","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n  \u003ch1\u003e🚀 Astro Batavia\u003c/h1\u003e\n  \u003cp\u003e\u003cstrong\u003eA modern, multilingual blog platform built with Astro.js\u003c/strong\u003e\u003c/p\u003e\n\n[![Astro](https://img.shields.io/badge/Astro-6.2.2.0-FF5D01?style=flat\u0026logo=astro\u0026logoColor=white)](https://astro.build)\n[![TypeScript](https://img.shields.io/badge/TypeScript-5.0+-3178C6?style=flat\u0026logo=typescript\u0026logoColor=white)](https://www.typescriptlang.org/)\n[![Tailwind CSS](https://img.shields.io/badge/Tailwind_CSS-4.2.4-38B2AC?style=flat\u0026logo=tailwind-css\u0026logoColor=white)](https://tailwindcss.com)\n[![License](https://img.shields.io/badge/License-ISC-blue.svg)](LICENSE)\n\n  \u003c!-- Additional new badges below --\u003e\n\n[![Cloudflare Pages](https://img.shields.io/badge/Deployed%20on-Cloudflare_Pages-F38020?style=flat\u0026logo=cloudflare\u0026logoColor=white)](https://pages.cloudflare.com/)\n[![Vercel](https://img.shields.io/badge/Preview-Vercel-000000?style=flat\u0026logo=vercel\u0026logoColor=white)](https://vercel.com/)\n[![Netlify Status](https://api.netlify.com/api/v1/badges/7e052926-bd01-4269-be91-b2a98ccdce35/deploy-status)](https://app.netlify.com/projects/astro-batavia/deploys)\n[![Multilingual](https://img.shields.io/badge/Multilingual-Yes-0A7E07?style=flat)](#)\n[![Dark Mode](https://img.shields.io/badge/Dark_Mode-Enabled-000000?style=flat)](#)\n\n\u003c/div\u003e\n\n## 📋 Table of Contents\n\n- [✨ Features](#-features)\n- [🛠️ Tech Stack](#️-tech-stack)\n- [🏗️ Architecture](#️-architecture)\n- [🚀 Getting Started](#-getting-started)\n  - [Prerequisites](#prerequisites)\n  - [Installation](#installation)\n  - [Development](#development)\n- [🌐 Internationalization](#-internationalization)\n- [📝 Content Management](#-content-management)\n- [🎨 Customization](#-customization)\n- [📦 Build \u0026 Deployment](#-build--deployment)\n- [🔧 Configuration](#-configuration)\n- [📁 Project Structure](#-project-structure)\n- [🤝 Contributing](#-contributing)\n- [📄 License](#-license)\n\n## ✨ Features\n\n### 🌍 **Multilingual Support**\n\n- **3 Languages**: English, Spanish, and Japanese\n- **Smart Routing**: Language-prefixed URLs with fallback handling\n- **Localized Content**: Date formatting, UI translations, and content management\n- **SEO Optimized**: Language-specific meta tags and hreflang attributes\n\n### 📱 **Modern Design**\n\n- **Responsive Layout**: Mobile-first design with Tailwind CSS\n- **Dark Mode**: System preference detection with manual toggle\n- **Performance**: Static site generation with optimized assets\n- **Accessibility**: WCAG compliant with semantic HTML\n\n### 📝 **Content Management**\n\n- **Decap CMS**: Git-based headless CMS for easy content editing\n- **MDX Support**: Rich markdown with React components\n- **Reading Time**: Automatic calculation for better UX\n- **Tag System**: Categorization and filtering capabilities\n- **Draft Support**: Preview unpublished content\n\n### 🔍 **Advanced Search**\n\n- **Realtime Search**: Search results appear as you type keywords\n- **Search Overlay UI**: Search UI under an overlay UI composition\n- **Under 100 millisecond**: Fast, blazingly fast results experience\n- **Accesibility**: Navigate search results using key strokes on desktop\n\n### 📊 **SEO \u0026 Analytics**\n\n- **Advanced SEO**: Open Graph, Twitter Cards, JSON-LD structured data\n- **Sitemap**: Automatic generation with i18n support\n- **Analytics Ready**: Sentry integration for error tracking\n- **Performance**: Lighthouse-optimized with compression\n\n### 🎯 **Developer Experience**\n\n- **TypeScript**: Full type safety across the codebase\n- **Component Architecture**: Modular and reusable components\n- **Hot Reload**: Fast development with Astro's dev server\n- **Advanced Build Optimization**:\n  - **Enterprise-Grade HTML Minification**: Custom integration with `html-minifier-terser` using multi-core processing.\n  - **Asset Compression**: Automatic Gzip and Brotli compression for production builds.\n  - **Granular Control**: Configurable build tools for fine-tuning optimization settings.\n  - **Detailed Build Reports**: Comprehensive reports on file sizes and compression savings.\n\n## 🛠️ Tech Stack\n\n### **Core Framework**\n\n- **[Astro 5.17.0](https://astro.build)** - Static site generator with islands architecture\n- **[TypeScript](https://www.typescriptlang.org/)** - Type-safe JavaScript development\n- **[MDX 4.3.0](https://mdxjs.com/)** - Markdown with JSX components\n\n### **Styling \u0026 UI**\n\n- **[Tailwind CSS 4.1.18](https://tailwindcss.com)** - Utility-first CSS framework\n- **[@tailwindcss/typography](https://tailwindcss.com/docs/typography-plugin)** - Beautiful typographic defaults\n- **Custom Design System** - Consistent color palette and spacing\n\n### **Content \u0026 CMS**\n\n- **[Decap CMS](https://decapcms.org/)** - Git-based content management\n- **[Zod](https://zod.dev/)** - Schema validation for content types\n- **Reading Time Calculation** - Automatic reading time estimation\n\n### **SEO \u0026 Analytics**\n\n- **[@astrojs/sitemap](https://docs.astro.build/en/guides/integrations-guide/sitemap/)** - Automatic sitemap generation\n- **[Sentry](https://sentry.io/)** - Error tracking and performance monitoring\n- **[Spotlight.js](https://spotlightjs.com/)** - Development debugging tools\n\n### **Build \u0026 Optimization**\n\n- **Vite** - Fast build tool and dev server\n- **HTML, CSS, \u0026 JS Minification** - Automatic minification for optimized delivery\n- **Image Optimization** - Automatic image compression and format conversion\n- **Compression** - Gzip and Brotli compression for production builds\n\n## 🏗️ Architecture\n\nAstro Batavia follows a modern, component-based architecture designed for scalability and maintainability:\n\n```\n┌─ 🌐 Multi-language Routing (/en, /es, /ja)\n├─ 📄 Static Site Generation (Astro Islands)\n├─ 🎨 Component Library (Modular \u0026 Reusable)\n├─ 📝 Content Layer (MDX + Decap CMS)\n├─ 🔍 SEO Layer (Structured Data + Meta)\n└─ ⚡ Performance Layer (Compression + Optimization)\n```\n\n### **Key Architectural Decisions**\n\n- **Islands Architecture**: Minimal JavaScript with selective hydration\n- **Content Collections**: Type-safe content management with Zod validation\n- **Internationalization**: Route-based language switching with shared components\n- **Component Composition**: Atomic design principles with reusable UI components\n\n## 🚀 Getting Started\n\n### Prerequisites\n\n- **Node.js** 24.0.0 or higher\n- **npm** 8.0.0 or higher (or **yarn** 1.22.0+)\n- **Git** for version control\n\n### Installation\n\n1. **Clone the repository**\n\n   ```bash\n   git clone https://github.com/leonism/astro-batavia.git\n   cd astro-batavia\n   ```\n\n2. **Install dependencies**\n\n   ```bash\n   npm install\n   ```\n\n3. **Set up environment variables**\n   ```bash\n   cp .env.example .env\n   # Edit .env with your configuration\n   ```\n\n### Development\n\n1. **Start the development server**\n\n   ```bash\n   npm run dev\n   ```\n\n   The site will be available at `http://localhost:5000`\n\n2. **Available Scripts**\n\n   ```bash\n   npm run dev          # Start development server\n   npm run build        # Build for production with compression\n   npm run build:only   # Build without compression\n   npm run compress     # Compress existing build\n   ```\n\n3. **Access the CMS**\n   - Development: `http://localhost:5000/admin`\n   - Production: `https://yourdomain.com/admin`\n\n## 🌐 Internationalization\n\nAstro Batavia supports three languages out of the box with a flexible i18n system:\n\n### **Supported Languages**\n\n- 🇺🇸 **English** (`en`) - Default language\n- 🇪🇸 **Spanish** (`es`)\n- 🇯🇵 **Japanese** (`ja`)\n\n### **URL Structure**\n\n```\n/                    → Redirects to /en/\n/en/                 → English homepage\n/es/                 → Spanish homepage\n/ja/                 → Japanese homepage\n/en/blog/my-post     → English blog post\n/es/blog/mi-post     → Spanish blog post\n```\n\n### **Adding a New Language**\n\n1. **Update language configuration**\n\n   ```typescript\n   // src/i18n/ui.ts\n   export const languages = {\n     en: 'English',\n     es: 'Español',\n     ja: '日本語',\n     fr: 'Français', // Add new language\n   };\n   ```\n\n2. **Add translations**\n\n   ```typescript\n   // src/i18n/ui.ts\n   export const ui = {\n     // ... existing translations\n     fr: {\n       'nav.home': 'Accueil',\n       'nav.blog': 'Blog',\n       // ... add all required translations\n     },\n   } as const;\n   ```\n\n3. **Update Astro configuration**\n   ```javascript\n   // astro.config.mjs\n   i18n: {\n     defaultLocale: \"en\",\n     locales: [\"en\", \"es\", \"ja\", \"fr\"], // Add new locale\n   }\n   ```\n\n## 📝 Content Management\n\n### **Decap CMS Integration**\n\nContent is managed through Decap CMS, providing a user-friendly interface for non-technical users:\n\n- **Git-based**: All content stored in your repository\n- **Real-time Preview**: See changes before publishing\n- **Media Management**: Upload and organize images\n- **Workflow**: Draft → Review → Publish process\n\n### **Content Structure**\n\n```\nsrc/content/blog/\n├── en/           # English posts\n│   ├── post-1.mdx\n│   └── post-2.mdx\n├── es/           # Spanish posts\n│   ├── articulo-1.mdx\n│   └── articulo-2.mdx\n└── ja/           # Japanese posts\n    ├── 記事-1.mdx\n    └── 記事-2.mdx\n```\n\n### **Frontmatter Schema**\n\nEach blog post includes comprehensive metadata:\n\n```yaml\n---\ntitle: 'Your Post Title'\nslug: 'your-post-slug'\nlanguage: 'en'\ncategories: ['Technology', 'Web Development']\ndescription: 'Post description for SEO'\nkeywords: ['astro', 'blog', 'seo']\nauthor:\n  name: 'Author Name'\n  url: 'https://author-website.com'\n  image: '/images/author.jpg'\npublishDate: 2024-01-15\neditDate: 2024-01-16\nheroImage: '/images/hero.jpg'\ntags: ['astro', 'tutorial']\ndraft: false\ncommentStatus: 'open'\nrobots: 'index, follow'\ncanonical: 'https://yourdomain.com/en/blog/your-post-slug'\n---\n```\n\n### **Creating Content**\n\n1. **Via CMS**: Use the admin interface at `/admin`\n2. **Via Files**: Create `.mdx` files in the appropriate language folder\n3. **Via API**: Use the content collections API for programmatic creation\n\n## 🎨 Customization\n\n### **Design System**\n\nThe project uses a custom design system built on Tailwind CSS:\n\n```javascript\n// tailwind.config.mjs\ncolors: {\n  primary: {\n    50: 'hsl(210 100% 98%)',\n    500: 'hsl(210 100% 60%)',\n    600: 'hsl(210 100% 50%)', // Main brand color\n    900: 'hsl(210 100% 20%)',\n  }\n}\n```\n\n### **Component Customization**\n\n- **Header**: Modify `src/components/navigation/Header.astro`\n- **Footer**: Update `src/components/footer/Footer.astro`\n- **Blog Cards**: Customize `src/components/cards/BlogCard.astro`\n- **Layout**: Edit `src/layouts/Layout.astro`\n\n### **Styling Guidelines**\n\n- Use Tailwind utility classes for consistency\n- Follow the established color palette\n- Maintain responsive design principles\n- Ensure dark mode compatibility\n\n## 📦 Build \u0026 Deployment\n\n### **Build Process**\n\n```bash\n# Standard build\nnpm run build\n\n# Build with compression (recommended for production)\nnpm run build        # Includes automatic compression\n\n# Manual compression of existing build\nnpm run compress\n```\n\n### **Build Output**\n\n```\ndist/\n├── en/              # English pages\n├── es/              # Spanish pages\n├── ja/              # Japanese pages\n├── assets/          # Optimized CSS/JS\n├── images/          # Compressed images\n└── *.html.gz        # Gzip compressed files\n└── *.html.br        # Brotli compressed files\n```\n\n### **Deployment Options**\n\n#### **Netlify**\n\n```toml\n# netlify.toml\n[build]\n  command = \"npm run build\"\n  publish = \"dist\"\n\n[[headers]]\n  for = \"*.gz\"\n  [headers.values]\n    Content-Encoding = \"gzip\"\n```\n\n#### **Vercel**\n\n```json\n{\n  \"buildCommand\": \"npm run build\",\n  \"outputDirectory\": \"dist\",\n  \"framework\": \"astro\"\n}\n```\n\n#### **GitHub Pages**\n\n```yaml\n# Simple workflow for deploying static content to GitHub Pages\nname: Deploy static content to Pages\n\non:\n  # Runs on pushes targeting the default branch\n  push:\n    branches: ['main']\n\n  # Allows you to run this workflow manually from the Actions tab\n  workflow_dispatch:\n\n# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages\npermissions:\n  contents: read\n  pages: write\n  id-token: write\n\n# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued.\n# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete.\nconcurrency:\n  group: 'pages'\n  cancel-in-progress: false\n\njobs:\n  # Single deploy job since we're just deploying\n  deploy:\n    environment:\n      name: github-pages\n      url: ${{ steps.deployment.outputs.page_url }}\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v4\n      - name: Setup Pages\n        uses: actions/configure-pages@v5\n      - name: Upload artifact\n        uses: actions/upload-pages-artifact@v3\n        with:\n          # Upload entire repository\n          path: '.'\n      - name: Deploy to GitHub Pages\n        id: deployment\n        uses: actions/deploy-pages@v4\n```\n\n## 🔧 Configuration\n\n### **Global Constants**\n\nThe project utilizes `src/consts.ts` to centralize site-wide configuration. This file populates the majority of configurable variables used across components and layouts:\n\n- **Core Site Data**: `SITE_TITLE`, `SITE_DESCRIPTION`, `SITE_URL`, and `SITE_EMAIL`.\n- **Analytics**: `GTM_ID` (Google Tag Manager) is now managed here.\n- **I18n Defaults**: `DEFAULT_LOCALE` and the `LOCALES` map.\n- **Social Links**: Centralized links for GitHub, X (formerly Twitter), LinkedIn, etc., in the `SOCIAL_LINKS` object.\n- **System Logic**: Pagination limits and default author information.\n\n### **Environment Variables**\n\nCreate a `.env` file in the root directory:\n\n```env\n# Analytics \u0026 Tracking\nALGOLIA_APP_ID=your_algolia_app_id\nALGOLIA_API_KEY=your_algolia_api_key\nGTM_ID=your_google_tag_manager_id\n\n# Comments\nDISQUS_SHORTNAME=your_disqus_shortname\n\n# Error Tracking\nSENTRY_DSN=your_sentry_dsn\n```\n\n### **Site Configuration**\n\n```javascript\n// astro.config.mjs\nexport default defineConfig({\n  site: 'https://www.yourdomain.com', // Update with your domain\n  output: 'static',\n  // ... other configuration\n});\n```\n\n### **CMS Configuration**\n\nUpdate the CMS backend in `public/admin/config.yml`:\n\n```yaml\nbackend:\n  name: git-gateway\n  branch: main # or your default branch\n\n# For GitHub\nbackend:\n  name: github\n  repo: your-username/your-repo\n  branch: main\n```\n\n## 📁 Project Structure\n\n```\nastro-batavia/\n├── 📁 public/                    # Static assets\n│   ├── 📁 admin/                 # Decap CMS configuration\n│   │   ├── config.yml            # CMS settings\n│   │   └── index.html            # CMS entry point\n│   ├── 📁 images/                # Static images\n│   ├── favicon.svg               # Site favicon\n│   ├── robots.txt                # SEO robots file\n│   └── site.webmanifest          # PWA manifest\n├── 📁 src/                       # Source code\n│   ├── 📁 components/            # Reusable components\n│   │   ├── 📁 blog/              # Blog-specific components\n│   │   ├── 📁 cards/             # Card components\n│   │   ├── 📁 common/            # Shared components\n│   │   ├── 📁 footer/            # Footer components\n│   │   ├── 📁 home/              # Homepage components\n│   │   ├── 📁 navigation/        # Navigation components\n│   │   ├── 📁 search/            # Search functionality\n│   │   ├── 📁 sections/          # Page sections\n│   │   └── 📁 ui/                # UI primitives\n│   ├── 📁 content/               # Content collections\n│   │   ├── 📁 blog/              # Blog posts by language\n│   │   │   ├── 📁 en/            # English posts\n│   │   │   ├── 📁 es/            # Spanish posts\n│   │   │   └── 📁 ja/            # Japanese posts\n│   │   └── config.ts             # Content schema definitions\n│   ├── 📁 i18n/                  # Internationalization\n│   │   ├── types.ts              # i18n TypeScript types\n│   │   ├── ui.ts                 # UI translations\n│   │   └── utils.ts              # i18n utility functions\n│   ├── 📁 layouts/               # Page layouts\n│   │   ├── BlogPost.astro        # Blog post layout\n│   │   └── Layout.astro          # Base layout\n│   ├── 📁 client/                # Client-side scripts (global JS/TS)\n│   ├── 📁 pages/                 # Route pages\n│   │   ├── 📁 [lang]/            # Dynamic language routes (including blog)\n│   │   ├── 📁 api/               # API endpoints\n│   │   ├── 📁 blog/              # Legacy blog aliases (kept empty for now)\n│   │   ├── 📁 en/                # English pages\n│   │   ├── 📁 es/                # Spanish pages\n│   │   ├── 📁 ja/                # Japanese pages\n│   │   ├── 404.astro             # 404 error page\n│   │   └── index.astro           # Root redirect\n│   ├── 📁 styles/                # Global styles\n│   │   └── global.css            # CSS custom properties\n│   ├── 📁 utils/                 # Utility functions\n│   │   ├── remark-reading-time.mjs # Reading time plugin\n│   │   ├── search.ts             # Search utilities\n│   │   └── seo.ts                # SEO utilities\n│   └── env.d.ts                  # Environment types\n├── 📁 scripts/                   # Build scripts\n│   └── compress.js               # Asset compression\n├── astro.config.mjs              # Astro configuration\n├── package.json                  # Dependencies \u0026 scripts\n├── tailwind.config.mjs           # Tailwind configuration\n├── tsconfig.json                 # TypeScript configuration\n└── README.md                     # Project documentation\n```\n\n### **Key Directories Explained**\n\n- **`src/components/`**: Modular, reusable UI components following atomic design principles\n- **`src/content/blog/`**: Multilingual blog posts organized by language subdirectories\n- **`src/i18n/`**: Complete internationalization system with translations and utilities\n- **`src/pages/`**: File-based routing with language-specific directories\n- **`public/admin/`**: Decap CMS configuration for content management\n- **`scripts/`**: Build-time optimization and compression scripts\n\n## 🤝 Contributing\n\nWe welcome contributions to Astro Batavia! Here's how you can help:\n\n### **Getting Started**\n\n1. **Fork the repository**\n\n   ```bash\n   git clone https://github.com/leonism/astro-batavia.git\n   cd astro-batavia\n   ```\n\n2. **Create a feature branch**\n\n   ```bash\n   git checkout -b feature/amazing-feature\n   ```\n\n3. **Make your changes**\n   - Follow the existing code style\n   - Add tests if applicable\n   - Update documentation\n\n4. **Test your changes**\n\n   ```bash\n   npm run dev\n   npm run build\n   ```\n\n5. **Commit and push**\n\n   ```bash\n   git commit -m \"Add amazing feature\"\n   git push origin feature/amazing-feature\n   ```\n\n6. **Create a Pull Request**\n\n### **Contribution Guidelines**\n\n#### **Code Style**\n\n- Use TypeScript for type safety\n- Follow existing naming conventions\n- Use Tailwind CSS for styling\n- Maintain component modularity\n- Write descriptive commit messages\n\n#### **Adding New Features**\n\n- **Components**: Place in appropriate `src/components/` subdirectory\n- **Pages**: Follow the existing language structure\n- **Translations**: Add to all supported languages in `src/i18n/ui.ts`\n- **Content**: Use the established frontmatter schema\n\n#### **Bug Reports**\n\nWhen reporting bugs, please include:\n\n- Steps to reproduce\n- Expected vs actual behavior\n- Browser and OS information\n- Screenshots if applicable\n\n#### **Feature Requests**\n\nFor new features, please:\n\n- Check existing issues first\n- Provide detailed use cases\n- Consider backward compatibility\n- Discuss implementation approach\n\n### **Development Workflow**\n\n1. **Local Development**\n\n   ```bash\n   npm run dev          # Start dev server\n   ```\n\n2. **Code Quality**\n\n   ```bash\n   npm run build        # Test production build\n   ```\n\n3. **Testing**\n   - Test all language versions\n   - Verify responsive design\n   - Check accessibility\n   - Validate SEO metadata\n\n## 📄 License\n\nThis project is licensed under the **ISC License** - see the [LICENSE](LICENSE) file for details.\n\n### **ISC License Summary**\n\nThe ISC license is a permissive free software license that allows you to:\n\n✅ **Use** the software for any purpose\n✅ **Modify** the software\n✅ **Distribute** the software\n✅ **Sublicense** the software\n✅ **Sell** copies of the software\n\n**Requirements:**\n\n- Include the original copyright notice\n- Include the license text\n\n**Limitations:**\n\n- No warranty provided\n- No liability assumed\n\n---\n\n\u003cdiv align=\"center\"\u003e\n  \u003ch3\u003e🌟 Star this project if you find it helpful!\u003c/h3\u003e\n  \u003cp\u003e\n    \u003ca href=\"https://github.com/leonism/astro-batavia/stargazers\"\u003e⭐ Stars\u003c/a\u003e •\n    \u003ca href=\"https://github.com/your-leonism/astro-batavia/issues\"\u003e🐛 Issues\u003c/a\u003e •\n    \u003ca href=\"https://github.com/leonism/astro-batavia/pulls\"\u003e🔀 Pull Requests\u003c/a\u003e\n  \u003c/p\u003e\n\n  \u003cp\u003e\u003cstrong\u003eBuilt with ❤️ using Astro.js\u003c/strong\u003e\u003c/p\u003e\n\n  \u003cp\u003e\n    \u003ca href=\"https://astro.build\"\u003e🚀 Astro\u003c/a\u003e •\n    \u003ca href=\"https://tailwindcss.com\"\u003e🎨 Tailwind CSS\u003c/a\u003e •\n    \u003ca href=\"https://decapcms.org\"\u003e📝 Decap CMS\u003c/a\u003e\n  \u003c/p\u003e\n\u003c/div\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fleonism%2Fastro-batavia","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fleonism%2Fastro-batavia","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fleonism%2Fastro-batavia/lists"}