{"id":30690500,"url":"https://github.com/savecoders/cybervitae","last_synced_at":"2025-09-02T02:42:26.147Z","repository":{"id":286370353,"uuid":"960088336","full_name":"Savecoders/CyberVitae","owner":"Savecoders","description":null,"archived":false,"fork":false,"pushed_at":"2025-07-07T02:32:15.000Z","size":3260,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-07-07T03:36:46.298Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://cyber-vitae.vercel.app","language":"Astro","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Savecoders.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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}},"created_at":"2025-04-03T20:54:20.000Z","updated_at":"2025-07-07T02:37:06.000Z","dependencies_parsed_at":null,"dependency_job_id":"24449aae-4945-492e-a5b2-02bedec84c59","html_url":"https://github.com/Savecoders/CyberVitae","commit_stats":null,"previous_names":["savecoders/cyber-astro-blog"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/Savecoders/CyberVitae","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Savecoders%2FCyberVitae","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Savecoders%2FCyberVitae/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Savecoders%2FCyberVitae/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Savecoders%2FCyberVitae/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Savecoders","download_url":"https://codeload.github.com/Savecoders/CyberVitae/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Savecoders%2FCyberVitae/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":273222545,"owners_count":25066785,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-09-02T02:00:09.530Z","response_time":77,"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":[],"created_at":"2025-09-02T02:42:21.629Z","updated_at":"2025-09-02T02:42:26.136Z","avatar_url":"https://github.com/Savecoders.png","language":"Astro","funding_links":[],"categories":[],"sub_categories":[],"readme":"![Showcase Card](/public/static/twitter-card.png)\n\n\u003cdiv align=\"center\"\u003e\n\n## astro-erudite\n\n![Stargazers]\n[![License]](LICENSE)\n\n\u003c/div\u003e\n\nastro-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).\n\n| ![Preview 1](/public/static/preview-1.png) | ![Preview 2](/public/static/preview-2.png) |\n| ------------------------------------------ | ------------------------------------------ |\n| ![Preview 3](/public/static/preview-3.png) | ![Preview 4](/public/static/preview-4.png) |\n\n\u003e [!NOTE]\n\u003e 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.\n\n---\n\n## Community Examples\n\nBelow are some fantastic examples of websites based on this template. If you wish to add your site to this list, open a pull request!\n\n| Site                                          | Author                                             | Description/Features                                                                         | Source                                                 |\n| --------------------------------------------- | -------------------------------------------------- | -------------------------------------------------------------------------------------------- | ------------------------------------------------------ |\n| [enscribe.dev](https://enscribe.dev)          | [@jktrn](https://github.com/jktrn)                 | Heavily modified bento-style homepage with client interactivity, with custom MDX components! | [→](https://github.com/jktrn/enscribe.dev)             |\n| [emile.sh](https://emile.sh)                  | [@echoghi](https://github.com/echoghi)             | A minimalist personal blog using the [flexoki](https://stephango.com/flexoki) theme          | [→](https://github.com/echoghi/v5)                     |\n| [decentparadox.me](https://decentparadox.me)  | [@decentparadox](https://github.com/decentparadox) | A heavily customized personal portfolio with a sci-fi theme!                                 | [→](https://github.com/decentparadox/decentparadox.me) |\n| [flocto.github.io](https://flocto.github.io/) | [@flocto](https://github.com/flocto)               | A slightly modified personal blog                                                            | [→](https://github.com/flocto/flocto.github.io)        |\n| [dumbprism.me](https://www.dumbprism.me/)     | [@dumbprism](https://github.com/dumbprism)         | A customized portfolio inspired by enscribe's bento grid style adding my gist of UI          | [→](https://github.com/dumbprism/dumbprism-portfolio)  |\n| [hyuki.dev](https://hyuki.dev/)               | [@snow0406](https://github.com/snow0406)           | A minimalist blog with a blue color scheme, focusing on simplicity!                          | [→](https://github.com/Snow0406/hyuki.dev)             |\n| [ldd.cc](https://ldd.cc/)                     | [@xJoyLu](https://github.com/xjoylu)               | The cream of the idlers.                                                                     | [→](https://ldd.cc/)                                   |\n| [rezarezvan.com](https://rezarezvan.com/)     | [@rezaarezvan](https://github.com/rezaarezvan)     | A academic blog with personal touches :).                                                    | [→](https://rezarezvan.com/)                           |\n| [blog.z0x.ca](https://blog.z0x.ca/)           | [@z0x](https://z0x.ca)                             | _Very_ minimal version of erudite, stripping it down to the bare essentials                  | [→](https://git.z0x.ca/z0x/blog.z0x.ca/)               |\n| [angelaytchan.net](https://angelaytchan.net/)           | [@wispyplant](https://github.com/wispyplant)          | An artist portfolio and activities archive      | [→](https://github.com/wispyplant/wispyplant.github.io)               |\n\n## Features\n\n- [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.\n- [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.\n- [Expressive Code](https://expressive-code.com/) for enhanced code block styling, syntax highlighting, and code block titles.\n- Blog authoring with [MDX](https://mdxjs.com/) for component-rich content and $\\LaTeX$ math rendering via [KaTeX](https://katex.org/).\n- Astro [View Transitions](https://docs.astro.build/en/guides/view-transitions/) in \u003cabbr title=\"Single Page Application\"\u003eSPA\u003c/abbr\u003e mode for smooth route animations.\n- SEO optimization with granular metadata and [Open Graph](https://ogp.me/) tag control for each post.\n- [RSS](https://en.wikipedia.org/wiki/RSS) feed and sitemap generation.\n- Subpost support for breaking long content into digestible parts and organizing related series.\n- Author profiles with a dedicated authors page and multi-author post support.\n- Project tags with a dedicated tags page for post categorization and discovery.\n- Custom Callout component variants for enhanced technical writing.\n\n## Technology Stack\n\nThis is a list of the various technologies used to build this template:\n\n| Category   | Technology Name                                                                            |\n| ---------- | ------------------------------------------------------------------------------------------ |\n| Framework  | [Astro](https://astro.build/)                                                              |\n| Styling    | [Tailwind](https://tailwindcss.com)                                                        |\n| Components | [shadcn/ui](https://ui.shadcn.com/)                                                        |\n| Content    | [MDX](https://mdxjs.com/)                                                                  |\n| Codeblocks | [Expressive Code](https://expressive-code.com/), [Shiki](https://github.com/shikijs/shiki) |\n| Graphics   | [Figma](https://www.figma.com/)                                                            |\n| Deployment | [Vercel](https://vercel.com)                                                               |\n\n## Getting Started\n\n1. Hit \u0026ldquo;Use this template\u0026rdquo;, the big green button on the top right, to create a new repository in your own GitHub account with this template.\n\n2. Clone the repository:\n\n   ```bash\n   git clone https://github.com/[YOUR_USERNAME]/[YOUR_REPO_NAME].git\n   cd [YOUR_REPO_NAME]\n   ```\n\n3. Install dependencies:\n\n   ```bash\n   npm install\n   ```\n\n4. Start the development server:\n\n   ```bash\n   npm run dev\n   ```\n\n5. Open your browser and visit `http://localhost:1234` to get started. The following commands are also available:\n\n   | Command            | Description                                                     |\n   | ------------------ | --------------------------------------------------------------- |\n   | `npm run start`    | Alias for `npm run dev`                                         |\n   | `npm run build`    | Run type checking and build the project                         |\n   | `npm run preview`  | Previews the built project                                      |\n   | `npm run astro`    | Run Astro CLI commands                                          |\n   | `npm run prettier` | Blanket format all files using [Prettier](https://prettier.io/) |\n\n## Customization\n\n### Site Configuration\n\nEdit the `src/consts.ts` file to update your site's metadata, navigation links, and social links:\n\n```ts\nexport const SITE: Site = {\n  title: 'astro-erudite',\n  description: // ...\n  href: 'https://astro-erudite.vercel.app',\n  featuredPostCount: 2,\n  postsPerPage: 3,\n}\n\nexport const NAV_LINKS: SocialLink[] = [\n  {\n    href: '/blog',\n    label: 'blog',\n  },\n  // ...\n]\n\nexport const SOCIAL_LINKS: SocialLink[] = [\n  {\n    href: 'https://github.com/jktrn',\n    label: 'GitHub',\n  },\n  // ...\n]\n```\n\n### Color Palette\n\nColors 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:\n\n```css\n:root {\n  --background: oklch(1 0 0);\n  --foreground: oklch(0.145 0 0);\n  --primary: oklch(0.205 0 0);\n  --primary-foreground: oklch(0.985 0 0);\n  --secondary: oklch(0.97 0 0);\n  --secondary-foreground: oklch(0.205 0 0);\n  --muted: oklch(0.97 0 0);\n  --muted-foreground: oklch(0.556 0 0);\n  --accent: oklch(0.97 0 0);\n  --accent-foreground: oklch(0.205 0 0);\n  --destructive: oklch(0.577 0.245 27.325);\n  --border: oklch(0.922 0 0);\n  --ring: oklch(0.708 0 0);\n}\n\n[data-theme='dark'] {\n  /* ... */\n}\n```\n\n### Favicons\n\nFavicons 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:\n\n```html\n\u003c!-- Replace these with the generated meta tags --\u003e\n\u003clink rel=\"icon\" type=\"image/png\" href=\"/favicon-96x96.png\" sizes=\"96x96\" /\u003e\n\u003clink rel=\"icon\" type=\"image/svg+xml\" href=\"/favicon.svg\" /\u003e\n\u003clink rel=\"shortcut icon\" href=\"/favicon.ico\" /\u003e\n\u003clink rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"/apple-touch-icon.png\" /\u003e\n\u003cmeta name=\"apple-mobile-web-app-title\" content=\"astro-erudite\" /\u003e\n\u003clink rel=\"manifest\" href=\"/site.webmanifest\" /\u003e\n```\n\n## Adding Content\n\n### Blog Posts\n\nAdd new blog posts as MDX files in the `src/content/blog/` directory. Use the following frontmatter structure:\n\n```yml\n---\ntitle: 'Your Post Title'\ndescription: 'A brief description of your post!'\ndate: 2024-01-01\ntags: ['tag1', 'tag2']\nimage: './image.png'\nauthors: ['author1', 'author2']\ndraft: false\n---\n```\n\nThe blog post schema is defined as follows:\n\n| Field         | Type (Zod)      | Requirements                                                                                                                                                                    | Required |\n| ------------- | --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- |\n| `title`       | `string`        | Should be ≤60 characters.                                                                                                                                                       | Yes      |\n| `description` | `string`        | Should be ≤155 characters.                                                                                                                                                      | Yes      |\n| `date`        | `coerce.date()` | Must be in `YYYY-MM-DD` format.                                                                                                                                                 | Yes      |\n| `order`       | `number`        | Sort order for subposts with the same `date`. Defaults to `0` if not provided.                                                                                                  | Optional |\n| `image`       | `image()`       | Should be exactly 1200px \u0026times; 630px.                                                                                                                                         | Optional |\n| `tags`        | `string[]`      | Preferably use kebab-case for these.                                                                                                                                            | Optional |\n| `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 |\n| `draft`       | `boolean`       | Defaults to `false` if not provided.                                                                                                                                            | Optional |\n\n### Authors\n\nAdd 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:\n\n```yml\n---\nname: 'enscribe'\npronouns: 'he/him'\navatar: 'https://gravatar.com/avatar/9bfdc4ec972793cf05cb91efce5f4aaaec2a0da1bf4ec34dad0913f1d845faf6.webp?size=256'\nbio: 'd(-_-)b'\nwebsite: 'https://enscribe.dev'\ntwitter: 'https://twitter.com/enscry'\ngithub: 'https://github.com/jktrn'\nmail: 'jason@enscribe.dev'\n---\n```\n\nThe author schema is defined as follows:\n\n| Field      | Type (Zod)                                 | Requirements                                                                                                                                                             | Required |\n| ---------- | ------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------- |\n| `name`     | `string`                                   | n/a                                                                                                                                                                      | Yes      |\n| `pronouns` | `string`                                   | n/a                                                                                                                                                                      | Optional |\n| `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      |\n| `bio`      | `string`                                   | n/a                                                                                                                                                                      | Optional |\n| `mail`     | `string.email()`                           | Must be a valid email address.                                                                                                                                           | Optional |\n| `website`  | `string.url()`                             | Must be a valid URL.                                                                                                                                                     | Optional |\n| `twitter`  | `string.url()`                             | Must be a valid URL.                                                                                                                                                     | Optional |\n| `github`   | `string.url()`                             | Must be a valid URL.                                                                                                                                                     | Optional |\n| `linkedin` | `string.url()`                             | Must be a valid URL.                                                                                                                                                     | Optional |\n| `discord`  | `string.url()`                             | Must be a valid URL.                                                                                                                                                     | Optional |\n\n\u003e [!TIP]\n\u003e 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.\n\n### Projects\n\nAdd projects in `src/content/projects/` as Markdown files:\n\n```yml\n---\nname: 'Project A'\ndescription: 'This is an example project description! You should replace this with a description of your own project.'\ntags: ['Framework A', 'Library B', 'Tool C', 'Resource D']\nimage: '/static/1200x630.png'\nlink: 'https://example.com'\nstartDate: '2024-01-01'\nendDate: '2024-01-01'\n---\n```\n\nThe project schema is defined as follows:\n\n| Field         | Type (Zod)      | Requirements                            | Required |\n| ------------- | --------------- | --------------------------------------- | -------- |\n| `name`        | `string`        | n/a                                     | Yes      |\n| `description` | `string`        | n/a                                     | Yes      |\n| `tags`        | `string[]`      | n/a                                     | Yes      |\n| `image`       | `image()`       | Should be exactly 1200px \u0026times; 630px. | Yes      |\n| `link`        | `string.url()`  | Must be a valid URL.                    | Yes      |\n| `startDate`   | `coerce.date()` | Must be in `YYYY-MM-DD` format.         | Optional |\n| `endDate`     | `coerce.date()` | Must be in `YYYY-MM-DD` format.         | Optional |\n\n## License\n\nThis project is open source and available under the [MIT License](LICENSE).\n\n---\n\n### Star History\n\n\u003ca href=\"https://star-history.com/#jktrn/astro-erudite\u0026Date\"\u003e\n \u003cpicture\u003e\n   \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"https://api.star-history.com/svg?repos=jktrn/astro-erudite\u0026type=Date\u0026theme=dark\" /\u003e\n   \u003csource media=\"(prefers-color-scheme: light)\" srcset=\"https://api.star-history.com/svg?repos=jktrn/astro-erudite\u0026type=Date\" /\u003e\n   \u003cimg alt=\"Star History Chart\" src=\"https://api.star-history.com/svg?repos=jktrn/astro-erudite\u0026type=Date\" /\u003e\n \u003c/picture\u003e\n\u003c/a\u003e\n\n---\n\nBuilt with \u0026hearts; by [enscribe](https://enscribe.dev)!\n\n[Stargazers]: https://img.shields.io/github/stars/jktrn/astro-erudite?color=fafafa\u0026logo=github\u0026logoColor=fff\u0026style=for-the-badge\n[License]: https://img.shields.io/github/license/jktrn/astro-erudite?color=0a0a0a\u0026logo=github\u0026logoColor=fff\u0026style=for-the-badge\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsavecoders%2Fcybervitae","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsavecoders%2Fcybervitae","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsavecoders%2Fcybervitae/lists"}