Sin Pluma

An academic writing platform that taught me how satisfying software architecture can be when many separate parts finally work as one system.

Experience
React · Slate
API
Flask REST
Data
MySQL · Redis · MinIO
Operations
Docker Compose
A typewriter and writing desk representing the Sin Pluma publishing platform

The project that made architecture click

Sin Pluma began as an academic project, but it became much more personal to me. Bringing the editor, API, databases, storage, and language service together gave me my first real sense of what software architecture could make possible.

I built the project alone and presented it alongside 39 others, many made by teams of three students. It placed second and earned the degree recognition reserved for the top three. More importantly, the feeling of seeing every part work together showed me the path I wanted to follow.

From first discovery to the next draft

Discover

Find and follow written work

Readers browse works, inspect author profiles and synopses, follow notebooks, and return to structured chapter collections.

Compose

Write in a focused rich-text editor

Slate preserves structured page content while React and Redux coordinate editing, navigation, session state, and API activity.

Organize

Build works from notebooks and pages

A clear domain model connects users, notebooks, ordered pages, genres, reading lists, tags, and media without flattening everything into documents.

Analyze

Bring language assistance into the page

An isolated linguistics service classifies sentence sentiment and returns annotations the editor can display without owning publishing data.

From signing in to choosing a chapter

The finished interface gave readers a direct path into the library. They could sign in, search across published works, open a title, and choose a chapter from its table of contents.

Address:sinpluma.local/sign-in
Sin Pluma sign-in page with username and password fields
A focused sign-in page gives returning writers and readers access to their account.
Address:sinpluma.local/search
Sin Pluma search results showing several published works
Readers can search the catalog and compare titles, genres, and synopses before opening a work.
Address:sinpluma.local/works/el-gato-negro
Sin Pluma page for El gato negro with its synopsis and chapter list
Each work brings its cover, synopsis, author, genre, follow state, and ordered chapters into one reading page.

The architecture begins with a writing surface

The Slate editor works with structured page content rather than a plain textarea. React composes the workspace, Redux holds shared state, and Axios manages authenticated communication with the API.

Explore the frontend engineering →
Address:sinpluma.local/editor
Sin Pluma rich-text editor showing a chapter with an analysis action
The writing interface keeps editing central while API, authentication, and language analysis remain behind explicit boundaries.

Specialized services behind one entry point

Nginx exposes one public surface and routes requests inward. React owns the browser experience, Flask coordinates business behavior, and the storage layer separates content, objects, and revocation state.

Transactional data

Application services

Product experience

👤 Reader or writer

🌐 Nginx entry point

✍️ React, Redux, and Slate

🧠 Linguistics service

⚙️ Flask REST API

🔐 Redis token revocation

🖼️ MinIO object storage

🔀 MySQL Router

💾 MySQL node 1

💾 MySQL node 2

💾 MySQL node 3

Boundaries that support the product

The database can lose a node without losing the product

Three MySQL nodes use Group Replication behind MySQL Router. The API connects to one logical endpoint while the cluster maintains quorum, elects a primary, and brings returning members back into sync.

An idempotent MySQL Shell bootstrap configures the cluster and seeds the schema. Docker volumes preserve data across container restarts, and the application remains isolated from individual database addresses.

High availability

Follow failover from router to replicas

Inspect cluster bootstrapping, quorum behavior, recovery, schema choices, and the production hardening beyond the demonstration.

Read the cluster design →

A request crosses clear ownership boundaries

  1. Enter through Nginx
  2. Validate in Flask
  3. Coordinate services
  4. Commit durable state
  5. Update the experience

Networks limit the blast radius

Public, frontend, backend, and cluster networks expose only the connections each container needs. The API reaches the router, not the individual database nodes.

One command assembles the environment

Docker Compose starts the product, supporting services, cluster bootstrap, and routing as a reproducible system rather than a manual list of local dependencies.

The outcome

A complete writing experience and a distributed-systems case study in the same product.

Sin Pluma connects a useful domain, deliberate service boundaries, secure sessions, specialized storage, and automated high availability without asking readers or writers to think in containers.

Technical deep dives

Follow the project beyond the landing page. Each publication focuses on one architectural boundary, implementation decision, or operational lesson.

Vault publications

  • How Sin Pluma's architecture fits together
    8 min read · #architecture #docker #microservices #docker #python #react #sql

    A detailed walkthrough of every service in the Sin Pluma system, how Docker networks isolate them, the data flows behind key operations, and the architectural strengths and constraints.

  • Engineering the Sin Pluma React frontend
    11 min read · #react #redux #slate-js #frontend

    A detailed look at how Sin Pluma's React SPA is structured: Redux state, HOC-based auth guards, Axios interceptors, Slate.js rich text editor, and backend service integration patterns.

  • Designing the Sin Pluma Flask REST API
    10 min read · #python #flask #rest api

    How Sin Pluma's Flask API is structured: the app factory pattern, blueprint organization, full endpoint inventory, Marshmallow validation, and integrations with MySQL, Redis, and MinIO.

  • High availability with MySQL InnoDB Cluster in Sin Pluma
    10 min read · #databases #MySQL #InnoDB #cluster

    How Sin Pluma bootstraps a three-node MySQL InnoDB Cluster, handles automatic failover, manages the schema, and what production hardening looks like beyond the demo environment.

  • JWT in practice: access, refresh, and revocation in Sin Pluma
    10 min read · #JWT #authentication #security

    A detailed walkthrough of Sin Pluma's JWT implementation: token structure, full lifecycle, the Redis blacklist, the Axios refresh queue, storage trade-offs, and security best practices.