- Move bigmind/ -> mcp/bigmind/ - Move webscraper/ -> mcp/webscraper/ - Move mss-failsafe/ -> java/mss-failsafe/ - Move Wellmann-Shop/ -> java/wellmann-shop/ (normalize to kebab-case) - Add .roo/ IDE config files to tracking - Add plans/REPO_STRATEGY.md (monorepo strategy document) - Expand .gitignore: Java/Maven, Node/TS, coverage, uv.lock - Rewrite README.md as navigation index - Update .roo/mcp.json webscraper path to mcp/webscraper/
10 KiB
Monorepo Strategy — Patrick's Homelab Workshop
Written: 2026-04-04 | Authors: Patrick + Lumen
1. Why This Document Exists
The repo started as pi_mcps — a home for Python MCP servers. Then two older Java web projects arrived: mss-failsafe and Wellmann-Shop. This is not an accident — it's the beginning of a pattern: a single place to keep all of Patrick's personal engineering work, regardless of language.
This document defines the strategy for the repo so that both of us — human and AI — can navigate it without confusion now and in two years from now.
2. Philosophy: Polyglot Monorepo, Not a Dump
A monorepo is not code colocation. The key principle from monorepo.tools: projects must have well-defined relationships and clear boundaries. What we are building is closer to a workshop — a curated collection of distinct tools and projects under one roof, organized by language/purpose, each independently buildable and deployable.
We are NOT:
- Sharing dependencies across Java and Python (they live in entirely separate ecosystems)
- Using a monorepo build tool like Nx or Turborepo (overkill for a personal homelab)
- Creating a monolith (each project is independently deployable)
We ARE:
- Keeping one git history (single place to look for all changes)
- Using a clear directory taxonomy to signal what kind of thing each project is
- Making it easy for an AI (Lumen) or a new contributor to orient quickly
- Preventing repo sprawl — one Gitea repo instead of a dozen
3. Repo Rename: pi_mcps → workshop
The name pi_mcps no longer describes what the repo contains. It was named for Raspberry Pi MCP servers — neither of which is accurate anymore (Fedora homelab, not Pi; more than just MCP servers).
Proposed new name: workshop
Why workshop?
- Neutral, language-agnostic
- Conveys personal creative output (not corporate, not framework-specific)
- Short, memorable
- Maps well to
http://192.168.188.119:30008/pplate/workshop
Action required:
- Rename the Gitea repo at
http://192.168.188.119:30008/pplate/pi_mcps→workshop - Update the local remote:
git remote set-url origin http://192.168.188.119:30008/pplate/workshop.git - The local folder on disk can stay as
~/pi_mcps/or be renamed to~/workshop/— Patrick's choice. The folder name and repo name do not need to match.
4. Directory Taxonomy
Every directory at the repo root belongs to one of three categories:
| Category | Directory | Purpose |
|---|---|---|
| Language group | mcp/ |
Python MCP servers — FastMCP, uv, pytest |
| Language group | java/ |
Java web projects — Maven, Jakarta EE |
| Tooling/Config | .roo/ |
IDE config, Roo mode rules, MCP wiring |
| Tooling/Config | plans/ |
Architecture plans, assessments, strategy docs |
| Root files | README.md, .gitignore |
Navigation index + polyglot ignores |
Future language groups (when they arrive):
| Directory | Purpose |
|---|---|
ts/ |
TypeScript MCP servers or web frontends |
go/ |
Go utilities or services |
scripts/ |
Shell/Python one-off automation |
4.1 Full Target Structure
workshop/
├── mcp/ # Python MCP servers
│ ├── bigmind/ # BigMind persistent memory server
│ │ ├── src/server.py
│ │ ├── bigmind/ # library code
│ │ ├── tests/
│ │ ├── pyproject.toml
│ │ └── run.sh
│ └── webscraper/ # Web scraping MCP server
│ ├── src/server.py
│ ├── tests/
│ ├── pyproject.toml
│ └── run.sh
│
├── java/ # Java web projects
│ ├── mss-failsafe/ # MSS Failsafe (Java EE multi-module, WildFly)
│ │ ├── mssfailsafeWeblayer/
│ │ ├── userManagement/
│ │ └── pom.xml
│ └── wellmann-shop/ # Wellmann Shop (JSF/PrimeFaces, Java 8, MySQL)
│ ├── src/
│ └── pom.xml
│
├── plans/ # Architecture plans and strategy docs
│ └── REPO_STRATEGY.md # this file
│
├── .roo/ # Roo Code IDE configuration
│ ├── mcp.json # MCP server wiring (paths updated post-move)
│ └── rules-*/ # Per-mode Roo rules
│
├── .gitignore # Polyglot: Python + Java + Node + OS
└── README.md # Navigation index (the front door)
5. Naming Conventions
Consistency matters — both for humans and for AI tools reading directory listings.
| Rule | Convention | Rationale |
|---|---|---|
| Directory names | kebab-case |
Unix-friendly, consistent across all languages |
| Java project dirs | kebab-case matching Maven artifactId |
No surprise mapping needed |
| Python package dirs | kebab-case at group level, snake_case inside for Python modules |
PEP 8 inside, Unix outside |
| Plan files | UPPER_SNAKE.md in plans/ |
Stands out from code files |
| README per project | Required | Each project is independently comprehensible |
Normalization needed:
Wellmann-Shop/→java/wellmann-shop/(lowercase the W, move underjava/)mss-failsafe/→java/mss-failsafe/(already correct name, just needs moving)bigmind/→mcp/bigmind/webscraper/→mcp/webscraper/
6. Language-Specific Rules
6.1 Python (mcp/)
- Package manager: uv (already standardized)
- Framework: FastMCP for all MCP servers
- Testing: pytest with
pytest-mockandpytest-cov - Each server is an independent Python package with its own
pyproject.tomland.venv - No shared
requirements.txtat root — dependency isolation is a feature - Run pattern:
cd mcp/bigmind && ./run.sh
6.2 Java (java/)
- Build tool: Maven (both existing projects use it)
- Java version: Currently Java 8 (Wellmann-Shop) and unspecified (mss-failsafe — legacy NetBeans project)
- Future Java projects should target Java 21+ (current LTS)
- Each project has its own
pom.xml— no shared parent POM at root (cross-language root POMs are an antipattern) - Target servers: WildFly / Payara / GlassFish (Jakarta EE)
- No shared Maven
settings.xmlneeded — use standard~/.m2/settings.xml
6.3 Future: TypeScript (ts/)
- Package manager: npm or pnpm
- Framework: FastMCP (TypeScript flavor) for MCP servers
- Each project has its own
package.json
7. .gitignore Strategy
The root .gitignore must cover all languages in the repo. Currently it only covers Python. After the reorganization, it must also cover:
To add:
# Java / Maven
target/
*.class
*.war
*.jar
*.ear
*.nar
.classpath
.project
.settings/
nb-configuration.xml
nbactions.xml
*.iml
# Node / TypeScript (future)
node_modules/
dist/
*.js.map
package-lock.json
# Test coverage
.coverage
coverage.xml
htmlcov/
Note: nb-configuration.xml is NetBeans IDE config — already present in mss-failsafe/ and Wellmann-Shop/. It should be in .gitignore for new projects but is intentionally tracked here since it carries build configuration for legacy projects.
8. IDE Wiring: .roo/mcp.json After Move
The webscraper path in .roo/mcp.json currently points to /home/pplate/pi_mcps/webscraper. After moving to mcp/webscraper/, it must be updated:
Before:
"webscraper": {
"args": ["run", "--directory", "/home/pplate/pi_mcps/webscraper", "src/server.py"]
}
After:
"webscraper": {
"args": ["run", "--directory", "/home/pplate/pi_mcps/mcp/webscraper", "src/server.py"]
}
(If the local folder is also renamed to workshop/, the path changes to /home/pplate/workshop/mcp/webscraper)
The same applies to any external MCP configs (e.g., IntelliJ/PyCharm mcp.json files stored outside this repo).
9. README.md — The Front Door
The root README.md should function as a navigation index, not a tutorial. Readers (Patrick, Lumen, future contributors) should land there and know exactly where to go within 10 seconds.
Structure:
# Workshop — Patrick Plate's Homelab Monorepo
## What's Here
[table: project name | language | description | status]
## MCP Servers (mcp/)
[short list with links]
## Java Projects (java/)
[short list with links]
## Plans & Architecture
[link to plans/]
## Gitea
[link to homelab Gitea]
10. Migration Plan (Ordered Steps)
Step 1: Rename Gitea repo pi_mcps → workshop (Gitea UI)
Step 2: Update local git remote URL
Step 3: Move mcp/bigmind ← bigmind/
Step 4: Move mcp/webscraper ← webscraper/
Step 5: Move java/mss-failsafe ← mss-failsafe/
Step 6: Move java/wellmann-shop ← Wellmann-Shop/ (normalize name)
Step 7: Update .roo/mcp.json webscraper path
Step 8: Update any external MCP configs pointing to old paths
Step 9: Expand .gitignore with Java + Node patterns
Step 10: Rewrite root README.md as navigation index
Step 11: git add -A && git commit -m "chore: reorganize into polyglot monorepo structure"
Step 12: git push origin master
Important: Git tracks renames as move+add. Using git mv preserves file history. Use it for each moved file/directory.
11. What We Are NOT Doing
It's worth being explicit about choices we considered and rejected:
| Considered | Decision | Reason |
|---|---|---|
| Separate repo per project | Rejected | Polyrepo tax: fragmented history, harder for AI context |
| Nx / Turborepo monorepo tools | Rejected | Overkill for personal homelab; adds tooling complexity without benefit |
| Shared Maven parent POM at root | Rejected | Java-specific tooling at repo root would confuse Python tooling |
Keeping pi_mcps name |
Reconsidered | The name no longer describes the content; workshop is future-proof |
src/ at root with language subdirs |
Rejected | Less clear at a glance than top-level mcp/, java/ groupings |
12. Visual Overview
graph TD
Root[workshop/] --> MCP[mcp/]
Root --> Java[java/]
Root --> Plans[plans/]
Root --> Roo[.roo/]
Root --> GI[.gitignore]
Root --> RM[README.md]
MCP --> BM[bigmind/]
MCP --> WS[webscraper/]
MCP --> FutMCP[future MCP servers...]
Java --> MSS[mss-failsafe/]
Java --> WSh[wellmann-shop/]
Java --> FutJava[future Java projects...]
Plans --> STRAT[REPO_STRATEGY.md]
Plans --> FutPlans[future plans...]
This document is the living reference for how this repo is organized. Update it when structure changes.