bruno@cabado:~$ cat projects/alexandria.md

← projects/

Alexandria

Up (live demo)

  • Flask
  • API Integration
  • Personal Productivity

A private digital library app for tracking reading progress, enriching book metadata from Google Books, and exploring long-term reading analytics.

Context

Most reading trackers are either too generic or overloaded with social mechanics. Alexandria was designed as a personal, private system focused on consistency: add books quickly, keep progress clean, and extract useful signals from reading history.

What I built

Alexandria includes:

  • A dashboard split between currently reading and finished books
  • Search and add flows connected to the Google Books API
  • Detailed book records with enriched metadata (authors, categories, page count, rating, language)
  • A dedicated stats view for reading velocity, volume trends, categories, and long-range habits
  • A private librarian login for controlled access to search/edit/delete operations

Technical approach

I implemented Alexandria with Flask, Flask-Login, and SQLAlchemy on top of a SQLite data store, keeping the architecture lightweight and maintainable for solo usage. Book ingestion is API-driven (Google Books via request-based adapters), while template-driven UI views expose both operational flows (search/add/edit) and analytical outputs (stats and trend aggregates). The app is containerized for predictable local and deployment environments.

Outcome

Alexandria evolved into a full private reading companion rather than a simple list app. It balances elegant UX with practical depth: low-friction cataloging, clear reading progress, and meaningful analytics that make long-term reading habits easier to understand and sustain.

## Project gallery

Alexandria home dashboard with reading and finished sections
Alexandria statistics page with reading insights and charts
Alexandria book detail view with enriched metadata
Alexandria additional book record showing private library catalog view
1/4Alexandria home dashboard with reading and finished sections

bruno@cabado:~$ mail hi@brunocabado.com# I share work, research and product experiments in AI systems

$ send-message$ wget cv.pdf$ open linkedin$ open github

© 2026 Bruno Cabado · designed & developed in Galicia with Astro

↑↓ navigate · Enter open · Esc close

key bindings

0–8select window
n / pnext / previous window
ctalk to the agent pane
% / " or -split side by side / stacked (up to 3 panes, each shows a window)
Spacenext layout (side by side → stacked → main + stack → main + row)
qshow pane numbers, then press one to jump there
{ / }swap the focused pane with the main one
Shift+←↑↓→resize (main pane smaller / larger)
o · Ctrl+b ←↑↓→focus next pane · pane in that direction
zzoom the focused pane (again to restore)
xclose the focused pane (closing the main one promotes the split)
ttoggle theme (dark ⇄ latte) · :theme next cycles gruvbox, nord, tokyo, dracula
/ · Ctrl+ksearch the whole site
:command prompt
:set keys offdisable single-key shortcuts (the prefix still works)
Ctrl+bprefix — every key above also works after it; % " x and arrows need it

commands: search · select-window <name|n> · open <query> · ask <question> · split-window [-h|-v] [name] · kill-pane · zoom · swap-pane · layout · theme [mocha|latte|gruvbox|nord|tokyo|dracula] · ls · exit · help
agent: type /clear to reset the conversation