BorrowHood: Every Garage Becomes a Rental Shop
Source: Dev.to
The Community
My father Albert was a hand‑shovel landscaper in Switzerland from 1960 – 2020.
His garage held 500 tools. When he passed, they sat there collecting dust.
His neighbours still needed shovels, rakes, and chainsaws – they just didn’t know where to look.
- Craigslist is a wasteland.
- Facebook Marketplace is a data farm.
Neither cares about your neighbourhood.
BorrowHood is for real neighbourhoods – the people on your street who own a drill you need once, a stand‑mixer sitting idle, a welder gathering dust.
- Every user is a workshop.
- Every garage becomes a rental shop.
- Every kitchen becomes a bakery.
The community I built for: neighbours who share things instead of buying things they’ll use once.
A full‑stack community rental and sharing platform where people list their under‑used tools, kitchen gear, equipment, and skills – and neighbours borrow, rent, or trade. No middle‑men. No fees. No algorithm deciding who sees what.
Live demo:
angel / helix_pass (or sign‑in with GitHub)
Note: Your browser will show a certificate warning on first visit – the server uses a self‑signed TLS certificate (no domain, just an IP). Click Advanced > Proceed to site. It only happens once.
Eight ways to share
| Mode | Description |
|---|---|
| Rent | Borrow a drill for the weekend |
| Sell | Off‑load gear you don’t need |
| Give Away | Free items, simplified claim flow, earns Generous Neighbor badge |
| Auction | Competitive bidding with reserve prices and anti‑snipe protection |
| Commission | Custom made‑to‑order items |
| Service | Plumbing, tutoring, bike repair |
| Training | Teach a neighbour your skill |
| Offer | Name your price / make an offer |
Full rental lifecycle
- Reputation that means something
- Bilingual from day one
Feature matrix
| Feature | What it does |
|---|---|
| Workshop profiles | Every user is a shop with skills, CEFR language levels, social links |
| Auction system | Timed bidding, auto‑outbid notifications, reserve prices, bid increments |
| Giveaway flow | Free items, simplified claim, no return dates, Generous Neighbor badge |
| Lockbox codes | One‑time 8‑character codes for contactless pickup and return |
| Dispute resolution | 3‑step flow: file → respond → resolve (8 reasons, 7 resolution types) |
| Security deposits | Hold at pickup, release on return, forfeit on damage |
| Community helpboard | Post requests (“Need a ladder this Saturday”), get replies, track status |
| AI‑assisted listings | Generate descriptions and images via Pollinations API |
| Notification bell | 15 event types with optional Telegram bot forwarding |
| GitHub OAuth | Sign in with GitHub via Keycloak identity provider |
| Onboarding wizard | 3‑step profile setup for new users |
Video series (5 parts) – every feature live on a production server
| Episode | Focus |
|---|---|
| EP1 | Giveaway Flow – free items, simplified claim |
| EP2 | Rental Flow – full lifecycle from request to review |
| EP3 | Auction System – competitive bidding with anti‑snipe |
| EP4 | Badge System – 15 badges, 5 reputation tiers |
| EP5 | Multilingual Live Switch – one click, every label, instant |
Live demo: (same credentials as above)
GitHub:
Metrics
| Metric | Count |
|---|---|
| Python source lines | 10,625 |
| HTML template lines | 6,244 |
| Test lines | 2,220 |
| SQLAlchemy models | 32 |
| Typed enums | 37 |
| REST API endpoints | 109 |
| Automated tests | 250 (201 without DB) |
| Puppeteer screen tests | 52 edge‑case checks |
| i18n strings | 476 (EN + IT) |
| Seed data items | 119 across 21 categories |
250 automated tests across 23 test files (201 pass without any database). Rental state‑machine alone has 26 tests covering every valid and invalid transition. Plus 52 Puppeteer edge‑case screen tests covering XSS probes, pagination boundaries, mobile viewport, gallery behaviour, and API boundary conditions. The i18n completeness test ensures every English key has an Italian translation – add a key to en.json without adding it to it.json and the test suite fails.
Technology stack
| Layer | Technology |
|---|---|
| Backend | FastAPI + SQLAlchemy 2.0 async + asyncpg |
| Auth | Keycloak OIDC (RS256 JWT, 6 roles, GitHub IDP) |
| Database | PostgreSQL 17 |
| Cache | Redis 7 |
| Queue | RabbitMQ 3.13 |
| Frontend | Jinja2 SSR + Tailwind CSS (CDN) + Alpine.js (CDN) |
| Payments | PayPal REST API v2 |
| AI | Pollinations API (image + text generation) |
| Bot | Telegram Bot API |
| Tests | pytest + pytest‑asyncio |
| Hosting | Hetzner CX32 – 4 vCPU, 8 GB RAM, €7.59 / month |
Browser --> Caddy (TLS) --> FastAPI (uvicorn)
|
+-- 18 Jinja2 templates (i18n: EN/IT)
+-- 104 API endpoints (JSON)
+-- Keycloak OIDC (6 roles, GitHub OAuth)
+-- PostgreSQL (31 models, UUID PKs)
+-- Redis + RabbitMQ + MinIO
Development story
Claude Code (Opus 4.6) was my co‑pilot throughout. Not a code generator I copied from – a pair programmer I worked with.
What worked well
| Area | Highlights |
|---|---|
| Scaffolding models & routers | Describing a feature like “auction system with reserve prices and anti‑snipe” produced a working first draft with the right SQLAlchemy relationships |
| Test generation | 250 pytest tests + 52 Puppeteer edge‑case screen tests, most written by describing the behavior I wanted tested |
| Edge‑case testing | Puppeteer tests that probe XSS, pagination boundaries, invalid enums, mobile viewport, broken images – found a real 500 error on invalid listing‑type filter |
| i18n coverage | Translating 476 strings to Italian with context‑appropriate translations (not Google‑Translate quality) |
| Debugging production issues | Traced an OAuth redirect loop to a missing port number in an env var, across 4 different config files |
What I still did myself
- Architecture decisions (Keycloak over simple JWT, server‑rendered over SPA)
- UI/UX design (every page layout, colour choices, the “workshop‑as‑identity” concept)
- Production deployment & ops (Docker Compose, Caddy config, Hetzner setup)
- Manual testing on a real server with real users
The commit history tells the story. Every feature was built iteratively, with feedback from neighbours who actually needed a drill, a ladder, or a lesson in Italian.
vely — scaffold, test, deploy, fix, repeat.
Built from a camper van in Trapani, Sicily. The idea came from my father’s garage — 500 tools, no neighbors who knew they existed. BorrowHood is the platform I wish he’d had.
Open source. No platform fees. Forever.
“Every neighborhood has a garage like his.”