Skip to the content.

CLAUDE.md

This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.

Project Overview

Personal engineering blog + paid online course platform at ashoklabs.com. Built on Jekyll (static site) + Cloudflare Workers (serverless backend for payments and auth).

Development

Local dev server (Docker):

docker run --rm \
  -v "$PWD:/srv/jekyll" \
  -p 4000:4000 \
  jekyll/jekyll:4 \
  jekyll serve --livereload --force_polling

Stop server:

docker stop $(docker ps -q --filter ancestor=jekyll/jekyll:4)

Deploy Cloudflare Worker (from _cloudflare/ directory):

wrangler deploy

There are no tests. GitHub Pages auto-builds and deploys on push to main.

Architecture

Static Site (Jekyll)

Blog Posts (_posts/)

Named YYYY-MM-DD-slug.md. Required frontmatter:

---
title: "Post Title"
categories: [category]   # also used in URL path
date: 2026-03-14
image: https://images.unsplash.com/photo-xxx?w=600&q=80
description: One-liner shown on homepage cards
---

Course Platform

Cloudflare Worker (_cloudflare/worker.js)

Handles all dynamic backend logic via /api/* routes:

Secrets managed via wrangler secret put: RAZORPAY_KEY_SECRET, RAZORPAY_WEBHOOK_SECRET, GITHUB_CLIENT_SECRET.

Access Control Flow

  1. User purchases course → Worker creates Razorpay order, receives webhook → stores {email}: true in KV namespace COURSE_ACCESS
  2. User logs in via GitHub OAuth (Worker handles callback)
  3. Cloudflare Zero Trust Access policy calls Worker’s /check-access endpoint before serving lesson pages
  4. Lesson progress tracked via Worker API calls from frontend JS in lesson.html