A gardening blog for Kate Foale, featuring rich text editing with Action Text and image galleries with Active Storage. The site showcases "Charnwood", a cottage garden in Nottinghamshire, UK.
Live site: katescuttings.net
- Ruby 3.4.8
- PostgreSQL 16
No Node.js required - uses importmap-rails for JavaScript.
bundle install # Install dependencies
rails db:setup # Setup database
bin/rails server # Start server at localhost:3000Admin access (/admin) auto-logs in during development.
The site is deployed to Hetzner using Kamal with Cloudflare CDN.
kamal deploy # Manual deploy
kamal console # Rails console on production
kamal logs # Tail production logs
kamal shell # SSH into the app containerPushes to the main branch automatically deploy via GitHub Actions.
| Component | Technology |
|---|---|
| Hosting | Hetzner VPS |
| CDN | Cloudflare |
| Deployment | Kamal 2 with kamal-proxy |
| Database | PostgreSQL 16 (Docker container) |
| Assets | Propshaft + importmap-rails |
| JavaScript | Hotwire (Turbo + Stimulus) |
| Rich Text | Action Text with Trix editor + paste cleanup |
| Images | Active Storage (local disk) |
| Auth | Google OAuth (domain-restricted) |
| Analytics | Plausible |
- Blog posts with photo galleries and lightbox viewer
- Full gallery page (
/gallery) with masonry layout and month filters - RSS feed (
/blogs.rss) - JSON-LD structured data for SEO
- Open Graph and Twitter Card meta tags
- Sitemap (
/sitemap.xml) - Static pages: About Kate, The Garden, The Book
The site follows WCAG 2.1 AA guidelines with automated testing via axe-core:
- Skip-to-main-content link for keyboard users
- Visible focus indicators on all interactive elements
- ARIA labels on navigation and icon buttons
- Semantic HTML5 landmarks (header, nav, main, footer)
- Proper heading hierarchy
- Alt text on all images
The Trix editor includes automatic cleanup for content pasted from Microsoft Word. When Word HTML is detected, it strips:
- Microsoft-specific classes (
MsoNormal) and styles (mso-*) - Office namespace tags (
<o:p>,<w:*>) - Conditional comments (
<!--[if gte mso 9]>) - Empty wrapper elements
bin/rails test # Run unit/integration tests
bin/rails test:system # Run accessibility tests (axe-core)JavaScript tests run in the browser:
- Open
test/javascript/word_html_cleaner_test.htmlin a browser
GitHub Actions runs on pull requests:
- Rails tests
- Database consistency checks
- Security audit (bundler-audit)