AstroBlog

astro-devosfera — Astro Blog Template

By 0xdres

An Astro blog theme deeply customized from AstroPaper, adding gallery lightbox, ⌘K global search, custom fonts, and cursor glow visual and interaction changes.

Explore the design

Compare the page layouts and mobile experience. Open any screenshot for a closer look.

3 previews
Desktop homepage1 / 3
Desktop captureTop of page

Actual screenshot captured by the server browser.

All pages & views 3

Screenshots show visual appearance; interactive behavior may differ.

Recorded 2026-09-30View source

What stands out

A quick read of the recorded project description.

01

Deeply customized from AstroPaper, with reworked homepage, archive, tags, search, and post list pages

02

⌘K / Ctrl+K global search driven by a Pagefind static index, with full keyboard navigation

03

Galleries organized by album directory, with build-time srcset, WebP, and lazy loading; lightbox built on native <dialog>

04

MDX can embed galleries directly with <GalleryEmbed> without manual imports

05

Optional mixed feed that merges gallery entries into the homepage, post pages, archive, tags, and RSS

06

Social links and edit-post address configured via environment variables, with corresponding links automatically hidden when unset

Template Details

astro-devosfera is an Astro blog theme deeply customized from AstroPaper. The author uses it as a personal blog and notes in the README that others can delete all content entries and adjust settings themselves. The theme retains AstroPaper's Markdown type safety, SEO (meta, Open Graph, sitemap, RSS), light/dark mode, and Satori-based dynamic OG images, while reworking the homepage, archive, tags, search, and post list pages.

Functionally, the theme provides a global search modal triggered by ⌘K / Ctrl+K, with the index generated by Pagefind at build time, so local development requires a build before search can be tested. Galleries live in src/data/galleries/<slug>/, images are optimized at build time with srcset, WebP, and lazy loading output, and the lightbox is built on the native <dialog> element, supporting keyboard navigation and edge-aware previous/next controls; MDX posts can embed galleries with <GalleryEmbed> without importing. There is also an optional mixed feed that merges gallery entries into the homepage, post pages, archive, tags, and RSS.

Configuration is centralized in the SITE constant in src/config.ts and in src/constants.ts. Social links and the "edit this post" address are injected via environment variables, and unset variables hide the corresponding links. The theme also includes a terminal-style hero, audio player, glassmorphism navigation and cards, custom fonts (Wotfard, Cascadia Code, Sriracha), plus grid, cursor glow, and noise backgrounds. The README lists several fixes for upstream AstroPaper issues, but provides no performance benchmarks or production-readiness statements.

AstroBlog

Is it right for your project?

Use Cases

  • Building a personal blog written in Markdown/MDX with a terminal-style homepage and custom fonts
  • Organizing photos by album and embedding galleries in posts with lightbox browsing
  • Wanting a site with built-in static search, RSS, sitemap, and dynamic OG images as SEO foundations
  • Starting from AstroPaper while keeping its structure and replacing the visual style and interaction details

Suitable For

  • Developers familiar with Astro and Markdown/MDX content organization
  • Personal site authors who need mixed gallery and post display
  • Users willing to configure via src/config.ts and environment variables themselves

Getting started & customization

Use these recorded setup notes alongside the repository instructions for your chosen version.

  1. 1

    Requires Node.js 20+ and pnpm; after installing dependencies, run pnpm run dev to start the local development server

  2. 2

    The Pagefind search index is generated only at build time; to test search locally, first run pnpm run build, then preview or dev

  3. 3

    Copy .env.example to .env and fill in variables such as social links; unset variables hide the corresponding links

  4. 4

    Posts go in src/data/blog/, galleries go in src/data/galleries/<slug>/, and site configuration is centralized in src/config.ts

  5. 5

    A Docker build method is provided: docker build -t devosfera-blog . then run with mapped ports

Read repository instructions

License & source material

Usage conditions & limitations

Free to use · keep license notice

This listing covers the free version in the public repository under the MIT license; 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 this version's code are permitted.
  • When distributing copies or substantial portions of the code, retain the original author's copyright notice and the full 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

  • The Pagefind search index is generated only in the build output; search cannot be tested directly in the local development environment, and a build must be run before preview or dev.
  • Social links and the edit-post address are injected via environment variables; before use, copy .env.example to .env and fill in your own values, and unset variables hide the corresponding links.
  • Running the project requires Node.js 20 or later and the pnpm package manager.
  • Demo images, fonts, icons, and other third-party assets must be checked against 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 separate charges.
View Original Text Basis

Permission is hereby granted, free of charge

Original License Text

The Pagefind search index is **only available in the production build**.

Original README

Copy `.env.example` → `.env` and fill in your own values before running the project.

Original README

**Requirements:** Node.js 20+ and pnpm.

Original README
https://github.com/0xdres/astro-devosfera/blob/main/LICENSEhttps://github.com/0xdres/astro-devosfera/blob/main/README.md

Compiled by DeepSeek based on repository license and README ·2026-10-01. 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 · 91 / 100
Technologies
Astro
Website type
Blog
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-09-06
Screenshot last checked
2026-10-01

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.

Automatically checked against source and license rules; no manual editorial review.

Inspect the recorded source material

SHA-256: 0edabc5d94d409f08ea20c2b94de0751dbea68025b16b8645ef448887dc6911c

2026-10-01T13:28:56.214Z

Source file / repository
# Devosfera Blog

Heavily customized version of the [AstroPaper](https://github.com/satnaing/astro-paper) theme with a new aesthetic, image galleries, global search modal, and dozens of visual and interactive improvements.

**🌐 Live demo:** [devosfera.vercel.app](https://devosfera.vercel.app)

![Devosfera OG](public/devosfera-og.webp)

> **Note:** This project is primarily my personal blog. If anyone wishes to use it, feel free to delete all entries and edit the settings freely.

> [!IMPORTANT]
> **Social links and personal URLs are no longer hardcoded.**
> They are loaded from environment variables so that forks of this repo do not expose the original author's personal data.
> Copy `.env.example` → `.env` and fill in your own values before running the project. See the [Configuration](#%EF%B8%8F-configuration) section for details.

---

## Table of contents

1. [Features](#-features)
2. [Project structure](#-project-structure)
3. [Installation and local development](#-installation-and-local-development)
4. [Commands](#-commands)
5. [Creating content](#-creating-content)
   - [Posts](#posts-srcdatablog)
   - [Image galleries](#galleries-srcdatagalleries)
6. [GalleryEmbed component](#%EF%B8%8F-galleryembed-component)
7. [Configuration](#%EF%B8%8F-configuration)
8. [Upstream issues resolved](#-upstream-issues-resolved)
9. [License](#-license)

---

## ✨ Features

### Core (inherited from AstroPaper)

- Type-safe Markdown, good performance, accessible and responsive
- Full SEO (meta tags, Open Graph, sitemap, RSS), light/dark mode
- Dynamically generated OG images with Satori

### Modern design

- Hero with animated prompt configurable from `heroTerminalPrompt` in `src/config.ts` (default: `~/ready-to-go $`)
- Global backdrop: grid + cursor glow + noise texture (all pages) optional and configurable from `src/config.ts`
- Glassmorphism on navbar, cards and modals

### Custom typography

| Role          | Font                      |
| :------------ | :------------------------ |
| Body          | `Wotfard` (local)         |
| Code / Mono   | `Cascadia Code` (local)   |
| Italics / H3  | `Sriracha` (Local) |

### Global search (⌘K)

- Modal via `⌘K` / `Ctrl+K` powered by **Pagefind** (static index) and full keyboard navigation (if you want to test it locally, run `pnpm run build` first and after that `pnpm run dev` or `pnpm run preview` since the index is only generated in production)

### Image galleries (`/galleries`)

- Albums in `src/data/galleries/<slug>/`; images optimized at build-time (srcset, WebP, lazy)
- Native lightbox with `<dialog>`, redesigned fullscreen layout, keyboard navigation and edge-aware prev/next controls
- `<GalleryEmbed>` to embed galleries inside MDX posts without importing
- Controlled by `showGalleries` in `src/config.ts` (also gates gallery inclusion in mixed feeds) — see [GALLERIES.md](GALLERIES.md)

### Unified mixed feed (posts + galleries)

- Optional mixed feed controlled by `showGalleriesInIndex` in `src/config.ts` (effective only if `showGalleries` is `true`)
- When both flags are enabled, gallery entries are included in `/`, `/posts`, `/archives`, `/tags`, and `/rss.xml`
- Shared URL/date helpers keep routing and publish-date sorting consistent across all listing pages
- Gallery entries include a visual badge in cards and archive timeline items

### Performance and maintainability improvements

- Parallel collection loading in key routes using `Promise.all`
- Optimized sorting and tag extraction logic for larger content sets
- Stronger shared typing across blog/gallery entries (removed weak `any` usage)
- Reduced duplicated route/slug logic by centralizing entry helpers

### Branded audio player

- Intro audio player in the hero with terminal aesthetic (wave bars, progress bar)
- Fully togglable and configurable from `src/config.ts`

### Redesigned pages

| Page        | Highlights                                          |
| :---------- | :-------------------------------------------------- |
| `/` Home    | Terminal hero, featured grid, section counters, optional mixed feed |
| `/archives` | Vertical timeline with glow, includes gallery entries |
| `/tags`     | Grid with proportional progress bar                 |
| `/search`   | Reactive aurora, restyled Pagefind                  |
| Posts       | Paginated mixed feed (posts + galleries), inline Pagefind search |

---

## 🚀 Project structure

```
/
├── public/
│   ├── audio/             # Audio files (intro, etc.)
│   └── pagefind/          # Search index (generated at build)
├── src/
│   ├── assets/            # Local fonts, SVG icons and logo
│   ├── components/        # Reusable Astro components
│   ├── data/
│   │   ├── blog/          # Posts .md / .mdx
│   │   └── galleries/     # Galleries (one folder per album)
│   ├── layouts/           # Root layout, PostDetails, etc.
│   ├── pages/             # Astro routes
│   ├── styles/            # global.css, typography.css
│   └── utils/             # Filters, OG with Satori, Shiki transformers
└── astro.config.ts
```

---

## 👨🏻‍💻 Installation and local development

**Requirements:** Node.js 20+ and pnpm.

```bash
# 1. Install dependencies
pnpm install

# 2. Development server
pnpm run dev
# → http://localhost:4321
```

The Pagefind search index is **only available in the production build**. To test it locally:

```bash
pnpm run build && pnpm run preview/dev
```

### Docker

```bash
docker build -t devosfera-blog .
docker run -p 4321:80 devosfera-blog
```

---

## 🧞 Commands

| Command            | Action                                                   |
| :----------------- | :------------------------------------------------------- |
| `pnpm install`     | Install dependencies                                     |
| `pnpm run dev`     | Local dev server at `localhost:4321`                     |
| `pnpm run build`   | Production build (`astro check` + build + Pagefind)      |
| `pnpm run preview` | Preview the production build                             |
| `pnpm run format`  | Format with Prettier                                     |
| `pnpm run lint`    | Lint with ESLint                                         |

> `pnpm run build` internally runs `pagefind --site dist && cp -r dist/pagefind public/`. The search index ends up in `public/pagefind/` ready for preview.

---

## 📝 Creating content

### Posts (`src/data/blog/`)

Create a `.md` or `.mdx` file with the following frontmatter:

```yaml
---
title: "Post title"
pubDatetime: 2026-01-15T10:00:00Z   # required — ISO 8601 with timezone
description: "Short description for SEO and cards"
tags: ["astro", "dev"]
featured: false       # highlight on the home page
draft: false          # hidden in production
timezone: "America/Guatemala"  # overrides SITE.timezone
hideEditPost: false
---
```

**MDX**: JSX components can be used directly. `<GalleryEmbed>` is available without importing it (see next section).

**Table of Contents**: add `## Table of contents` to the post body to auto-generate the TOC with `remark-toc` + `remark-collapse`.

**Annotated code blocks** (via Shiki transformers):

```
// [!code highlight]      → highlight the line
// [!code ++]             → added line (diff)
// [!code --]             → removed line (diff)
// fileName: file.ts      → display the filename above the block
```

---

### Galleries (`src/data/galleries/`)

Quick setup:

1. Create a folder in `src/data/galleries/<slug>/`.
2. Add `index.md` (gallery metadata) and image files.
3. Use numeric prefixes (`01-`, `02-`, …) if you want to control image order.
4. The folder slug becomes the route: `/galleries/<slug>`.

For full details (frontmatter fields, cover behavior, alt generation, and image optimization), see [GALLERIES.md](GALLERIES.md).

---

## 🖼️ GalleryEmbed component

Embed a gallery inside any `.mdx` post — **no import needed**:

```mdx
<GalleryEmbed slug="my-trip-to-tokyo" />
```

Optional props: `limit` (`0` = all), `cols` (`2 | 3 | 4`), `showLink` (`true/false`).

For advanced usage, full props reference, lightbox behavior, and invalid slug fallback, see [GALLERIES.md](GALLERIES.md#galleryembed--gallery-inside-mdx-posts).

---

## ⚙️ Configuration

All site configuration lives in `src/config.ts` (the `SITE` constant). It includes general settings (title, description, timezone), feature toggles (galleries, audio player, mixed feed), and content limits (posts per page, gallery embed limit).

Social links and "Share" links are defined in `src/constants.ts`.

> [!WARNING]
> **Breaking change — social links moved to environment variables.**
>
> Previously, social URLs (GitHub, X, LinkedIn, email) and the "Edit this post" URL were hardcoded in `src/constants.ts` and `src/config.ts`. This caused every fork of the repo to expose the original author's personal data publicly, leading to unwanted spam.
>
> **What changed:**
>
> | Variable | What it controls |
> | :--- | :--- |
> | `PUBLIC_SOCIAL_GITHUB` | GitHub profile link & JSON-LD author URL |
> | `PUBLIC_SOCIAL_X` | X / Twitter profile link |
> | `PUBLIC_SOCIAL_LINKEDIN` | LinkedIn profile link |
> | `PUBLIC_SOCIAL_EMAIL` | Contact email (shown as `mailto:` link) |
> | `PUBLIC_EDIT_POST_URL` | "Edit this post" button base URL |
>
> **To restore your socials after forking or updating:**
>
> ```bash
> cp .env.example .env
> # fill in your own values in .env
> ```
>
> For production deployments (Vercel, Netlify, etc.), add these variables in your platform's environment settings.
> Any variable left **unset** simply hides that social link — no errors, no broken UI.

---

## 🐛 Upstream issues resolved

Bugs and feature requests from the official [AstroPaper](https://github.com/satnaing/astro-paper) repository implemented in this version:

| Issue                                                      | Description                                                                                                                                                                                                             | Files                                        | Credits                                                                                                                                                   |
| :--------------------------------------------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [#614](https://github.com/satnaing/astro-paper/issues/614) | **Back to Top shifts the pagination button** when `ShareLinks` is empty                                                                                                                                                 | `BackToTopButton.astro`                      | —                                                                                                                                                         |
| [#574](https://github.com/satnaing/astro-paper/issues/574) | **Markdown tables overflow the layout on mobile** — fixed with `w-full table-auto` and `word-wrap` on cells                                                                                                             | `typography.css`                             | [@GladerJ](https://github.com/GladerJ) — [solution](https://github.com/satnaing/astro-paper/issues/574#issuecomment-3427381261)                           |
| [#569](https://github.com/satnaing/astro-paper/issues/569) | **Back to Top inconsistent on desktop** — unified circular design with progress ring and `fixed` positioning                                                                                                            | `BackToTopButton.astro`, `PostDetails.astro` | —                                                                                                                                                         |
| [#566](https://github.com/satnaing/astro-paper/issues/566) | **Share links don't open in a new tab** — added `target="_blank"` and `rel="noopener noreferrer"`                                                                                                                       | `ShareLinks.astro`                           | [PR #611](https://github.com/satnaing/astro-paper/pull/611) by [@zerone0x](https://github.com/zerone0x)                                                   |
| [#131](https://github.com/satnaing/astro-paper/issues/131) | **No MDX support** — added `@astrojs/mdx` integration with `extendMarkdownConfig: true`                                                                                                                                | `astro.config.ts`, `content.config.ts`       | —                                                                                                                                                         |
| [#495](https://github.com/satnaing/astro-paper/issues/495) | **Inconsistent post filtering by timezone** — fixed using `dayjs` + `utc`/`timezone` plugins; also fixed a bug in the reference solution that used `.millisecond()` instead of `.valueOf()`                            | `postFilter.ts`                              | [@kj-9](https://github.com/kj-9) — [reference fix](https://github.com/satnaing/astro-paper/compare/main...kj-9:astro-paper:fix-post-filter-date)          |
| [#553](https://github.com/satnaing/astro-paper/issues/553) | **No galleries section** — implemented full `/galleries` section with lightbox, `GalleryEmbed`, image optimization and `showGalleries` flag. See [GALLERIES.md](GALLERIES.md)                                           | multiple — see GALLERIES.md                  | —                                                                                                                                                         |

---

## 📜 License

Based on [AstroPaper](https://github.com/satnaing/astro-paper) by [Sat Naing](https://satnaing.dev), licensed under MIT.
Customizations © [0xdres](https://github.com/0xdres).
Report a correction

Explore similar templates

Compare previews and descriptions within the same stack and category.