diff options
| author | 2026-05-02 23:49:00 +0700 | |
|---|---|---|
| committer | 2026-05-02 23:49:00 +0700 | |
| commit | d8de4ede8c6a0cc02b9c8c30d68155b1f838254c (patch) | |
| tree | 449701dcf7ac0aafc7f21116b77203d0cc51fc98 /CLAUDE.md | |
| parent | 4c05d4c66827d6e5a131c657ee08293bcde497d1 (diff) | |
| parent | cca3ff72b5e29b31122c0a0496be741e7bc0162b (diff) | |
| download | web-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.md | 62 |
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 |