This is a porfolio site template complete with a blog. Includes:
- MDX and Markdown support
- Optimized for SEO (sitemap, robots, JSON-LD schema)
- RSS Feed
- Dynamic OG images
- Syntax highlighting
- Tailwind v4
- Vercel Speed Insights / Web Analytics
- Geist font
https://portfolio-blog-starter.vercel.app
You can choose from one of the following two methods to use this repository:
Deploy the example using Vercel:
Execute create-next-app with pnpm to bootstrap the example:
pnpm create next-app --example https://github.com/vercel/examples/tree/main/solutions/blog blogThen, run Next.js in development mode:
pnpm devDeploy it to the cloud with Vercel (Documentation).
Add these environment variables in Vercel Project Settings:
INTERVALS_ICU_API_KEYINTERVALS_ICU_ATHLETE_ID(defaults toi691810if omitted)CRON_SECRET(Bearer token for/api/cron/activityand/api/activity)BLOB_READ_WRITE_TOKEN(Vercel Blob; created when you enable Blob on the project)TELEGRAM_BOT_TOKENTELEGRAM_CHAT_ID
This project includes a Vercel Cron in vercel.json that calls /api/cron/activity every day at 21:00 UTC.
Each run sends a Telegram message with success/failure status.
The latest run JSON is stored in Vercel Blob at pathname activities/latest-run.json with private access (readable only with your blob token on the server, not a public URL).
To manually test the cron endpoint locally:
curl -H "Authorization: Bearer $CRON_SECRET" http://localhost:3000/api/cron/activityTo fetch the cached latest-run JSON from Blob (also requires Bearer auth):
curl -H "Authorization: Bearer $CRON_SECRET" http://localhost:3000/api/activityTo simulate Telegram failure handling locally:
TELEGRAM_BOT_TOKEN=invalid TELEGRAM_CHAT_ID=invalid curl -H "Authorization: Bearer $CRON_SECRET" http://localhost:3000/api/cron/activity