Lopes Logbook is my professional website, currently published at lopes.id. It is a long-term knowledge base and portfolio where I document my work, research, and ideas around information security, detection engineering, automation, and adjacent domains.
The goals of this project are:
- Share knowledge in a structured and durable form
- Showcase my professional work and evolution
- Maintain full ownership of my content and platform
- Provide a stable personal space on the web
- Content & site generation: Quarto
- Version control: Git + GitHub
- Design & assets: Figma
- Automation: Bash (hooks & helper scripts)
- CI/CD: GitHub Actions
- Hosting: Cloudflare Pages
The workflow is designed to protect the main branch, preserve history, and keep publishing predictable and low-stress. The philosophy is Write like a human. Publish like an engineer.
Branch names follow the pattern: <namespace>/<short-description>.
| Namespace | Purpose | Examples |
|---|---|---|
post |
New articles | post/gap-analysis-mitre, post/dfir-toolkit |
deck |
New Reveal.js presentations | deck/bsides-detection-at-scale |
revise |
Significant updates to existing posts | revise/mitre-intro-2025 |
typo |
Minor textual fixes | typo/fix-cloudflare-spelling |
bugfix |
Structural or layout problems | bugfix/navbar-overflow |
design |
Visual & asset work | design/new-og-templates |
infra |
CI/CD, hosting, tooling | infra/add-image-linter |
docs |
Documentation only | docs/architecture-update |
release |
Publishing milestones | release/2025-q1 |
This keeps intent obvious and keeps history meaningful.
gitGraph
commit
commit
branch post-a
checkout post-a
commit
commit
checkout main
branch feature
checkout feature
commit
commit
commit
commit
checkout main
branch post-b
commit
checkout main
merge post-b
checkout feature
commit
checkout main
merge feature
checkout post-a
commit
checkout main
merge post-a
This project enforces quality and SEO standards automatically through Git hooks and CI.
Validation is enforced at commit time through a pre-commit hook:
- post structure & SEO fields
- image size & format
- filename constraints
- repository hygiene
To install automation after cloning:
chmod +x scripts/setup.sh
./scripts/setup.shThis installs:
.git/hooks/pre-commit: active Git hook- enforcement logic from
scripts/pre-commit.sh
All pull requests to main are validated via GitHub Actions (.github/workflows/integration.yml):
- Pre-commit content & image checks (
scripts/pre-commit.sh) - Full Quarto site render (
quarto render --output-dir _site-test) - Automatic deploy of
_site-testto Cloudflare Pages branchpreview, served athttps://preview.lopes.id
No code reaches main unless both local and CI validation succeed.
- Where it lives: Every same-repo PR deploys to the
previewbranch on thelopes-idCloudflare Pages project and posts a comment on the PR with two links:https://preview.lopes.id— always points to the latest PR preview buildhttps://<hash>.lopes-id.pages.dev— immutable link for that specific workflow run
- How it is protected:
preview.lopes.id,*.lopes-id.pages.dev, andlopes-id.pages.devare gated by Cloudflare Zero Trust Access (configured interraform/access.tfandterraform/dns.tf). Production (https://lopes.idandhttps://www.lopes.id) stays public. - How to log in:
- Open
https://preview.lopes.id(or the per-commit.pages.devlink from the PR comment). - Cloudflare Access redirects to the login screen (
lopes-id.cloudflareaccess.com). - Enter the allowed email (
CF_ACCESS_EMAILin.env/ GitHub Secrets) and click Send me a code. - Enter the 6-digit One-Time Pin (OTP) sent to your inbox. Your session stays valid for 24 hours.
- Open
- Enforcement logic lives in
scripts/ - Hook wiring is reproducible via
scripts/setup.sh - Local and CI checks are aligned
- Automation is deterministic and idempotent
- Create branch:
git checkout -b post/my-new-article- Create post file at
log/<slug>/index.qmd - Place optimized
.webpOpen Graph and article images inlog/<slug>/ - Validate locally (
make checkor commit to trigger the pre-commit hook) - Push branch and open Pull Request (CI validates, renders, and deploys a preview to
https://preview.lopes.id)