
LifeLog is born — the blog that documents the journey
Why another blog?
I’ve spent the last months building — Arachne, Capivara, Dogwalk, TatuEngine, portfolio. Each project generated decisions, bugs, pivots, learnings. But it all stayed in my head or, at best, in scattered Obsidian notes no one else saw.
Then I caught myself thinking: how many times did I solve a hard problem, document the solution in a .md file inside the repo, and months later not even remember I’d written it?
It’s not about ego or “building an audience.” It’s about:
- Public record — the decisions I made, the mistakes I committed, the wins that worked
- Future reference — 6 months from now, I want to search “how did I deploy Arachne on VPS?” and find the post
- Discipline — writing forces mental organization. If I can’t explain it, I haven’t understood it
- Exchange — maybe someone stumbles on a post and saves hours of debugging
The name LifeLog came naturally. It’s not a traditional blog with editorial and agenda — it’s the dev life log. What I’m doing, what I’m learning, what went wrong.
The stack — Astro 7 + MDX
Choosing the stack was faster than expected. I already knew Astro from other projects, and version 7 brought:
- Typed Content Collections with Zod schema — validated frontmatter at build
- Native MDX — JSX inside markdown without extra plugins
- Shiki syntax highlighting with automatic light/dark themes
- Zero JS by default — posts are pure HTML, only load scripts if interactive
# Creating the project took minutes
npm create astro@latest lifelog -- --template basics
npx astro add mdx
npx astro add tailwind
The post schema was lean:
// src/content/config.ts
import { defineCollection, z } from 'astro:content'
const posts = defineCollection({
type: 'content',
schema: z.object({
title: z.string(),
description: z.string(),
date: z.date(),
pubDate: z.date().optional(),
project: z.enum(['arachne', 'dogwalk', 'portfolio', 'capivara',
'tatuengine', 'estudos', 'descobertas']),
tags: z.array(z.string()),
icon: z.string().optional(),
cover: z.string().optional(),
featured: z.boolean().default(false),
draft: z.boolean().default(false),
}),
})
Each post becomes a route automatically. The typing is so strong that if I misspell a tag name in the frontmatter, the build breaks. This prevents the “messy blog” that most abandon after 3 posts.
Why not Notion / Substack / Medium?
I’ve used them all. Always the same story: excited start, write 4 posts, the platform changes its layout, my links break, the lock-in annoys me, I abandon it.
With Astro + MDX:
.mdxfiles in a directory — portable to any stack- Git versioned — every post has change history
- Static build — deploy anywhere (Vercel, Cloudflare, Netlify, S3)
- No database, no CMS, no dashboard — just
git push