Zahit is a raw, flat minimalist Astro v6 portfolio & blog theme built on the philosophy that simplicity is depth. Stripping away unnecessary widgets, heavy frameworks, and digital clutter, Zahit closes the gap between the writer and the reader, presenting a clean, content-first canvas optimized for developers, system administrators, and thinkers.
The theme features a cohesive, premium dark design system using a deep space blue background (#00022b), highlighted by vibrant ice-blue accents (#4fa5d8) and optimized ice-blue tinted text (#daeaff) for exceptional high-contrast reading comfort.
π Live Demo: https://astro-zahit.netlify.app
Despite its ultra-minimalist appearance, Zahit is packed with highly refined, modern engineering features:
- Bilingual Routing: Built-in internationalization (i18n) support for Turkish (
tras default) and English (enas secondary). Using Astro's localized routing rules withprefixDefaultLocale: falsemeans Turkish resides at the root/path, and English pages are served under/en/. - Smart Post Redirects: The language switcher in
Header.astrois dynamically mapped. If you are reading a localized blog post and click the language switcher, it looks up the corresponding translated post in the other language using a sharedtranslationKeyfrontmatter value (e.g.,/tr/blog/kodun-estetigi/redirects straight to/en/blog/aesthetics-of-code/). If no translation exists, it gracefully redirects to the target language's/archive/page.
- Year-Based Grouping: Posts on the
archive.astropage are dynamically grouped by their publication year (2026,2025, etc.) on compile time. - Fluid Hover Interactions: Features smooth minimalist transitions where links slide slightly to the right (
translateX) on hover for an interactive, modern look.
- Heading Scanner: The
BlogPost.astrolayout dynamically parsesh2andh3heading elements inside your MDX file. - Active State Tracker: A native, lightweight scroll-event listener tracks the reader's viewport scrolling location, dynamically applying an
.activeclass to the current section inside the sticky Table of Contents sidebar.
- Hover Copy Button: A copy button seamlessly overlays code blocks (
pre) on hover. - Visual Confirmation: Tapping the copy button instantly copies the code block to the user's clipboard and switches icons to an animated confirmation checkmark with a transient highlight, resetting back after 2 seconds.
- Sticky Layout: The profile panel floats as a sticky sidebar on large desktop monitors, keeping author details and social links readily available.
- Mobile-Optimized Layout: Under
860pxscreen widths, the author's avatar is automatically hidden via CSS media queries (@media (max-width: 859px) { .avatar { display: none; } }) to conserve vertical space and eliminate mobile distractions.
- Path Detection: The universal
404.astropage extracts the current language context from the URL path. It then renders localized error messages and provides contextual Turkish or English buttons directing users back to/homeor/archive.
- Astro v6.3+ β Modern, component-based static site generator with zero client-side JS by default.
- MDX Integration β Markdown extension that allows importing interactive components and structures inside posts.
- Astro-Icon β Highly optimized SVG icon wrapper supporting Iconify icon packs.
- Pure CSS Design System β Built purely on top of local CSS variables (
global.css) without bloated utility frameworks.
Zahit/
βββ public/ # Static assets (favicons, profile graphics)
β βββ favicon.svg # The vector logo used across the site
β βββ profile.jpeg # Desktop sidebar avatar picture
βββ src/
β βββ components/ # Reusable Astro UI components
β β βββ BaseHead.astro # Site meta tags, SEO setup, and font loaders
β β βββ Footer.astro # Minimal footer links
β β βββ Header.astro # Header layout, logo, and smart i18n switcher
β β βββ Profile.astro # Author info and social link matrix
β βββ layouts/ # Page shell layouts
β β βββ BaseLayout.astro # Core HTML viewport shell
β β βββ BlogPost.astro # Blog layout with ToC, ScrollSpy, and Clipboard Copy
β βββ i18n/ # Translation configuration
β β βββ ui.ts # Localized translation dictionary keys
β β βββ utils.ts # Translation route parsers and slug resolvers
β βββ pages/ # Page routes (File-based Routing)
β β βββ [lang]/ # Localized routes (Home, Archive)
β β β βββ blog/
β β β β βββ [...slug].astro # Dynamic blog posts resolver
β β β βββ archive.astro
β β β βββ index.astro
β β βββ en/
β β β βββ about.astro # English "About Me" page
β β βββ tr/
β β β βββ about.astro # Turkish "HakkΔ±mda" page
β β βββ 404.astro # Universal i18n-aware 404 page
β β βββ index.astro # Root entry route (Redirects to /tr/)
β βββ styles/ # Styling architecture
β β βββ global.css # Color scheme tokens, resets, & typography
β βββ content/ # Content directories
β β βββ blog/
β β βββ en/ # English posts (.mdx / .md)
β β βββ tr/ # Turkish posts (.mdx / .md)
β βββ content.config.ts # Astro collections schema schema definitions
β βββ config.ts # Core site variables, bio, and social listings
βββ astro.config.mjs # Astro configuration with MDX and i18n routing
βββ package.json # Project dependencies and operational scripts
βββ tsconfig.json # TypeScript definitions
Run Zahit locally in just a few steps. Make sure you have Node.js >= 22.12.0 installed on your system.
1. Clone the repository:
git clone https://github.com/kuscadev/Zahit.git
cd Zahit2. Install dependencies:
npm install3. Run the local development server:
npm run devOpen http://localhost:4321 in your browser to preview your site.
4. Build for production:
npm run buildThe optimized static build outputs to the ./dist/ directory, ready to be deployed to Netlify, Vercel, or GitHub Pages.
5. Preview your build locally:
npm run previewMake Zahit your own by customizing these key configuration scopes:
Personalize the site metadata, biography, avatar, and social links in src/config.ts:
export const SITE_CONFIG = {
title: 'Zahit',
description: 'A raw, flat minimalist theme built on the philosophy that simplicity is depth.',
url: 'https://zahit.dev',
};
export const AUTHOR = {
name: 'OΔuzhan KuΕca',
role: {
tr: 'YBS | Python | Linux',
en: 'MIS | Python | Linux',
},
bio: {
tr: 'Teknik detaylarΔ± iΕ sΓΌreΓ§leriyle buluΕturan bir YBS ΓΆΔrencisiyim...',
en: 'MIS student bridging the gap between technical details...',
},
avatar: '/profile.jpeg', // Place your avatar in the /public folder
};
export const SOCIALS = [
{ label: 'Mail', href: 'mailto:kuscadev@outlook.com', icon: 'mdi:email' },
{ label: 'GitHub', href: 'https://github.com/kuscadev', icon: 'mdi:github' },
// Add additional channels by mimicking this schema
];Note: Icons are imported via the Iconify Material Design Icons (MDI) set.
To leverage Zahit's bilingual matching feature, place the post files in the respective locale directories and bind them together with a matching translationKey:
-
Add your files under the content directory:
- Turkish draft:
src/content/blog/tr/sadelik.mdx - English draft:
src/content/blog/en/simplicity.mdx
- Turkish draft:
-
Specify matching
translationKeyparameters in both frontmatters: Provide the exact same key in both files so the smart language switcher in the header knows they are translated versions of each other.
---
title: 'Sadelik, Eksiklik DeΔil Derinliktir'
description: 'Minimalizmin anlamΔ± ve Zahit temasΔ±nΔ±n temel felsefesi.'
pubDate: '2026-05-16'
tags: ['minimalizm', 'tasarim', 'felsefe']
translationKey: 'simplicity-post' # MUST match the English post key exactly
---
TΓΌrkΓ§e iΓ§eriΔinizi buraya yazΔ±n...---
title: 'Simplicity is Depth, Not Lack'
description: 'Discover the meaning of minimalism, the core philosophy of the Zahit theme.'
pubDate: '2026-05-16'
tags: ['minimalism', 'design', 'philosophy']
translationKey: 'simplicity-post' # MUST match the Turkish post key exactly
---
Write your English content here...Zahit is entirely customized using CSS variables. Change the theme colors, typography, or grid width in src/styles/global.css:
:root {
/* Color Palette Variables */
--bg-color: #00022b; /* Deep Space Blue Background */
--dark: #010e54; /* Section dark accenting blocks */
--accent: #0855b1; /* Primary accent color (Links, borders) */
--light: #4fa5d8; /* Brighter accent blue for hovering states */
--text-color: #daeaff; /* Soft ice-blue text tint for superior reading readability */
/* Typography Variables */
--font-family-body: 'Source Sans 3', sans-serif;
--font-family-heading: 'Source Sans 3', sans-serif;
/* Global Widths */
--site-width: 80%; /* Global responsive container width */
--content-padding: 2rem;
/* Transition timings */
--transition-speed: 0.2s;
}Customize translation dictionary labels or add extra languages in src/i18n/ui.ts:
export const languages = {
tr: 'TΓΌrkΓ§e',
en: 'English',
};
export const defaultLang = 'tr';
export const ui = {
tr: {
'nav.home': 'Ana Sayfa',
'nav.about': 'HakkΔ±nda',
'nav.archive': 'ArΕiv',
'toc.title': 'Δ°Γ§indekiler',
// ...other TR definitions
},
en: {
'nav.home': 'Home',
'nav.about': 'About',
'nav.archive': 'Archive',
'toc.title': 'Contents',
// ...other EN definitions
},
} as const;This project is open-source and licensed under the MIT License.
Minimal. Practical. Worth Sharing.
Developed with passion by kuscadev
