~/francis-ohara_
all work

~/work/museanalytics

MuseAnalytics

Visitor analytics for the Colby College Museum of Art

A full-stack data analytics platform that gives Colby College Museum of Art staff real-time visibility into visitor metrics, with sub-100ms dashboards backed by Redis and async PostgreSQL.

PythonPythonFastAPIFastAPIReactReactTypeScriptTypeScriptPostgreSQLPostgreSQLRedisRedisDockerDockerGitHub ActionsGitHub Actions

Role

Full-Stack Engineer

Timeline

Dec 2025 → Present

<100ms

dashboard response times

Async

SQLAlchemy 2.0 + PostgreSQL data layer

CI/CD

automated tests, lint & build checks

muse-analytics-6d539db2920e.herokuapp.com

MuseAnalytics interface

01 · the problem

The Colby College Museum of Art collects visitor data but had no fast way to see it. Staff needed a dashboard that answers questions instantly, not reporting queries that crawl through raw records on every page load.

02 · what I built

  • Built the platform end-to-end with FastAPI on the backend and React + TypeScript + Tailwind CSS on the frontend.
  • Engineered a high-performance data layer using SQLAlchemy 2.0 and async PostgreSQL, significantly improving concurrency for complex reporting queries.
  • Integrated Redis caching to serve pre-computed analytics, achieving sub-100ms dashboard response times for museum staff.
  • Containerized the application with Docker and built a CI/CD pipeline with GitHub Actions automating pytest runs, Docker image build validation, and linting.

03 · the pipeline

  1. 1

    collect

    Visitor data flows into PostgreSQL through the FastAPI backend.

  2. 2

    compute

    Analytics are pre-computed instead of being recalculated per request.

  3. 3

    cache

    Redis serves the pre-computed metrics, keeping dashboard responses under 100ms.

  4. 4

    visualize

    A React + Tailwind dashboard gives staff real-time visibility into visitor metrics.

  5. 5

    ship

    GitHub Actions runs pytest, lint, and Docker build validation on every change.

04 · key decisions

Async from the data layer up

SQLAlchemy 2.0's async support with PostgreSQL means concurrent reporting queries don't block each other; the dashboard stays responsive even when staff pull complex reports simultaneously.

Cache the answer, not the query

Pre-computing analytics and serving them from Redis turns expensive aggregations into sub-100ms lookups. Staff get real-time-feeling dashboards without hammering the database.

CI/CD on day one

Tests, linting, and Docker build validation run automatically on every push: the kind of pipeline discipline I learned shipping at Google, applied to a campus project.

05 · where it stands

  • Sub-100ms dashboard responses for museum staff.
  • Real-time visibility into visitor metrics for the Colby College Museum of Art.
  • Fully containerized with automated CI/CD.
PythonFastAPIReactTypeScriptPostgreSQLRedisDockerGitHub Actions