Personal bio/portfolio website.
Live at:
- Astro
- React
- TypeScript
- TailwindCSS
bun install
bun run devGET /api/moods
Query params:
before(string, optional): pagination cursor (oldest mood id currently loaded).
Response shape
{
"posts": [
{
"id": "12345",
"datetime": "2025-01-01T12:34:56+00:00",
"tag": "life",
"previewText": "text preview",
"previewHtml": "<p>text preview</p>",
"image": "https://...",
"mediaHtml": "<div>...</div>",
"needsDetailPage": true,
"forwardedFrom": { "name": "source", "href": "https://t.me/..." },
"quote": { "text": "quoted text", "author": "someone", "href": "/mood/123" },
"reactions": [
{ "emoji": "👍", "emojiId": "123", "emojiImage": "https://...", "count": "2", "isPaid": false }
]
}
],
"channel": {
"slug": "my_channel",
"title": "My Channel"
}
}Documentation:
Documentation:
Documentation:
Mood photos can be served via a Cloudflare Worker for higher quality and edge caching.
Documentation:
.
├── src/ # Application source code
│ ├── pages/ # Astro routes and API endpoints
│ │ ├── index.astro # Homepage
│ │ ├── mood.astro # Mood feed page
│ │ ├── mood/[id].astro # Mood detail page
│ │ ├── mood/embed.astro # Embeddable widget page
│ │ ├── api/ # JSON/SVG/oEmbed/webhook endpoints
│ │ └── static/ # Static proxy/helper routes
│ ├── components/ # Reusable Astro/React components
│ │ └── ui/ # UI primitives
│ ├── layouts/ # Shared layout wrappers
│ ├── lib/ # Utilities and service integrations
│ │ ├── notify/ # Email notify domain logic
│ │ └── security/ # Turnstile and security helpers
│ └── styles/ # Global styles and Tailwind layers
├── public/ # Public static assets
│ └── fonts/ # Font files
├── docs/ # API and feature documentation
├── workers/ # Cloudflare Worker projects
│ ├── notify-scheduler/ # Scheduled notify dispatcher
│ └── telegram-image-proxy/ # Telegram image proxy worker
├── scripts/ # Maintenance/migration scripts
├── tests/ # Automated tests
│ └── e2e/ # Playwright e2e test cases
├── astro.config.mjs # Astro config and integrations
├── tailwind.config.mjs # Tailwind theme/config
└── .env # Environment template with comments
Variable descriptions are maintained as inline comments in .env.
Use .env.local for local secrets and keep .env as the documented template.
- miantiao-me/BroadcastChannel - Inspiration and code reference for
moodsideas. - ddiu8081/ddiu.io - Inspiration and code reference for
Ghost APIintegration. - zmh-program/zmh-program.github.io - Inspiration for layout and style ideas.
- antfu/antfu.me - Inspiration for personal website design and content ideas.
- The Astro, React, and Tailwind CSS communities for great tooling and docs.
- Open-source maintainers whose libraries power this site.
Copyright (c) 2026 bunizao. All rights reserved.
This repository is publicly visible for source inspection. No permission is granted to use, copy, modify, distribute, deploy, or commercialize this code without prior written approval from bunizao.
If you obtained an earlier version of this project under a different license, that version remains governed by the license terms that were included with that version.
Third-party components and assets remain subject to their own licenses.
See the LICENSE file for the full terms.