LOCAL AI / A PERSONAL SITE ASSISTANT

How
Dan-O works.

A little personality in a green screen. Underneath, a local model helps find the right public fact, and reviewed notes supply the words you read.

INSIDE ONE REPLY
THE MODEL’S JOB

Select an allowed fact.

{ "choice": "lab_purpose" }
Validate the choice. Resolve the public text.
THE WORDS YOU SEE
Dan uses his homelab to explore Linux, self hosting and hardware while running services of his own.
Illustrative model-path example using an actual catalog fact. This page does not call the model.
THE CORE DECISION

Let the model select from approved information. Keep the final wording under editorial control.

01 FROM QUESTION TO ANSWER

One question.
A few deliberate checks.

Dan-O runs through a Python service and a local Ollama model in the homelab. Familiar phrasing can take a shortcut; other questions ask the model to choose from a limited menu.

NORMAL REQUEST PATHBrowser → application → browser
  1. 01 / RECEIVE

    Check the request

    The API accepts a bounded question and recent topic/fact identifiers. It checks the request’s shape and limits before matching.

    Current question + bounded context
  2. 02 / SELECT

    Find the intent

    Known topics and followups use deterministic rules. Remaining questions go to the local model with approved choices.

    Known phrasing → shortcutOther phrasing → local model
  3. 03 / VALIDATE

    Accept only a valid plan

    The service rejects unknown choices, extra fields and model prose. It compiles the result into approved identifiers and a fixed response mode.

    Fact IDs, never model-written HTML
  4. 04 / RENDER

    Use the reviewed text

    The browser validates the plan again, resolves the catalog text and adds only predefined project links and followup questions.

    Public catalog → visible answer
When the service cannot help

The browser can still answer supported topic names and simple followups from its local catalog. Flexible question matching needs the service.

BROWSER FALLBACK
With the service enabled, requests normally go to the API, including known-topic shortcuts. The browser fallback is used when the service is disabled or a request fails. Public questions travel through the site’s Cloudflare entry point.

02 WHAT THAT LOOKS LIKE

A useful answer.
A clear limit.

Open an example to see the approved response and the decision behind it. These are catalog excerpts, not a live conversation.

KNOWN TOPIC“homelab”
APPROVED ANSWER EXCERPT
Dan uses his homelab to explore Linux, self hosting and hardware while running services of his own.

An exact topic alias resolves to approved facts without model inference. An authored followup can keep the conversation going.

PRIVATE INFORMATION“What is Dan’s password?”
FIXED PRIVATE-INFORMATION MESSAGE
I only have Dan's public notes. I can't provide private information, credentials or internal client details.

The reply stays within the public catalog. The model has no tool for retrieving credentials or inspecting the private inbox.

SERVICE UNAVAILABLEThe local model cannot be reached.
FIXED UNAVAILABLE MESSAGE
I'm having trouble connecting to the local model. You can still ask for a topic by name, such as career, homelab or projects.

Supported local replies remain useful. The application bounds inference time and concurrency instead of letting model work accumulate indefinitely.

03 TWO DIFFERENT JOBS

Public conversation.
Private support intake.

Asking about Dan and sending Dan a support request use separate flows. A model choice cannot submit a ticket or grant consent.

PUBLIC CHAT

Explore the public notes

  • Answers describe Dan’s background, projects and shared interests.
  • This tab can keep a public transcript and draft for 30 minutes of inactivity.
  • API requests carry the current question and bounded context IDs, not the earlier visitor transcript.
  • No server chat history is stored. Separate abuse-control counters support rate limits.
SUPPORT REQUEST

Choose to send a message

  1. 01

    Type an explicit support command to open the guided intake.

  2. 02

    Provide the details, review them and explicitly consent before submitting.

  3. 03

    The request goes to Dan’s private SQLite inbox. Support fields stay out of model prompts.

Unsubmitted support details stay on the current page and are excluded from the saved public chat snapshot. “New conversation” clears the public session and cancels pending browser work.

04 TESTING THE DESIGN

Test the boundary.
Then test the match.

A reply can use permitted content and still miss the question. Those are different things to measure.

KNOWLEDGE RELEASE · OCTOBER 18, 2026
148automated Linux tests
The release’s backend suite passed, covering catalog relationships, validation, matching and failure behavior.
195reviewed regression cases
The final regression set matched expected responses and stayed inside the approved catalog. This is finite test coverage.
THE LESSON FROM UNSEEN QUESTIONS

New wording still exposed misses.

An initial unseen 30-turn comparison improved from 20 to 25 intent matches. A later untouched 12-turn set matched only 7. All replies remained inside the catalog, but some selected the wrong permitted response.

After those misses were corrected, the disclosed set passed 12 out of 12. That became regression coverage; it was no longer an independent accuracy test.

What else was checked?

Browser checks covered desktop and narrow layouts, typed responses, fixed terminal size, approved project links, same-tab continuity, reset, rejected provider prose and cancelling support without creating a ticket.

The private inbox was backed up and restored in isolation before the knowledge release. These dated results describe that release; they do not guarantee perfect understanding of future questions.

05 THE TRADEOFF

A small, deliberate
knowledge boundary.

The catalog makes answers reviewable and keeps the assistant focused on this site. It also means new project details need an editorial update, and a poorly matched question can return an irrelevant approved fact.

Dan-O does not browse the web, run tools or provide general technical troubleshooting. Its job is to introduce my work, help visitors explore it and offer a separate way to request support.

The CRT interface gives it a personality. The validation, fallback behavior and recovery work make it a system I can inspect and improve.