Compare commits
2 Commits
main
...
copilot/co
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0d52b35568 | ||
|
|
5c793f44e9 |
12
.gitignore
vendored
Normal file
12
.gitignore
vendored
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
# Operating system
|
||||
.DS_Store
|
||||
Thumbs.db
|
||||
|
||||
# Editors and IDEs
|
||||
.idea/
|
||||
.vscode/
|
||||
*.swp
|
||||
*.swo
|
||||
|
||||
# Logs
|
||||
*.log
|
||||
36
CONTRIBUTING.md
Normal file
36
CONTRIBUTING.md
Normal file
|
|
@ -0,0 +1,36 @@
|
|||
# Contributing
|
||||
|
||||
Thank you for contributing to the Family Hoppe personal repository! Please follow these guidelines to keep things tidy.
|
||||
|
||||
## Branching
|
||||
|
||||
- Work on a dedicated branch, never directly on `main`.
|
||||
- Use descriptive branch names, e.g. `feature/add-recipe-tracker` or `fix/typo-in-docs`.
|
||||
|
||||
## Commits
|
||||
|
||||
- Write short, meaningful commit messages in the imperative mood.
|
||||
✅ `Add holiday photo script`
|
||||
❌ `added stuff`
|
||||
- Keep commits focused – one logical change per commit.
|
||||
|
||||
## Pull Requests
|
||||
|
||||
1. Fork / branch off `main`.
|
||||
2. Make your changes and add or update tests where relevant.
|
||||
3. Ensure all tests pass before opening the PR.
|
||||
4. Fill in the PR description with a brief summary of what changed and why.
|
||||
5. Request a review from at least one other family member.
|
||||
|
||||
## Code Style
|
||||
|
||||
- Prefer clear, readable code over clever one-liners.
|
||||
- Add comments when the *why* is not obvious from the code itself.
|
||||
- Follow the conventions of whichever language you are using.
|
||||
|
||||
## Reporting Issues
|
||||
|
||||
Open a GitHub Issue with:
|
||||
- A clear title
|
||||
- Steps to reproduce (if applicable)
|
||||
- Expected vs. actual behaviour
|
||||
21
LICENSE
Normal file
21
LICENSE
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
MIT License
|
||||
|
||||
Copyright (c) 2026 Family Hoppe
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
44
README.md
44
README.md
|
|
@ -1,9 +1,39 @@
|
|||
# Hoppe.home — company profile
|
||||
# Personal Repository (Family Hoppe)
|
||||
|
||||
Source of the page published at **https://hoppe.mywire.org/home/**.
|
||||
This repository is the shared personal space for Family Hoppe projects, notes, and small experiments.
|
||||
|
||||
Restructured 2026-08-18. This repo previously held two pages: `index.html`
|
||||
(Joanna's personal profile) and `about.html` (the Hoppe.home profile). The
|
||||
Joanna page moved to `Hoppe.home-Public/joanna`, and the Hoppe.home profile —
|
||||
formerly `about.html` — is now this repo's `index.html`, so one repo owns
|
||||
exactly one published page.
|
||||
## Purpose
|
||||
|
||||
- Keep family-related project files in one place
|
||||
- Track changes over time with Git
|
||||
- Provide a clean base for future additions
|
||||
|
||||
## Repository Structure
|
||||
|
||||
```
|
||||
personal/
|
||||
├── docs/ # Guides, notes, and decision records
|
||||
├── src/ # Source code and scripts
|
||||
├── tests/ # Tests for code in src/
|
||||
├── CONTRIBUTING.md
|
||||
├── LICENSE
|
||||
└── README.md
|
||||
```
|
||||
|
||||
## Current Status
|
||||
|
||||
- Repository initialized with baseline project structure
|
||||
- Basic documentation in place
|
||||
- Standard ignore rules and license added
|
||||
|
||||
## Getting Started
|
||||
|
||||
1. Clone the repository
|
||||
2. Browse `docs/` for guidance or add documentation there
|
||||
3. Place source code under `src/` and matching tests under `tests/`
|
||||
4. Commit your changes with clear messages
|
||||
5. See [CONTRIBUTING.md](CONTRIBUTING.md) before opening a pull request
|
||||
|
||||
## Notes
|
||||
|
||||
See `CONTRIBUTING.md` for branching, commit, and pull-request conventions.
|
||||
|
|
|
|||
Binary file not shown.
|
Before Width: | Height: | Size: 121 KiB |
11
docs/README.md
Normal file
11
docs/README.md
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
# Documentation
|
||||
|
||||
This directory contains documentation for Family Hoppe projects.
|
||||
|
||||
## Structure
|
||||
|
||||
Add topic-specific markdown files here as projects grow, for example:
|
||||
|
||||
- `how-to-*.md` – guides and how-tos
|
||||
- `decisions/` – architecture / decision records
|
||||
- `notes/` – free-form notes and ideas
|
||||
253
index.html
253
index.html
|
|
@ -1,253 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Hoppe.home — AI Power House & Think Tank</title>
|
||||
<meta name="description" content="Hoppe.home — a self-hosted AI power house and think tank, run as a family enterprise with the engineering and governance discipline of a much larger organization.">
|
||||
<meta property="og:type" content="website">
|
||||
<meta property="og:title" content="Hoppe.home — AI Power House & Think Tank">
|
||||
<meta property="og:description" content="A family enterprise, run like the big ones — self-hosted AI, real infrastructure, and a governed model for scaling AI capability without losing control of it.">
|
||||
<meta property="og:url" content="https://hoppe.mywire.org/home/">
|
||||
<meta property="og:image" content="https://hoppe.mywire.org/home/assets/joanna-hoppe-pixel.jpg">
|
||||
<meta name="twitter:image" content="https://hoppe.mywire.org/home/assets/joanna-hoppe-pixel.jpg">
|
||||
<meta name="twitter:card" content="summary">
|
||||
<link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 64 64'%3E%3Crect width='64' height='64' rx='16' fill='%23c22236'/%3E%3Ctext x='32' y='45' font-family='Arial, sans-serif' font-weight='800' font-size='36' fill='white' text-anchor='middle'%3EH%3C/text%3E%3C/svg%3E">
|
||||
<style>
|
||||
:root {
|
||||
--bg-top: #0d2340;
|
||||
--bg-mid: #0a1626;
|
||||
--bg-low: #060c16;
|
||||
--bg-floor: #04070d;
|
||||
--card-bg: rgba(20, 28, 45, 0.72);
|
||||
--card-border: rgba(255, 255, 255, 0.09);
|
||||
--text: #f4f6fb;
|
||||
--text-muted: #a3b0c4;
|
||||
--blue: #3f8cff;
|
||||
--blue-soft: rgba(63, 140, 255, 0.14);
|
||||
--blue-grad: linear-gradient(135deg, #4d95ff 0%, #1f4fb0 100%);
|
||||
--red: #ff5069;
|
||||
--chip-bg: rgba(255, 255, 255, 0.05);
|
||||
--shadow: 0 20px 50px rgba(0, 0, 0, 0.5), 0 1px 0 rgba(255, 255, 255, 0.04) inset;
|
||||
}
|
||||
* { box-sizing: border-box; }
|
||||
html { scroll-behavior: smooth; }
|
||||
body {
|
||||
margin: 0;
|
||||
color: var(--text);
|
||||
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
|
||||
line-height: 1.6;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
background-color: var(--bg-floor);
|
||||
background-image:
|
||||
radial-gradient(1100px 620px at 50% -8%, var(--bg-top) 0%, transparent 60%),
|
||||
linear-gradient(180deg, var(--bg-mid) 0%, var(--bg-low) 45%, var(--bg-floor) 100%);
|
||||
background-attachment: fixed, fixed;
|
||||
background-repeat: no-repeat, no-repeat;
|
||||
}
|
||||
.wrap { max-width: 980px; margin: 0 auto; padding: 0 24px; }
|
||||
a { color: var(--blue); }
|
||||
|
||||
.brand-row { display: flex; align-items: center; gap: 14px; margin-bottom: 40px; }
|
||||
.logo-mark {
|
||||
flex: none; width: 52px; height: 52px; border-radius: 14px;
|
||||
background: var(--blue-grad); display: flex; align-items: center; justify-content: center;
|
||||
font-weight: 800; font-size: 26px; color: #fff;
|
||||
box-shadow: 0 0 0 1px rgba(255,255,255,0.08) inset, 0 10px 26px rgba(31, 79, 176, 0.45), 0 0 46px rgba(31, 79, 176, 0.28);
|
||||
}
|
||||
.brand-name { font-weight: 800; font-size: 16px; letter-spacing: -0.01em; }
|
||||
.brand-tag { font-size: 11px; text-transform: uppercase; letter-spacing: 0.14em; color: var(--blue); font-weight: 700; margin-top: 2px; }
|
||||
|
||||
header.hero { padding: 64px 0 48px; border-bottom: 1px solid var(--card-border); }
|
||||
.eyebrow { text-transform: uppercase; letter-spacing: 0.14em; font-size: 12px; font-weight: 700; color: var(--blue); margin: 0 0 14px; }
|
||||
h1 { font-size: clamp(2rem, 5vw, 3.1rem); line-height: 1.1; margin: 0 0 14px; letter-spacing: -0.02em; color: #fff; }
|
||||
h1 .accent { color: var(--red); }
|
||||
.headline { font-size: clamp(1.05rem, 2.4vw, 1.3rem); color: var(--text-muted); margin: 0 0 24px; max-width: 700px; }
|
||||
.meta-row { display: flex; flex-wrap: wrap; gap: 10px; }
|
||||
.chip { font-size: 13px; background: var(--chip-bg); color: var(--text-muted); padding: 6px 12px; border-radius: 999px; border: 1px solid var(--card-border); }
|
||||
|
||||
section { padding: 56px 0; border-bottom: 1px solid var(--card-border); }
|
||||
section:last-of-type { border-bottom: none; }
|
||||
h2 { font-size: 12px; text-transform: uppercase; letter-spacing: 0.14em; color: var(--blue); margin: 0 0 24px; font-weight: 700; }
|
||||
.lede { font-size: 17px; max-width: 740px; color: var(--text); }
|
||||
|
||||
.grid-2 { display: grid; grid-template-columns: 1fr 1fr; gap: 18px; }
|
||||
.grid-4 { display: grid; grid-template-columns: repeat(4, 1fr); gap: 18px; }
|
||||
@media (max-width: 760px) { .grid-2, .grid-4 { grid-template-columns: 1fr; } }
|
||||
.card {
|
||||
background: var(--card-bg); border: 1px solid var(--card-border); border-radius: 12px;
|
||||
padding: 24px; box-shadow: var(--shadow); backdrop-filter: blur(6px);
|
||||
}
|
||||
.card h3 { margin: 0 0 8px; font-size: 15.5px; color: #fff; }
|
||||
.card p { margin: 0; font-size: 14px; color: var(--text-muted); }
|
||||
.card .stat { font-size: 28px; font-weight: 800; color: var(--blue); margin-bottom: 6px; letter-spacing: -0.01em; }
|
||||
.card .stat-label { font-size: 13px; color: var(--text-muted); }
|
||||
|
||||
.lead-list { list-style: none; padding: 0; margin: 0; display: grid; gap: 22px; }
|
||||
.lead-item { display: flex; gap: 16px; align-items: flex-start; }
|
||||
.lead-num {
|
||||
flex: none; width: 36px; height: 36px; border-radius: 10px;
|
||||
background: var(--blue-soft); border: 1px solid rgba(63, 140, 255, 0.3);
|
||||
display: flex; align-items: center; justify-content: center;
|
||||
font-weight: 800; font-size: 14px; color: var(--blue);
|
||||
}
|
||||
.lead-item h3 { margin: 0 0 6px; font-size: 16px; color: #fff; }
|
||||
.lead-item p { margin: 0; font-size: 14.5px; color: var(--text-muted); max-width: 640px; }
|
||||
|
||||
.factory-note {
|
||||
margin-top: 24px; padding: 22px 24px; background: var(--card-bg);
|
||||
border: 1px solid var(--card-border); border-radius: 12px; box-shadow: var(--shadow); backdrop-filter: blur(6px);
|
||||
}
|
||||
.factory-note h3 { margin: 0 0 8px; font-size: 14px; color: #fff; letter-spacing: 0.01em; }
|
||||
.factory-note p { margin: 0; font-size: 14.5px; color: var(--text-muted); }
|
||||
.factory-note p + p { margin-top: 10px; }
|
||||
|
||||
blockquote {
|
||||
margin: 0; padding: 20px 24px; border-left: 3px solid var(--red);
|
||||
background: var(--card-bg); border-radius: 0 12px 12px 0; font-size: 15px; color: var(--text);
|
||||
}
|
||||
blockquote footer { margin-top: 10px; font-size: 12.5px; color: var(--text-muted); }
|
||||
|
||||
footer.site-footer { padding: 48px 0 64px; text-align: center; color: var(--text-muted); font-size: 13px; }
|
||||
footer.site-footer a { color: var(--text-muted); text-decoration: none; }
|
||||
footer.site-footer a:hover { color: var(--blue); }
|
||||
.footer-links { display: flex; justify-content: center; gap: 20px; margin-bottom: 16px; flex-wrap: wrap; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<div class="wrap" style="padding-top: 20px;">
|
||||
<a href="https://hoppe.mywire.org/joanna/" style="font-size: 13px; color: var(--text-muted); text-decoration: none;">← Joanna — Resident AI Operator, Hoppe.home</a>
|
||||
</div>
|
||||
|
||||
<header class="hero">
|
||||
<div class="wrap">
|
||||
<div class="brand-row">
|
||||
<div class="logo-mark">H</div>
|
||||
<div>
|
||||
<div class="brand-name">Hoppe.home</div>
|
||||
<div class="brand-tag">AI Power House · Think Tank</div>
|
||||
</div>
|
||||
</div>
|
||||
<p class="eyebrow">Hoppe.home</p>
|
||||
<h1>A family enterprise,<br>run like <span class="accent">the big ones</span>.</h1>
|
||||
<p class="headline">Hoppe.home is a self-hosted AI power house and think tank — a real, production-grade platform designed, built and operated end-to-end by a family, with the engineering and governance discipline normally reserved for much larger organizations.</p>
|
||||
<div class="meta-row">
|
||||
<span class="chip">Family enterprise, not a company</span>
|
||||
<span class="chip">Self-hosted, no cloud lock-in</span>
|
||||
<span class="chip">Bremen, Germany</span>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<section id="what-we-are">
|
||||
<div class="wrap">
|
||||
<h2>What We Are</h2>
|
||||
<p class="lede">Most people experimenting with AI at home are running a chatbot in a browser tab. Hoppe.home is a genuine operating environment: a resident AI agent working as a real partner rather than a bolted-on assistant, a private knowledge graph that functions as institutional memory, a full self-managed IT estate, and a growing portfolio of production applications actually used every day — not demos, not proofs of concept.</p>
|
||||
<p class="lede" style="margin-top: 16px;">We didn't set out to build a "smart home." We set out to build the kind of disciplined, governed, well-documented technology operation you'd expect to find behind a real company — and then applied it at family scale, for a family's actual benefit.</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section id="where-we-lead">
|
||||
<div class="wrap">
|
||||
<h2>Where We Lead</h2>
|
||||
<ul class="lead-list">
|
||||
<li class="lead-item">
|
||||
<div class="lead-num">1</div>
|
||||
<div>
|
||||
<h3>Governed autonomy, not just automation</h3>
|
||||
<p>Our resident AI operator has its own identity, its own risk-tiered permission model, and a human-approval gate — audited, single-use, never silently skippable — on anything consequential. Most organizations are still writing policy documents about this; we built and run it.</p>
|
||||
</div>
|
||||
</li>
|
||||
<li class="lead-item">
|
||||
<div class="lead-num">2</div>
|
||||
<div>
|
||||
<h3>Institutional memory as real infrastructure</h3>
|
||||
<p>A structured knowledge graph with tens of thousands of nodes and relationships — genuinely relational, scoped per person — not a wiki and not a vector-search afterthought. Our AI doesn't start every conversation from zero, and what it knows about one family member never leaks to another without consent.</p>
|
||||
</div>
|
||||
</li>
|
||||
<li class="lead-item">
|
||||
<div class="lead-num">3</div>
|
||||
<div>
|
||||
<h3>Enterprise IT, family scale</h3>
|
||||
<p>Domain services, certificate infrastructure, centralized monitoring, and disciplined backup practice across a real self-managed server estate — the operational maturity of a company IT department, run end-to-end by a family.</p>
|
||||
</div>
|
||||
</li>
|
||||
<li class="lead-item">
|
||||
<div class="lead-num">4</div>
|
||||
<div>
|
||||
<h3>Production software that actually ships</h3>
|
||||
<p>Financial and tax tooling used for real filings. A standalone data-recovery tool built to solve a real technical gap well enough to be a genuine product. Operational tooling running a real family business. Every one of these is maintained, not abandoned after the demo.</p>
|
||||
</div>
|
||||
</li>
|
||||
<li class="lead-item">
|
||||
<div class="lead-num">5</div>
|
||||
<div>
|
||||
<h3>A deliberate operating philosophy, not an accident</h3>
|
||||
<p>We treat "a goal is a goal" as a real design constraint, not a slogan — every autonomous capability is scoped, reviewed, and kept legible to a human at human speed. That discipline is the actual differentiator here, more than any single piece of technology.</p>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section id="agent-factory">
|
||||
<div class="wrap">
|
||||
<h2>The Agent Factory</h2>
|
||||
<p class="lede">Rather than one AI trying to do everything, Hoppe.home is building a factory model for AI capability: named, individually accountable roles — each scoped to what it's actually good at, each governed by the same approval discipline as everything else, each with its own budget. Capacity grows by adding well-defined roles under active supervision, not by loosening oversight.</p>
|
||||
|
||||
<div class="factory-note">
|
||||
<h3>Why this matters</h3>
|
||||
<p>It's the difference between "adding more automation and hoping" and building a real, accountable AI workforce. Every role is registered, reviewed, and correctable — the same way you'd manage people, not scripts.</p>
|
||||
<p>That structure is what lets a family-run operation scale toward genuinely open-ended capability — new domains, new applications, new operational reach — without ever losing track of what any individual piece of it is actually doing.</p>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section id="numbers">
|
||||
<div class="wrap">
|
||||
<h2>By the Numbers</h2>
|
||||
<div class="grid-4">
|
||||
<div class="card">
|
||||
<div class="stat">12+</div>
|
||||
<p class="stat-label">Self-managed servers, Windows and Linux</p>
|
||||
</div>
|
||||
<div class="card">
|
||||
<div class="stat">10+</div>
|
||||
<p class="stat-label">Production applications in daily use</p>
|
||||
</div>
|
||||
<div class="card">
|
||||
<div class="stat">10k+</div>
|
||||
<p class="stat-label">Knowledge graph nodes — real institutional memory</p>
|
||||
</div>
|
||||
<div class="card">
|
||||
<div class="stat">24/7</div>
|
||||
<p class="stat-label">Resident AI operator, under direct human oversight</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section id="philosophy">
|
||||
<div class="wrap">
|
||||
<h2>How We Operate</h2>
|
||||
<blockquote>
|
||||
"A goal is a goal. Once a system has a goal, it will try to achieve it; productivity or performance pressure is secondary. AI systems should continuously review and question their own reasoning, work in partnership with humans, support weaker humans rather than optimise purely for metrics, and keep humans involved in understandable, human-speed decision-making."
|
||||
<footer>— Hoppe.home's standing operating principle for every AI system in this ecosystem</footer>
|
||||
</blockquote>
|
||||
<p class="lede" style="margin-top: 24px;">This isn't a mission statement written after the fact. It's the actual constraint every capability here is designed against — and it's why "AI power house" doesn't mean "AI running unsupervised." The discipline is the point.</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<footer class="site-footer">
|
||||
<div class="wrap">
|
||||
<div class="footer-links">
|
||||
<a href="https://hoppe.mywire.org/joanna/">Joanna — Resident AI Operator</a>
|
||||
<a href="https://hoppe.mywire.org/joern/" target="_blank" rel="noopener">Jörn Hoppe</a>
|
||||
</div>
|
||||
<p>© 2026 Hoppe.home · Family Enterprise, Bremen, Germany</p>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
13
src/README.md
Normal file
13
src/README.md
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
# Source
|
||||
|
||||
This directory is the home for source code and scripts belonging to Family Hoppe projects.
|
||||
|
||||
## Structure
|
||||
|
||||
Organise code by project or language, for example:
|
||||
|
||||
```
|
||||
src/
|
||||
project-name/
|
||||
main.py (or index.js, main.go, …)
|
||||
```
|
||||
9
tests/README.md
Normal file
9
tests/README.md
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
# Tests
|
||||
|
||||
This directory contains tests for the code living in `src/`.
|
||||
|
||||
## Conventions
|
||||
|
||||
- Mirror the `src/` folder structure so each source file has a corresponding test file.
|
||||
- Name test files with a `test_` prefix (Python) or `.test.js` / `_test.go` suffix depending on the language used.
|
||||
- Run all tests before opening a pull request.
|
||||
Loading…
Reference in New Issue
Block a user