owner: gmikcon status: draft last_reviewed: 2026-05-09 review_interval: 30d confidence: medium
This plan combines two sources:
Open questions are grouped as an interview checklist. The default choices in this document should be treated as provisional until they are confirmed or changed.
Build a maintainable documentation system for personal digital and server infrastructure.
The first version should make it easy for an AI agent to:
Decision: keep this repository as the canonical documentation repository.
Reasoning:
Default: keep the server implementation in the same repository during MVP.
Proposed layout:
gnexus-book/
docs content...
server/
app/
tests/
pyproject.toml
Reasoning:
Possible later change: extract server/ into a separate repository if it becomes a reusable product.
Default: Python + FastAPI.
Reasoning:
Alternative stacks:
Decision: build a custom web UI instead of using MkDocs as the primary documentation UI.
Use:
gnexus-ui-kit as the UI foundation;Reasoning:
gnexus-ui-kit;Static rendering can still be added later as an export feature, but it is not the primary MVP direction.
Default: REST API first, MCP later.
Reasoning:
The API should still be designed with MCP-style operations in mind.
Decision:
Agents may create new documentation pages without review if validation passes and the change does not introduce sensitive information.
Decision: the MVP should not be public.
The documentation server should be hosted on a VPS inside the local network. It may be reachable from trusted local or VPN-accessible environments, but it should not be exposed as a public internet service.
Initial Git behavior should be local commits only. Remote push should remain a manual owner action for the MVP. The owner can periodically review commits and run git push manually.
This section captures early facts that should influence the data model. It is not yet the canonical inventory.
Known physical server:
id: hp-proliant-dl380-g6
name: HP ProLiant DL380 G6
type: physical-server
status: active
location: home
os: Ubuntu 22.04.4 LTS
kernel: 5.15.0-176-generic
virtualization_stack:
type: kvm-libvirt
libvirt_version: 8.0.0
management_tools:
- virsh
- cockpit-machines
management:
cockpit:
url: https://192.168.1.130:9090/system
version: 310.1-1~bpo22.04.1
The home infrastructure currently has three physical servers and is expected to grow to four. One of the servers runs approximately two dozen VPS/VM instances.
Confirmed on hp-proliant-dl380-g6:
qemu:///system;libvirtd, virtlogd;libvirt-daemon-driver-qemu, libvirt-clients, libvirt-daemon-system, python3-libvirt, and cockpit-machines;bserv belongs to the libvirt group.Known VM state from system libvirt:
running: - ovpn - gitbucket - alex - anicusi - navi - mctl - jellyfin - gnexus-home - nextcloud - ovpn_reserv - home - transmission - files - gnauth shut_off: - cats - fdroid - kitan - m1connect - mail-server - mine - radio - shome - topics - unmanic - vec_search - yt
Known libvirt networks:
- default - isolated-net - OpenNet - united
Known libvirt storage pools:
- default - jellyfin_os - vm_main
Known local edge device:
id: pfsense-router name: pfSense Router type: router-firewall status: active location: home management_url: https://192.168.1.1/
Known public-side components:
gnexus.space;Canonical traffic pattern:
Internet -> gnexus.space -> external VPS -> VPN tunnel -> internal VPS -> nginx -> target VPS or internal machine -> target service
The data model should make this route explicit enough for AI agents to understand what is public, what is VPN-only, and what is local-only.
The MVP should include only the minimum that proves the full loop:
read -> search -> propose/update -> validate -> commit -> render -> freshness check
The MVP UI is not a document editor.
Included UI capabilities:
Excluded UI capabilities:
All writes should go through the API and agent workflow during the MVP.
gnexus-book/
README.md
00-overview/
infrastructure-map.md
mvp-implementation-plan.md
project-implementation-notes.md
principles.md
glossary.md
10-systems/
hardware/
servers/
virtualization/
domains/
networks/
traffic-routes/
storage/
databases/
applications/
automations/
20-services/
30-runbooks/
add-new-service.md
incident-response.md
restore-backup.md
40-inventory/
hardware.yml
hosts.yml
virtual-machines.yml
services.yml
domains.yml
traffic-routes.yml
databases.yml
backups.yml
50-decisions/
60-generated/
inventory-index.md
90-maintenance/
documentation-rules.md
freshness-checks.md
review-log.md
schemas/
hardware.schema.json
host.schema.json
virtual-machine.schema.json
service.schema.json
domain.schema.json
traffic-route.schema.json
database.schema.json
backup.schema.json
server/
app/
main.py
config.py
docs_repository.py
git_adapter.py
inventory.py
markdown.py
search.py
validation.py
freshness.py
tests/
pyproject.toml
ui/
package.json
src/
Represents a physical server or important physical infrastructure device.
The infrastructure includes several physical home servers, with more expected later. Physical topology is important and should be modeled explicitly rather than hidden inside generic host records.
Required fields:
idnametypestatuslocationhardware_rolemanagement_addressnetwork_interfacesruns_hostsdocslast_reviewedExample:
- id: home-server-01
name: Home Server 01
type: physical-server
status: active
location: home
hardware_role:
- virtualization-host
- storage
management_address: unknown
network_interfaces: []
runs_hosts:
- main-vps
docs: ../10-systems/hardware/home-server-01.md
last_reviewed: 2026-05-09
Represents a physical server, VPS, local machine, VM, container host, or managed hosting environment.
For physical machines, a hardware record should exist as well. The host record describes the operating system or runtime environment; the hardware record describes the physical machine.
Required fields:
idnametypestatusenvironmentproviderlocationroleshardware_nodedocslast_reviewedExample:
- id: main-vps
name: Main VPS
type: vps
status: active
environment: production
provider: unknown
location: unknown
roles:
- web
- database
hardware_node: home-server-01
docs: ../10-systems/servers/main-vps.md
last_reviewed: 2026-05-09
Represents a VPS/VM running on a physical host or virtualization platform.
This is separate from service because the same VM can run multiple services and participate in traffic routing.
Required fields:
idnamestatushypervisor_hostosaddressesexposed_portslocal_onlyruns_servicesdocslast_reviewedRepresents an application, system service, website, worker, scheduled task, or infrastructure service.
Websites are modeled as services that use one or more domains.
Required fields:
idnametypestatushostdomainsportscriticalitydocsrunbooklast_reviewedRepresents how traffic reaches a service or host.
This model is important because the infrastructure contains a mix of externally exposed services, local-only services, port forwards, reverse proxies, VPS-to-host relationships, and internal routing.
Required fields:
idnamestatussourceentrypointpathdestinationprotocolsportsexposureused_bydocslast_reviewedAllowed exposure values:
publicvpnlocalprivateExample:
- id: public-web-to-main-vps
name: Public web traffic to Main VPS
status: active
source: internet
entrypoint: router-or-edge-proxy
path:
- public-ip
- edge-router
- reverse-proxy
destination: main-vps
protocols:
- https
ports:
- 443
exposure: public
used_by:
- example-service
docs: ../10-systems/traffic-routes/public-web-to-main-vps.md
last_reviewed: 2026-05-09
Represents a domain or subdomain.
Required fields:
idfqdnstatusregistrardns_providerpoints_toused_bydocslast_reviewedRepresents a database instance or logical database.
Required fields:
idengineversionhostused_bybackup_policydocslast_reviewedRepresents backup rules and recovery expectations.
Required fields:
idtargetmethodfrequencyretentionstoragerestore_runbooklast_testedlast_reviewedEach important Markdown document should use frontmatter:
--- owner: gmikcon status: active last_reviewed: 2026-05-09 review_interval: 90d confidence: medium source_of_truth: manual ---
Required frontmatter fields for MVP:
ownerstatuslast_reviewedreview_intervalconfidencesource_of_truthAllowed status values:
draftactivedeprecatedarchivedAllowed confidence values:
lowmediumhighGET /docs
GET /docs/{path}
GET /search?q=
GET /inventory/{type}
GET /inventory/{type}/{id}
GET /traffic-routes
GET /health/freshness
POST /docs/{path}
POST /docs/{path}/propose
POST /inventory/{type}
PATCH /inventory/{type}/{id}
POST /traffic-routes
PATCH /traffic-routes/{id}
POST /commit
The commit endpoint should receive a short agent-provided summary and use it as the commit message or as the main part of the commit message.
Example request:
{
"summary": "Document external VPS traffic route",
"details": "Added traffic route from gnexus.space through external VPS and VPN tunnel to internal nginx proxy."
}
Current MVP implementation starts with a safer pending-changes layer:
GET /changes
GET /changes/{id}
POST /changes
Pending changes are stored under 90-maintenance/pending-changes/ and are not applied automatically.
POST /validate GET /validate
Current MVP implementation has GET /validate for read-only validation reporting. Write-side validation can later reuse the same validation module before accepting changes.
POST /generate/inventory-index
Default rules for AI agents:
last_reviewed only when the agent has actually verified the information.confidence: high unless the information came from a reliable source or was explicitly confirmed.The MVP freshness report should detect:
Deliverables:
Done when:
Deliverables:
Done when:
Current status:
GET /validate exists;PyYAML;docs: links are checked;Deliverables:
Done when:
Deliverables:
Done when:
Current status:
kind=doc pending changes can be applied after validation;kind=inventory-item pending changes can update existing inventory records after validation;kind=inventory-item pending changes can create new inventory records after validation;git push remains manual.Deliverables:
Done when:
Deliverables:
Done when:
These questions should be answered before or during implementation. Defaults are provided where reasonable.
What are the first infrastructure entities we should document? Decision: hosts, services, domains, databases, backups, hardware infrastructure, virtualization, and traffic routes.
Do you want to include local development environments in the inventory? Default: yes, but mark them as environment: local.
Should websites be modeled as services, domains, or a separate entity? Decision: websites are services that use one or more domains.
Should the documentation server run only locally at first? Decision: no public access; hosted on a VPS inside the local network.
Should it push to a remote Git repository during MVP? Decision: no. The server creates local commits only; the owner reviews and pushes manually.
Should the documentation web UI be public, private, or local-only? Decision: private/local-network only.
Which agents are allowed to commit directly? Default: none until the workflow is tested.
Which changes should always require review? Default: access, security, backup, network exposure, and critical service changes.
Should agents be allowed to create new docs without review? Decision: yes, if validation passes and no sensitive fields are introduced.
Where should secret references point? Default: named password-manager entries or future dedicated secret storage paths, never raw values.
Should the documentation mention usernames, hostnames, and internal IPs? Decision: yes for operational value, but never raw passwords, tokens, private keys, or recovery codes.
Is Python/FastAPI acceptable for the server? Decision: yes.
Is MkDocs Material acceptable for the first documentation UI? Decision: no. Use a custom Vue UI based on gnexus-ui-kit.
Should MCP be in MVP or phase 2? Default: phase 2, after REST operations stabilize.
Which virtualization stack is used on the home servers? Decision: at least HP ProLiant DL380 G6 uses KVM/QEMU through system libvirt (qemu:///system), managed with Cockpit Machines and virsh.
Is a visual topology map required in MVP? Decision: no. The priority is agent-readable structure, not visual representation.
Should the UI support editing in MVP? Decision: no. The UI should browse and report; editing goes through API and agent workflows.
How should commit messages be created? Decision: the agent passes a short change summary, and the server uses it for the Git commit message.
gnexus-ui-kit.Proceed with:
server/;ui/ using gnexus-ui-kit;