AstroPortfolio

ctros — Astro Portfolio Template

By aglabsid

Ctros is a minimal personal website template built with Astro, including modules for a blog, project showcase, comments, and analytics, under the MIT license.

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-10-05View source

What stands out

A quick read of the recorded project description.

01

Uses Astro static generation, with content maintained via JSON data and MDX files

02

Built-in Giscus comment system based on GitHub Discussions

03

Supports Umami privacy-friendly visit analytics

04

Automatically generates dynamic Open Graph images for social sharing

05

Provides a dark theme, responsive layout, and View Transitions page transitions

06

Optional GitHub Action to send Discord notifications when new posts are pushed

Template Details

Ctros is a minimal personal website template built with Astro, suitable for creating a personal homepage, portfolio, and blog. Content is managed through JSON data and MDX files: about.json, software.json, hardware.json, and project-categories.json under src/data are used to maintain personal information, frequently used software and hardware, and project categories; src/content/post and src/content/project store blog posts and project entries, respectively, each as a folder containing index.mdx. The template includes Giscus comments, Umami analytics, dynamic Open Graph images, View Transitions, a dark theme, and a responsive layout, and provides an optional Discord notification GitHub Action. Before use, Node.js 22+ and pnpm (or npm) are required; copy .env.example to .env and fill in the Giscus-related variables, and configure the Umami website ID in astro.config.mjs. Discord notifications are disabled by default; to enable them, configure the webhook in repository Secrets and uncomment the push trigger block in the workflow.

AstroPortfolio

Is it right for your project?

Use Cases

  • Build a personal homepage and display bio, skills, frequently used software, and hardware information
  • Publish MDX blog posts with tags, summaries, and thumbnails
  • Showcase personal projects by category, with GitHub repository and demo links
  • Add GitHub Discussions-based comments to blog posts
  • Use Umami to track site visit data

Suitable For

  • Developers who want to build a minimal personal website or portfolio with Astro
  • Users who prefer managing content with MDX and JSON files
  • Personal sites that need common blog features such as comments, visit analytics, and social share images
  • Users who can configure Giscus, Umami, and GitHub Actions themselves

Getting started & customization

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

  1. 1

    Requires Node.js 22+; using pnpm to install dependencies is recommended

  2. 2

    Copy .env.example to .env and fill in the Giscus repository name, repository ID, category name, and category ID

  3. 3

    For Umami, register or self-host to obtain a website ID, then configure it in astro.config.mjs

  4. 4

    Discord notifications are disabled by default; configure repository Secrets and variables and uncomment the push trigger block in the workflow

  5. 5

    Third-party assets such as demo images, fonts, and icons must be checked against their respective licenses; external services may charge additional fees

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

  • The code of this version may be used, modified, used commercially, and distributed for free.
  • 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

  • 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 charge additional fees.
  • Using the comment feature requires configuring Giscus environment variables pointing to your own GitHub repository.
  • Visit analytics depends on Umami; you need to register a hosted account or set up your own instance.
  • Giscus comments are based on GitHub Discussions, which must be enabled in the repository.
  • The Giscus GitHub app must be installed and authorized for your repository.
  • Discord notifications require creating your own webhook and configuring repository secrets.
  • The Discord notification workflow is disabled by default and must be enabled manually.
  • You must uncomment the push trigger block in the workflow to send notifications automatically.
View Original Text Basis

Permission is hereby granted, free of charge

Original License Text

PUBLIC_GISCUS_REPOSITORY_NAME=your-username/your-repo

Original README

1. **Create an Umami account**:

Original README

1. **Enable GitHub Discussions** on your repository:

Original README

2. **Install the Giscus app**:

Original README

1. **Create a webhook**: Discord channel → Edit Channel → Integrations → Webhooks → New Webhook, then copy the URL

Original README

It is disabled by default.

Original README

3. **Enable the trigger** by uncommenting the `push` block in the workflow:

Original README
https://github.com/aglabsid/ctros/blob/main/LICENSEhttps://github.com/aglabsid/ctros/blob/main/README.md

Compiled by DeepSeek based on repository license and README ·2026-10-05. 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
Astro Themes
Documentation and maintenance reference score
More documented · 83 / 100
Technologies
Astro
Website type
Portfolio
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-28
Screenshot last checked
2026-10-05

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.

Review declaration: [email protected] · 2026-10-05

Inspect the recorded source material

SHA-256: 74bbbc41848d9fa0517caf848e19289c5c9bcdc79259665eb08ade1c5717e6ca

2026-10-05T01:18:42.736Z

Source file / repository
# Ctros

Minimal personal website template built with [Astro](https://astro.build).

## Features

- ⚡ **Fast & Lightweight** - Static site generation with Astro
- 🖼️ **Dynamic Open Graph Images** - Auto-generated OG images for social sharing
- 📝 **JSON & MDX Content** - Easy content management with JSON data and MDX for blog posts
- 💬 **Post Comments** - Integrated commenting system powered by [Giscus](https://giscus.app/)
- 🔔 **Discord Notifications** - Optional GitHub Action that announces new posts to Discord
- 📊 **Analytics** - Privacy-friendly analytics with [Umami](https://umami.is/)
- 🎨 **View Transitions** - Smooth page transitions with shared element animations
- 🌙 **Dark Theme** - Beautiful dark mode design
- 📱 **Responsive** - Mobile-first responsive layout
- 🔍 **SEO Optimized** - Meta tags and structured data support

## Tech Stack

- [Astro](https://astro.build) - Static Site Generator
- [React](https://react.dev) - UI Components
- [Tailwind CSS](https://tailwindcss.com) - Styling
- [MDX](https://mdxjs.com) - Content authoring
- [Shiki](https://shiki.style) - Syntax highlighting
- [Giscus](https://giscus.app) - Comments
- [Umami](https://umami.is) - Analytics

## Getting Started

### Prerequisites

- Node.js 22+
- pnpm (recommended) or npm

### Installation

1. Clone the repository:

```bash
git clone [email protected]:aglabsid/ctros.git
cd ctros
```

2. Install dependencies:

```bash
pnpm install
```

3. Create environment variables:

```bash
cp .env.example .env
```

4. Configure your environment variables (see [Configuration](#configuration))

5. Start the development server:

```bash
pnpm dev
```

## Configuration

### Environment Variables

Create a `.env` file in the root directory with the following variables:

```env
# Giscus Configuration
PUBLIC_GISCUS_REPOSITORY_NAME=your-username/your-repo
PUBLIC_GISCUS_REPOSITORY_ID=your-repo-id
PUBLIC_GISCUS_CATEGORY_NAME=Announcements
PUBLIC_GISCUS_CATEGORY_ID=your-category-id
```

### Setting up Umami Analytics

[Umami](https://umami.is/) is a simple, fast, privacy-focused analytics alternative to Google Analytics.

This project uses [@yeskunall/astro-umami](https://github.com/yeskunall/astro-umami) integration.

1. **Create an Umami account**:
   - Sign up at [cloud.umami.is](https://cloud.umami.is/) (hosted) or self-host your own instance

2. **Add your website**:
   - Go to Settings → Websites → Add website
   - Enter your website name and domain

3. **Get your Website ID**:
   - Click on your website in the dashboard
   - Copy the Website ID from the tracking code

4. **Update `astro.config.mjs`**:

   ```js
   import yeskunallumami from '@yeskunall/astro-umami'

   export default defineConfig({
   	integrations: [
   		// ...other integrations
   		yeskunallumami({
   			id: 'your-website-id',
   			hostUrl: 'https://cloud.umami.is', // or your self-hosted URL
   		}),
   	],
   })
   ```

For more details, see the [Umami documentation](https://umami.is/docs).

### Setting up Giscus

[Giscus](https://giscus.app/) is a comments system powered by GitHub Discussions.

1. **Enable GitHub Discussions** on your repository:
   - Go to your repository → Settings → General
   - Scroll to "Features" section
   - Check "Discussions"

2. **Install the Giscus app**:
   - Visit [github.com/apps/giscus](https://github.com/apps/giscus)
   - Click "Install" and select your repository

3. **Get your configuration values**:
   - Go to [giscus.app](https://giscus.app/)
   - Enter your repository name
   - Choose your preferred settings
   - Copy the `data-repo-id` and `data-category-id` values

4. **Update your `.env` file** with the values from step 3

For more details, see the [Giscus documentation](https://giscus.app/).

### Setting up Discord Notifications

`.github/workflows/discord-notify.yml` posts a message to Discord whenever a new post is pushed to `main`. It is disabled by default.

1. **Create a webhook**: Discord channel → Edit Channel → Integrations → Webhooks → New Webhook, then copy the URL

2. **Add repository settings** (Settings → Secrets and variables → Actions):
   - Secret `DISCORD_WEBHOOK_URL` - the webhook URL
   - Variable `SITE_URL` - your site URL, e.g. `https://example.com`
   - Variable `DISCORD_ROLE_ID` (optional) - role to mention

3. **Enable the trigger** by uncommenting the `push` block in the workflow:

   ```yaml
   on:
     workflow_dispatch:
     push:
       branches: [main]
       paths: ['src/content/post/**/index.mdx']
   ```

## Project Structure

```
ctros/
├── public/              # Static assets
├── src/
│   ├── components/      # UI components
│   │   └── mdx/         # MDX components
│   ├── content/         # Content collections
│   │   ├── post/        # Blog posts (MDX)
│   │   └── project/     # Projects (MDX)
│   ├── data/            # JSON data files
│   ├── layouts/         # Page layouts
│   ├── lib/             # Utility functions
│   ├── pages/           # Page routes
│   └── styles/          # Global styles
├── astro.config.mjs     # Astro configuration
└── package.json
```

## Content Management

### Blog Posts

Create a new folder in `src/content/post/` with an `index.mdx` file:

```mdx
---
title: My Post Title
thumbnail: ./thumbnail.png
thumbnailCredit: Photo by Someone
summary: A brief summary of the post
tags:
  - tag1
  - tag2
author: Your Name
createdAt: 2025-01-01T10:00:00+00:00
updatedAt: 2025-01-01T10:00:00+00:00
---

Your content here...
```

### Projects

Create a new folder in `src/content/project/` with an `index.mdx` file:

```mdx
---
title: Project Name
thumbnail: ./thumbnail.png
description: Project description
category: web
github: https://github.com/...
demo: https://...
---

Project details here...
```

### Site Data

Edit the JSON files in `src/data/` to customize:

- `about.json` - Personal information (`firstName`, `lastName`, `headline`, `email`, `cv`, bio, skills, social links)
- `software.json` - Software/tools you use
- `hardware.json` - Hardware/equipment
- `project-categories.json` - Project categories

## Commands

| Command        | Description               |
| -------------- | ------------------------- |
| `pnpm dev`     | Start development server  |
| `pnpm build`   | Build for production      |
| `pnpm preview` | Preview production build  |
| `pnpm format`  | Format code with Prettier |

## License

MIT License
Report a correction

Explore similar templates

Compare previews and descriptions within the same stack and category.