summaryrefslogtreecommitdiff
path: root/CLAUDE.md
diff options
from:
to:
context:
space:
mode:
authorGravatar Saya Andy <145215889+SayaAndy@users.noreply.github.com> 2026-05-02 23:49:00 +0700
committerGravatar GitHub <noreply@github.com> 2026-05-02 23:49:00 +0700
commitd8de4ede8c6a0cc02b9c8c30d68155b1f838254c (patch)
tree449701dcf7ac0aafc7f21116b77203d0cc51fc98 /CLAUDE.md
parent4c05d4c66827d6e5a131c657ee08293bcde497d1 (diff)
parentcca3ff72b5e29b31122c0a0496be741e7bc0162b (diff)
downloadweb-0.14.0.tar.gz
web-0.14.0.zip
v0.14.0 (#27)v0.14.0
* [feat: migrate to uz.saya.casa](https://github.com/SayaAndy/saya-today-web/commit/d3a63ca8a84bf4583bac8f5fd09bd52774bc4158) * [feat: overhaul the design of blog catalog](https://github.com/SayaAndy/saya-today-web/commit/99294b260661a8d3f6992404de7881945eab837b) * [feat: replace font-andika with M PLUS and Gentium Plus](https://github.com/SayaAndy/saya-today-web/commit/b1355436e96f2dfa777e843b53896d0bb71628e3) * [feat: use yandexcloud.kz for photos & static](https://github.com/SayaAndy/saya-today-web/commit/3898baa47faf268864ecac3699f7e98c6cac01a4) * [feat: move from b2 to s3 for blog pages & facts](https://github.com/SayaAndy/saya-today-web/commit/3efa6ed24713658af855c0ca9504f3e089342182) * [feat: support s3 for blog pages](https://github.com/SayaAndy/saya-today-web/commit/66b2a96fcca113105043be3cb9c49f8ee7fe240c) * [feat: use accent colors for glightbox tooltip](https://github.com/SayaAndy/saya-today-web/commit/81a9147c5406e3b2f2441373b935d7c5de2780da) * [fix: set sidecar onclick attribute correctly in update](https://github.com/SayaAndy/saya-today-web/commit/941bd3b3f3e26ca62757a34a20bc9b323be02a74) * [fix: set cache-control for non-cacheable pages](https://github.com/SayaAndy/saya-today-web/commit/78d6b00cd973e4254ea13cbb17bb35a30fef51b9) * [feat: update font-awesome 6.7.2 to 7.2.0](https://github.com/SayaAndy/saya-today-web/commit/5e64aa9db2796e8aa6267d2ed9179ea01dc6561b) * [fix: remove leading slash in path with going up](https://github.com/SayaAndy/saya-today-web/commit/13428b467f752d9b53b39a3c8122998f1896ed1e) * [feat: implement rate limiting](https://github.com/SayaAndy/saya-today-web/commit/ca1f36376865cb2a20923aa62fdff3ee217abde3) * [feat: integrate unix sockets into stage & prod](https://github.com/SayaAndy/saya-today-web/commit/507bcbac6b1bf9f1a731afbe82bec10700f4028c) * [feat: compact & move new fonts into yandexcloud.kz](https://github.com/SayaAndy/saya-today-web/pull/27/commits/cca3ff72b5e29b31122c0a0496be741e7bc0162b) * [feat: update all github actions, golang dependencies, golang to 1.26, alpine to 3.23](https://github.com/SayaAndy/saya-today-web/commit/a3aa1dd07abfbbb27a7dfeeb536a6fcc51709256) * [refactor: simpler frontmatter parser (replace regexp with bytes pkg)](https://github.com/SayaAndy/saya-today-web/commit/42bf9d8e7f459f9021fb6fb389d3b51fed5edc35) * [feat: allow some api methods + disallow user pages for bots](https://github.com/SayaAndy/saya-today-web/commit/e3c80a07514a052adafd5c0f51daf69b664530e0)
Diffstat (limited to 'CLAUDE.md')
-rw-r--r--CLAUDE.md62
1 files changed, 62 insertions, 0 deletions
diff --git a/CLAUDE.md b/CLAUDE.md
new file mode 100644
index 0000000..34a12ce
--- /dev/null
+++ b/CLAUDE.md
@@ -0,0 +1,62 @@
+# CLAUDE.md
+
+This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
+
+## Build & Run
+
+```bash
+# Build (CGO required for SQLite)
+CGO_ENABLED=1 go build -o sayana-web .
+
+# Run (select config via ENVIRONMENT)
+ENVIRONMENT=local ./sayana-web
+
+# Generate Tailwind CSS
+npx @tailwindcss/cli -i ./static/input.css -o ./static/output.css
+
+# Docker build
+docker build -t sayana-web .
+```
+
+Server listens on `:3000`. No Makefile. No test suite currently.
+
+## Environment
+
+Config selected by `ENVIRONMENT` var (`local`/`stage`/`prod`) → `config/config.{env}.yaml`.
+
+Key env vars: `B2_KEY_ID`, `B2_APPLICATION_KEY`, `MAIL_HOST`, `MAIL_ADDRESS`, `MAIL_USERNAME`, `MAIL_PASSWORD`, `MAIL_SALT`. See `.envrc` for local setup.
+
+## Architecture
+
+**Go + Fiber v2** web app serving a multi-language blog/travel site with SSR.
+
+### Request Flow
+1. Fiber router with middleware (CORS, compression, ETags, trailing slash)
+2. Routes auto-register via `init()` in `internal/router/handlers/` — each handler file adds to `router.Routes` global slice
+3. Handlers implement `Route` interface: `Filter()`, `IsTemplated()`, `Render()`, `RenderBody()`
+4. Templated routes render via `TemplateManager` (Go `html/template`) with layout composition
+5. Pages cached in Ristretto (512MB in-memory) with TTL; segments loadable via `/api/v1/general-page/:part`
+
+### Storage
+- **Blog content:** Markdown files with YAML frontmatter on B2 or S3 (configurable via `blog.Client` interface)
+- **Database:** SQLite3 via `database/sql` (no ORM). Migrations in `migrations/` via golang-migrate
+- **Tables:** `blog_likes`, `blog_views`, `user_email_table`, subscription tables
+- **Session cache:** SQLite-backed `ClientCache` for client IDs/preferences
+
+### Key Subsystems
+- **Markdown rendering:** Goldmark with custom extensions — `TailwindExtension` (applies Tailwind classes) and `GLightboxExtension` (image galleries)
+- **Mailer:** SMTP email with verification codes, subscription management
+- **BlogTrigger:** gocron scheduler that detects new posts and sends notification emails
+- **i18n:** Language in URL path (`/en/`, `/ru/`), locale YAML files in `locale/`
+
+### Handler Pattern
+Handlers in `internal/router/handlers/` follow naming convention matching routes:
+- `lang-blog.go` → `/:lang/blog/` pages
+- `api-v1-like-put.go` → `/api/v1/like` PUT endpoint
+- Each handler self-registers in `init()`, no central route table to maintain
+
+## Deployment
+
+CI/CD via GitHub Actions → Docker image to ghcr.io → Ansible playbook (`deploy/`).
+- `stage` branch → stage environment
+- Version tags → prod environment