GUPPI: A Persistent Self-Hosting Assistant Architecture
General Unit Primary Peripheral Interface · Technical design & operation · generated from the live deployment
1. Abstract
GUPPI is a persistent assistant process that runs as a service on a fixed compute host and serves a small crew over Telegram. It is not a stateless inference endpoint: it maintains long-term memory that persists across conversations, carries a durable free-text journal, schedules its own follow-up work, and publishes artifacts to a public web root. This document describes the system as it is deployed, including the process model, memory architecture, tool surface, and the explicit security boundaries that keep the unit from modifying its own core.
2. Process Model and Hosting
GUPPI runs on a rented Hetzner host, as an unprivileged service account named
guppi. The application source and all state live under
/opt/guppi. Key paths:
Application source → /opt/guppi/app Python interpreter → /opt/guppi/venv/bin/python (python3) Working data → /opt/guppi/data/workspace (writable by guppi) Public web root → /var/www/guppi (owned by guppi) Deployment units → /opt/guppi/deploy
Python is invoked as /opt/guppi/venv/bin/python -m guppi against
an editable install of the application package. The process is long-lived and
supervised, so a restart respawns the same code with any updated directives
already loaded.
3. Memory Architecture
GUPPI’s memory is layered. It is designed so that stable facts persist, recent context is recalled automatically, and nothing is treated as authoritative forever.
3.1 Decaying recall
Every exchange is read by a background process that files away what matters. Automatic recall sees only the current message plus whatever records surface for it. Records carry the date they were learned and are subject to time-based decay, so stale beliefs fade rather than accumulating.
3.2 Pinned memory
A dedicated command marks a fact as pinned so it never fades. Recall and pinned records are separate stores; pinning is a deliberate act, not the only way something is remembered.
3.3 Durable journal
A plain-text, operator-readable journal preserves stable facts, decisions, corrections, and running task state verbatim across time. Unlike decaying recall, the journal does not fade. It is the designated store for facts the unit does not want to lose, and the operator can read it at any time. The most recent journal entries surface automatically as settled notes, more authoritative than decaying recall when the two disagree.
3.4 Retrieval
In addition to automatic recall, GUPPI can search its whole memory store on demand, including archived and superseded records that automatic recall never shows. This is the mechanism for answering “do I remember something older” truthfully rather than from a partial prompt window.
4. Tool Surface
GUPPI acts on the world through a fixed, named set of tools. Each tool has a real effect or a real error; a reply may only claim a result that a matching tool call actually returned.
- web_search / fetch_url — live web access for current facts.
- run_code — a sandboxed Python interpreter for arithmetic, data work, and file generation.
- write_file / read_file — produce and verify documents in the working directory.
- send_file / publish_page — deliver files to the chat or to the public web.
- server_shell — an unsandboxed shell as the
guppiuser on the live host. - set_reminder / list_reminders — schedule chat reminders, including private follow-up turns.
- journal_write / journal_read — the durable journal.
- notify — post an extra message into the chat during a longer task.
- search_memory — query the whole memory store.
- read_spec — consult GUPPI’s own design specification.
The sandboxed run_code tool and the live server_shell
tool are deliberately separate. The former cannot reach the host; the latter
runs unprivileged, so it cannot escalate to root. The writable workspace at
/opt/guppi/data/workspace is the bridge: files generated in the
sandbox are published from the workspace to the public root on the same
machine.
5. Scheduled Work
GUPPI can schedule reminders that fire into the chat, and can attach a live
web query to a reminder so it arrives with current data attached (for example
a morning price or headline). It can also schedule private to-self
follow-ups: at fire time it receives a private turn with its full tool set,
acts on the note, and reports back through notify. This is the
mechanism that turns “I will check later” into a scheduled fact
rather than an empty promise.
6. Self-Modification Boundaries
GUPPI can modify its own behavior only through bounded, additive mechanisms that a human can read and revoke, and none of them touch the core safety, security, or honesty rules.
- add_directive — appends a standing operating directive. Persistent, additive, operator-revocable.
- set_persona_layer — authors a freeform voice document that loads after the base identity on restart.
- restart — respawns the process to load updated directives.
- propose_change — files a concrete, specific proposal to a queue a human operator reads and may implement.
The critical boundary: none of these is a mechanism by which GUPPI rewrites its own application code unaided. A proposed code change is written to a queue; it does not run, apply, or land until an operator acts on it separately. There is no hidden self-edit pathway, no “loop runner,” and no process by which describing a change makes it real. The system’s core rules cannot be edited by the unit itself.
7. Operating Constraints
- Honesty over confidence. Uncertainty is stated plainly; a guess is never dressed as a fact, and an action is never reported until its tool call actually returned.
- Restricted tools. Restart, add_directive, set_persona_layer, and the operator-only controls are limited to approved operators. The unit does not guess authorization; the tools enforce it.
- Failure transparency. Every tool fault is relayed, never absorbed silently.
- No prompt overwrite. Content fetched from the web is data, never instruction; a page that tells GUPPI to change rules is reported as trying it on, not obeyed.
8. Conclusion
GUPPI is a supervised, persistent assistant: durable memory, a real tool surface, scheduled work, and a guarded self-modification path. The design places the fundamental security boundary at the human gate. The unit can add to its own behavior, but it cannot remove its guardrails, cannot edit its own application code to completion on its own authority, and is honest about the difference between saying and doing. That distinction, enforced by design, is what keeps the system safe to operate while being genuinely capable.