aboutsummaryrefslogtreecommitdiffstats
path: root/README.md
diff options
context:
space:
mode:
authoraman333nolawz <amananudhiu@gmail.com>2026-03-02 21:49:13 +0530
committeraman333nolawz <amananudhiu@gmail.com>2026-03-02 21:49:13 +0530
commitd41eff9eccf66644c4c60f53cb516bf079937a28 (patch)
tree248a0863a3181369f943d678ec4273911d35efac /README.md
Using astro-erudite for static site generation
Diffstat (limited to 'README.md')
-rw-r--r--README.md295
1 files changed, 295 insertions, 0 deletions
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..51d4a4c
--- /dev/null
+++ b/README.md
@@ -0,0 +1,295 @@
+![Showcase Card](/public/static/twitter-card.png)
+
+<div align="center">
+
+## astro-erudite
+
+![Stargazers]
+[![License]](LICENSE)
+
+</div>
+
+astro-erudite is an opinionated, unstyled static blogging template built with [Astro](https://astro.build/), [Tailwind](https://tailwindcss.com/), and [shadcn/ui](https://ui.shadcn.com/). Extraordinarily loosely based off the [Astro Micro](https://astro-micro.vercel.app/) theme by [trevortylerlee](https://github.com/trevortylerlee).
+
+| ![Preview 1](/public/static/preview-1.png) | ![Preview 2](/public/static/preview-2.png) |
+| ------------------------------------------ | ------------------------------------------ |
+| ![Preview 3](/public/static/preview-3.png) | ![Preview 4](/public/static/preview-4.png) |
+
+> [!NOTE]
+> To learn more about why this template exists, read [The State of Static Blogs in 2024](https://astro-erudite.vercel.app/blog/the-state-of-static-blogs), where I share my take on what constitutes a great blogging template and my goals while developing this one.
+
+---
+
+## Community examples
+
+Below are some fantastic examples of websites based on this template. If you wish to add your site to this list, open a [pull request](https://github.com/jktrn/astro-erudite/pulls)!
+
+| Site | Author | Tags | Source |
+|-|-|-|-|
+| [enscribe.dev](https://enscribe.dev) | [@jktrn](https://github.com/jktrn) | portfolio, interactive | [→](https://github.com/jktrn/enscribe.dev) |
+| [emile.sh](https://emile.sh) | [@echoghi](https://github.com/echoghi) | minimal, flexoki | [→](https://github.com/echoghi/v5) |
+| [decentparadox.me](https://decentparadox.me) | [@decentparadox](https://github.com/decentparadox) | portfolio, sci-fi | [→](https://github.com/decentparadox/decentparadox.me) |
+| [flocto.github.io](https://flocto.github.io/) | [@flocto](https://github.com/flocto) | blog | [→](https://github.com/flocto/flocto.github.io) |
+| [dumbprism.me](https://www.dumbprism.me/) | [@dumbprism](https://github.com/dumbprism) | portfolio, bento | [→](https://github.com/dumbprism/dumbprism-portfolio) |
+| [hyuki.dev](https://hyuki.dev/) | [@snow0406](https://github.com/snow0406) | minimal, blog | [→](https://github.com/Snow0406/hyuki.dev) |
+| [ldd.cc](https://ldd.cc/) | [@xJoyLu](https://github.com/xjoylu) | blog | [→](https://ldd.cc/) |
+| [rezarezvan.com](https://rezarezvan.com/) | [@rezaarezvan](https://github.com/rezaarezvan) | academic, blog | [→](https://rezarezvan.com/) |
+| [blog.z0x.ca](https://blog.z0x.ca/) | [@z0x](https://z0x.ca) | minimal | [→](https://git.z0x.ca/z0x/blog.z0x.ca/) |
+| [angelaytchan.net](https://angelaytchan.net/) | [@wispyplant](https://github.com/wispyplant) | portfolio, art | [→](https://github.com/wispyplant/wispyplant.github.io) |
+| [kaezr.xyz](https://kaezr.xyz/) | [@kaezrr](https://github.com/kaezrr) | minimal, portfolio | [→](https://github.com/kaezrr/webfolio) |
+| [worldwidewong](https://worldwidewong.vercel.app) | [@brendanwong-web](https://github.com/brendanwong-web) | portfolio, gallery | [→](https://github.com/brendanwong-web/worldwidewong) |
+| [bgajjala.dev](https://bgajjala.dev) | [@bgajjala8](https://github.com/bgajjala8) | minimal, blog | [→](https://github.com/bgajjala8/bgajjala.dev) |
+| [ankitz007.vercel.app](https://ankitz007.vercel.app) | [@ankitz007](https://github.com/ankitz007) | blog | [→](https://github.com/ankitz007/webfolio) |
+| [sadman.ca](https://sadman.ca) | [@sadmanca](https://github.com/sadmanca) | blog, media | [→](https://github.com/sadmanca/blogv3) |
+| [marcel-to.vercel.app](https://marcel-to.vercel.app) | [@Marcel-TO](https://github.com/Marcel-TO) | portfolio, docs | [→](https://github.com/Marcel-TO/marcel-to-website) |
+| [merox.dev](https://merox.dev) | [@meroxdotdev](https://github.com/meroxdotdev) | blog, devops, homelab | [→](https://github.com/meroxdotdev/merox) |
+| [Off by One](https://justoffbyone.com) | [@cduruk](https://github.com/cduruk) | engineering, blog | [→](https://github.com/cduruk/offbyone) |
+| [holywater.dev](https://holywater.dev) | [@holywater2372](https://github.com/holywater2372) | cybersecurity, blog | [→](https://github.com/holywater2372/holywater.dev) |
+| [theinfinull.com](https://theinfinull.com) | [@theinfinull](https://github.com/theinfinull) | dev, portfolio, blog | [→](https://github.com/theinfinull/portfolio) |
+## Features
+
+- [Astro](https://astro.build/)'s [Islands](https://docs.astro.build/en/concepts/islands/) architecture for selective hydration and client-side interactivity while maintaining fast static site rendering.
+- [shadcn/ui](https://ui.shadcn.com/) with [Tailwind](https://tailwindcss.com/) color conventions for automatic light and dark theme styling. Features accessible, theme-aware UI components for navigation, buttons, and more.
+- [Expressive Code](https://expressive-code.com/) for enhanced code block styling, syntax highlighting, and code block titles.
+- Blog authoring with [MDX](https://mdxjs.com/) for component-rich content and $\LaTeX$ math rendering via [KaTeX](https://katex.org/).
+- Astro [View Transitions](https://docs.astro.build/en/guides/view-transitions/) in <abbr title="Single Page Application">SPA</abbr> mode for smooth route animations.
+- SEO optimization with granular metadata and [Open Graph](https://ogp.me/) tag control for each post.
+- [RSS](https://en.wikipedia.org/wiki/RSS) feed and sitemap generation.
+- Subpost support for breaking long content into digestible parts and organizing related series.
+- Author profiles with a dedicated authors page and multi-author post support.
+- Project tags with a dedicated tags page for post categorization and discovery.
+- Custom Callout component variants for enhanced technical writing.
+
+### Technology stack
+
+This is a list of the various technologies used to build this template:
+
+| Category | Technology Name |
+| ---------- | ------------------------------------------------------------------------------------------ |
+| Framework | [Astro](https://astro.build/) |
+| Styling | [Tailwind](https://tailwindcss.com) |
+| Components | [shadcn/ui](https://ui.shadcn.com/) |
+| Content | [MDX](https://mdxjs.com/) |
+| Codeblocks | [Expressive Code](https://expressive-code.com/), [Shiki](https://github.com/shikijs/shiki) |
+| Graphics | [Figma](https://www.figma.com/) |
+| Deployment | [Vercel](https://vercel.com) |
+
+## Getting started
+
+1. Hit &ldquo;Use this template&rdquo;, the big green button on the top right, to create a new repository in your own GitHub account with this template.
+
+2. Clone the repository:
+
+ ```bash
+ git clone https://github.com/[YOUR_USERNAME]/[YOUR_REPO_NAME].git
+ cd [YOUR_REPO_NAME]
+ ```
+
+3. Install dependencies:
+
+ ```bash
+ npm install
+ ```
+
+4. Start the development server:
+
+ ```bash
+ npm run dev
+ ```
+
+5. Open your browser and visit `http://localhost:1234` to get started. The following commands are also available:
+
+ | Command | Description |
+ | ------------------ | --------------------------------------------------------------- |
+ | `npm run start` | Alias for `npm run dev` |
+ | `npm run build` | Run type checking and build the project |
+ | `npm run preview` | Previews the built project |
+ | `npm run astro` | Run Astro CLI commands |
+ | `npm run prettier` | Blanket format all files using [Prettier](https://prettier.io/) |
+
+### Site configuration
+
+Edit the `src/consts.ts` file to update your site's metadata, navigation links, and social links:
+
+```ts
+export const SITE: Site = {
+ title: 'astro-erudite',
+ description: // ...
+ href: 'https://astro-erudite.vercel.app',
+ featuredPostCount: 2,
+ postsPerPage: 3,
+}
+
+export const NAV_LINKS: SocialLink[] = [
+ {
+ href: '/blog',
+ label: 'blog',
+ },
+ // ...
+]
+
+export const SOCIAL_LINKS: SocialLink[] = [
+ {
+ href: 'https://github.com/jktrn',
+ label: 'GitHub',
+ },
+ // ...
+]
+```
+
+### Color palette
+
+Colors are defined in `src/styles/global.css` in [OKLCH format](https://developer.mozilla.org/en-US/docs/Web/CSS/color_value/oklch), using the [shadcn/ui](https://ui.shadcn.com/) convention:
+
+```css
+:root {
+ --background: oklch(1 0 0);
+ --foreground: oklch(0.145 0 0);
+ --primary: oklch(0.205 0 0);
+ --primary-foreground: oklch(0.985 0 0);
+ --secondary: oklch(0.97 0 0);
+ --secondary-foreground: oklch(0.205 0 0);
+ --muted: oklch(0.97 0 0);
+ --muted-foreground: oklch(0.556 0 0);
+ --accent: oklch(0.97 0 0);
+ --accent-foreground: oklch(0.205 0 0);
+ --destructive: oklch(0.577 0.245 27.325);
+ --border: oklch(0.922 0 0);
+ --ring: oklch(0.708 0 0);
+}
+
+[data-theme='dark'] {
+ /* ... */
+}
+```
+
+### Favicons
+
+Favicons are generated using [RealFaviconGenerator](https://realfavicongenerator.net/). To adjust the favicons, replace the files in the `public/` directory (such as `favicon.ico`, `favicon.svg`, `apple-touch-icon.png`, etc.) with your own. After updating the favicon files, you'll also need to adjust the references in `src/components/Favicons.astro` to match your new favicon filenames and paths:
+
+```html
+<!-- Replace these with the generated meta tags -->
+<link rel="icon" type="image/png" href="/favicon-96x96.png" sizes="96x96" />
+<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
+<link rel="shortcut icon" href="/favicon.ico" />
+<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png" />
+<meta name="apple-mobile-web-app-title" content="astro-erudite" />
+<link rel="manifest" href="/site.webmanifest" />
+```
+
+## Adding content
+
+### Blog posts
+
+Add new blog posts as MDX files in the `src/content/blog/` directory. Use the following frontmatter structure:
+
+```yml
+---
+title: 'Your Post Title'
+description: 'A brief description of your post!'
+date: 2024-01-01
+tags: ['tag1', 'tag2']
+image: './image.png'
+authors: ['author1', 'author2']
+draft: false
+---
+```
+
+The blog post schema is defined as follows:
+
+| Field | Type (Zod) | Requirements | Required |
+| ------------- | --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- |
+| `title` | `string` | Should be ≤60 characters. | Yes |
+| `description` | `string` | Should be ≤155 characters. | Yes |
+| `date` | `coerce.date()` | Must be in `YYYY-MM-DD` format. | Yes |
+| `order` | `number` | Sort order for subposts with the same `date`. Defaults to `0` if not provided. | Optional |
+| `image` | `image()` | Should be exactly 1200px &times; 630px. | Optional |
+| `tags` | `string[]` | Preferably use kebab-case for these. | Optional |
+| `authors` | `string[]` | If the author has a profile, use the id associated with their Markdown file in `src/content/authors/` (e.g. if their file is named `jane-doe.md`, use `jane-doe` in the array). | Optional |
+| `draft` | `boolean` | Defaults to `false` if not provided. | Optional |
+
+### Authors
+
+Add author information in `src/content/authors/` as Markdown files. A file named `[author-name].md` can be associated with a blog post if `"author-name"` (the id) is added to the `authors` field:
+
+```yml
+---
+name: 'enscribe'
+pronouns: 'he/him'
+avatar: 'https://gravatar.com/avatar/9bfdc4ec972793cf05cb91efce5f4aaaec2a0da1bf4ec34dad0913f1d845faf6.webp?size=256'
+bio: 'd(-_-)b'
+website: 'https://enscribe.dev'
+twitter: 'https://twitter.com/enscry'
+github: 'https://github.com/jktrn'
+mail: 'jason@enscribe.dev'
+---
+```
+
+The author schema is defined as follows:
+
+| Field | Type (Zod) | Requirements | Required |
+| ---------- | ------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------- |
+| `name` | `string` | n/a | Yes |
+| `pronouns` | `string` | n/a | Optional |
+| `avatar` | `string.url()` or `string.startsWith('/')` | Should be either a valid URL or a path starting with `/`. Preferably use [Gravatar](https://en.gravatar.com/site/implement/images/) with the `?size=256` size parameter. | Yes |
+| `bio` | `string` | n/a | Optional |
+| `mail` | `string.email()` | Must be a valid email address. | Optional |
+| `website` | `string.url()` | Must be a valid URL. | Optional |
+| `twitter` | `string.url()` | Must be a valid URL. | Optional |
+| `github` | `string.url()` | Must be a valid URL. | Optional |
+| `linkedin` | `string.url()` | Must be a valid URL. | Optional |
+| `discord` | `string.url()` | Must be a valid URL. | Optional |
+
+> [!TIP]
+> You can add as many social media links as you want, as long as you adjust the schema! Make sure you also support the new field in the `src/components/SocialIcons.astro` component.
+
+### Projects
+
+Add projects in `src/content/projects/` as Markdown files:
+
+```yml
+---
+name: 'Project A'
+description: 'This is an example project description! You should replace this with a description of your own project.'
+tags: ['Framework A', 'Library B', 'Tool C', 'Resource D']
+image: '/static/1200x630.png'
+link: 'https://example.com'
+startDate: '2024-01-01'
+endDate: '2024-01-01'
+---
+```
+
+The project schema is defined as follows:
+
+| Field | Type (Zod) | Requirements | Required |
+| ------------- | --------------- | --------------------------------------- | -------- |
+| `name` | `string` | n/a | Yes |
+| `description` | `string` | n/a | Yes |
+| `tags` | `string[]` | n/a | Yes |
+| `image` | `image()` | Should be exactly 1200px &times; 630px. | Yes |
+| `link` | `string.url()` | Must be a valid URL. | Yes |
+| `startDate` | `coerce.date()` | Must be in `YYYY-MM-DD` format. | Optional |
+| `endDate` | `coerce.date()` | Must be in `YYYY-MM-DD` format. | Optional |
+
+## License
+
+This project is open source and available under the [MIT License](LICENSE).
+
+---
+
+### Star history
+
+<a href="https://star-history.com/#jktrn/astro-erudite&Date">
+ <picture>
+ <source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=jktrn/astro-erudite&type=Date&theme=dark" />
+ <source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/svg?repos=jktrn/astro-erudite&type=Date" />
+ <img alt="Star History Chart" src="https://api.star-history.com/svg?repos=jktrn/astro-erudite&type=Date" />
+ </picture>
+</a>
+
+---
+
+Built with &hearts; by [enscribe](https://enscribe.dev)!
+
+[Stargazers]: https://img.shields.io/github/stars/jktrn/astro-erudite?color=fafafa&logo=github&logoColor=fff&style=for-the-badge
+[License]: https://img.shields.io/github/license/jktrn/astro-erudite?color=0a0a0a&logo=github&logoColor=fff&style=for-the-badge