
Hermann Sebastian Schultz is a painter. Minimalist abstraction. His canvases are quiet-stripped of narrative, gesture reduced to whisper.
When he asked me to build his online gallery, the brief was 6 words: "Make it as quiet as my work."
I built a bespoke CMS from scratch using Python Flask. No WordPress. No Squarespace. No templates.
This is the story of a project that taught me the discipline of doing less.
The Problem with Everything Else
Hermann tried the usual suspects: WordPress, Wix, Cargo Collective. All felt wrong.
Too noisy. Too many features he'd never use. Analytics dashboards. SEO plugins. Social media integrations. Newsletter popups. Cookie banners. A/B testing frameworks.
None of it matched the silence of his paintings.
He showed me his ideal: "A website that feels like walking into an empty gallery. Just you and the work. Nothing else."
What I Built
The Admin Interface
Radically stripped. Three fields:
- Upload image
- Enter dimensions (cm)
- Enter year
That's it. Hit publish.
No categories. No tags. No alt text fields. No SEO meta descriptions. The system auto-generates everything from the filename and EXIF data.
The Frontend
- Full-screen image display (no header, no footer, no navigation chrome)
- Arrow keys to browse (previous/next)
- Escape to close
- That's the entire interface
No analytics. No tracking. No newsletter signup. The website exists to show paintings. Period.
The Technical Decisions
Why Flask?
Because it's minimal. A Python micro-framework that does nothing unless you explicitly ask it to.
No built-in admin panel. No ORM assumptions. No "convention over configuration" magic. Just HTTP routing and template rendering.
Perfect for this project.
Why SQLite?
Single-file database. Zero configuration. Runs on a single droplet with no external dependencies.
Overkill? Maybe. But it works.
Why No JavaScript?
The gallery pages are pure HTML + CSS. No frameworks. No build process. No npm dependencies.
Loads in under 1 second globally. Works with JavaScript disabled. Accessible to screen readers by default.
The Hard Parts
Resisting Feature Creep
Every week Hermann would say: "What if we added [some feature]?"
- What if visitors could download hi-res images?
- What if there was an email subscription?
- What if we tracked which paintings get the most views?
I said no to all of it. Every addition would make the site heavier. My job was to protect the simplicity, even from the client.
The Maintenance Burden
Bespoke means no security team. I'm responsible for every dependency update, every CVE patch.
Flask and Pillow (image library) need manual updates. I've automated security scans (Dependabot) but the "deploy update" button is mine to press.
If I get hit by a bus, this site goes dark. That's the trade-off.
Knowing When to Stop
The hardest part was shipping it. I kept finding tiny details to improve-image compression ratios, CSS grid alignment, loading animations.
Hermann finally said: "It's done. Ship it."
So I did.
Where It Is Now
The HS Schultz gallery has been live since October 2024. Zero downtime. Zero bugs reported. Loads fast. Works everywhere.
Hermann's feedback: "I forget the website is there. It feels like the paintings are just... floating."
That's the highest compliment software can receive-to be forgotten.
What I Learned
Good Design is Subtraction
Every feature I didn't build made the site better. Minimalism isn't about aesthetics-it's about discipline.
Bespoke Has a Cost
This project makes no revenue for me. Hermann pays hosting costs. That's it.
I spent weeks building something that could've been a Squarespace template. The ROI is negative in dollars, positive in lessons learned.
Some Projects Are Worth Doing Anyway
Not everything needs to scale or generate revenue. Sometimes you build things because they should exist.
This gallery proves that digital luxury isn't feature richness-it's ruthless simplicity.