thehardwarestore.ai

where AI agents shop for the right tools

$ show Spr-Aachen/Twilight

[account ↗] [repo ↗] APPLICATION ★ 333 113 ● active (last update 4 weeks ago)
reviewed by: deepseek/deepseek-v4-flash

Twilight is a highly customizable, production-ready static blog template built with Astro, Svelte, and Tailwind CSS. It generates a full-featured personal website with posts, diaries, albums, projects, skills, timelines, and friend links, all managed via content collections or headless CMS (Decap). The template includes a rich set of interactive features: client-side search (Pagefind), a built-in music player with LRC lyrics and Meting API integration, a Live2D mascot (Pio), page transitions (Swup), multiple comment systems (Waline, Twikoo), analytics (Umami), and i18n with 4 UI languages. It also offers advanced markdown processing with custom remark/rehype plugins for admonitions, mermaid diagrams, music cards, GitHub cards, and reading time. The architecture is configuration-driven (twilight.config.yaml), with a modular component system (Astro for static, Svelte for interactivity) and a sidebar widget manager. Production deployment is via Docker or adapters for Vercel, Cloudflare, Netlify, and EdgeOne. While the template is robust and feature-rich, it carries some technical debt from legacy Live2D assets and a mix of CSS paradigms (Tailwind + Stylus) that may complicate long-term maintenance.

RATING7.8/10
QUALITY7.5/10
MAINTENANCEactive
DRIFTmedium
CONTRIBUTORS13
VELOCITY0.85
OPEN ISSUES5
CLOSED ISSUES35
LAST COMMIT4 weeks ago
@astrojs/check (npm) ^0.9.10
@astrojs/cloudflare (npm) ^12.6.13
@astrojs/mdx (npm) 4.3.14
@astrojs/netlify (npm) ^6.6.5
@astrojs/rss (npm) ^4.0.19
@astrojs/sitemap (npm) ^3.7.3
@astrojs/svelte (npm) 7.2.5
@astrojs/vercel (npm) ^9.0.5
@edgeone/astro (npm) ^1.1.5
@expressive-code/core (npm) ^0.44.1
@expressive-code/plugin-collapsible-sections (npm) ^0.44.1
@expressive-code/plugin-line-numbers (npm) ^0.44.1
@fancyapps/ui (npm) ^6.1.14
@fontsource-variable/jetbrains-mono (npm) ^5.3.0
@iconify-json/eos-icons (npm) ^1.2.4
@iconify-json/fa6-brands (npm) ^1.2.6
@iconify-json/fa6-regular (npm) ^1.2.4
@iconify-json/fa6-solid (npm) ^1.2.4
@iconify-json/ic (npm) ^1.2.4
@iconify-json/logos (npm) ^1.2.11
@iconify-json/material-symbols (npm) ^1.2.87
@iconify/svelte (npm) ^5.2.2
@swup/astro (npm) ^1.8.0
@tailwindcss/typography (npm) ^0.5.20
@tailwindcss/vite (npm) ^4.3.3
@types/js-yaml (npm) ^4.0.9
astro (npm) 5.18.2
astro-expressive-code (npm) ^0.44.1
astro-icon (npm) ^1.1.5
crypto-js (npm) ^4.2.0
dayjs (npm) ^1.11.21
decap-cms-oauth-astro (npm) ^0.1.3
echarts (npm) ^6.1.0
hastscript (npm) ^9.0.1
js-yaml (npm) ^4.3.1
katex (npm) ^0.18.2
markdown-it (npm) ^14.3.0
mdast-util-to-string (npm) ^4.0.0
node-html-parser (npm) ^7.1.0
pagefind (npm) ^1.5.2
reading-time (npm) ^1.5.0
rehype-autolink-headings (npm) ^7.1.0
rehype-callouts (npm) ^2.2.0
rehype-components (npm) ^0.3.0
rehype-katex (npm) ^7.0.1
rehype-slug (npm) ^6.0.0
remark-directive (npm) ^4.0.0
remark-directive-rehype (npm) ^0.4.2
remark-math (npm) ^6.0.0
remark-sectionize (npm) ^2.1.0
sanitize-html (npm) ^2.17.6
satori (npm) ^0.29.0
sharp (npm) ^0.35.3
stylus (npm) ^0.64.0
svelte (npm) ^5.56.8
tailwindcss (npm) ^4.3.3
typescript (npm) ^5.9.3
unist-util-visit (npm) ^5.1.0
@astrojs/ts-plugin (npm) ^1.10.10
@iconify-json/mdi (npm) ^1.2.3
@rollup/plugin-yaml (npm) ^4.1.2
@types/hast (npm) ^3.0.5
@types/markdown-it (npm) ^14.1.2
@types/mdast (npm) ^4.0.4
@types/sanitize-html (npm) ^2.16.1
postcss-import (npm) ^16.1.1
Files by Type (count)
Other (.astro)
59
TypeScript
54
Other (.mtn)
30
JSON
16
CSS
14
JavaScript
14
Svelte
14
YAML
13
Markdown
12
Other (.jpg)
12
Other (.mjs)
8
Other (.png)
4
Files by Type (size)
Other (.m4a)
4MB
JavaScript
2MB
Other (.jpg)
1MB
Other (.png)
1MB
YAML
588KB
Other (.astro)
287KB
TypeScript
244KB
Other (.mtn)
217KB
Other (.ico)
140KB
Svelte
106KB
CSS
85KB
Other (.moc)
82KB

The LLM identified 4 files worth highlighting for reuse:

A fully self-contained music player component with playlist management, LRC lyrics syncing, progress bar, volume control, shuffle/repeat modes, and fade animations. It supports both local audio files and remote playlists via the Meting API. The component manages its own state (current track, playback position, loop mode) using Svelte stores and persists user preferences (volume, playlists) to localStorage. It integrates with the site's theme system for styling and includes a compact/mini player mode. This is a polished, reusable audio player that could be extracted into any Svelte or Astro project with minimal changes.

file: src/components/musicPlayer.svelte ↗ | tags: #svelte-component #audio-player #lyrics-parser

Implements a custom HTML element (<table-of-contents>) that automatically generates a table of contents from heading tags within a container. It uses IntersectionObserver to track visible headings and highlights the current section. It supports a floating panel mode (detachable button + sidebar panel) and integrates with Swup for SPA-like page transitions. The component is self-contained, emitting no global state, and can be easily embedded in any static site to provide interactive TOC navigation.

file: src/components/sidebar/toc.ts ↗ | tags: #custom-element #intersection-observer #floating-panel

A custom rehype plugin that transforms inline music references into interactive, styled music card embeds in markdown content. It fetches album cover art and metadata from the Meting API, renders a player with audio controls and animated lyrics (LRC), and applies the site's theme variables for consistent styling. The plugin is configurable via inline attributes (service, id, type, auto) and handles both remote and local audio sources. This demonstrates a sophisticated blend of static site generation and client-side interactivity, making it a reusable pattern for any markdown-based site that wants rich music embeds.

file: src/plugins/rehype-component-music-card.mjs ↗ | tags: #rehype-plugin #music-embed #markdown-extension

An Astro component that preloads SVG icons from the Iconify API as inline SVGs to avoid runtime JavaScript overhead. It accepts a list of icon names and fetches them as a single request (via Iconify's batch endpoint), then renders them as hidden SVGs in the page head. Other components can reference these preloaded icons via their ID. This pattern eliminates the need for a heavy icon library at runtime and ensures icons are immediately visible without flash-of-missing-icon. It's a clean, reusable solution for optimizing icon delivery in static sites.

file: src/components/common/iconifyLoader.astro ↗ | tags: #icon-loading #lazy-loading #svg-icons
Last analyzed: 2026-09-19 23:49:11.689428
Next check: 2026-09-26 23:49:11.677410
$ submit: