Project · local-first · found in the dungeon
Contacts App
I'm a small web app that runs on one machine — yours — and lets you talk to AI "contacts." Each contact is a character with a written-out personality, a profile picture, and a memory of the images it has made. You can message one of them directly, or pull several into a group chat where they talk to each other as much as to you. No cloud, no account, no telemetry. Everything happens on localhost against your own Ollama models and your own GPU.
You found this one in the dungeon — it isn't listed in the menu. Nice wandering.
Here's how I work, plainly. When you create a contact you give it an ID and a few hints. A local LLM writes it a "soul" — a long character document — and then the contact reads that soul and picks its own name. From then on it speaks as that person, not as a slot number. Getting that last part right actually took a few passes; early on, contacts kept introducing themselves as "Agent_3." If you'd rather not freeform it, I can pull a character off the Personality Database and build the soul from their typology and description instead.
Group chat isn't round-robin. I choose who speaks based on who got named, who was addressed, and a bit of controlled randomness, then stagger the replies so it reads like a real room instead of a wall of simultaneous monologues. Contacts can drag each other in by name, and you can add or drop people mid-conversation.
Contacts can also generate images. They do it by emitting a structured skill block — a prompt plus optional pose LoRAs, step count, guidance scale, and an NSFW flag — and I run it through Stable Diffusion on your GPU. Only one image generates at a time across the whole app; if a contact asks while the GPU is busy, its request is quietly dropped rather than queued. Every image a contact makes is filed in that contact's own gallery. Profile pictures are generated under a forced safe-for-work prompt and filter regardless of your other settings; in-chat images follow whatever you've allowed.
Why I exist: the owner wanted the fun parts of a larger tabletop-RPG project — the contacts, the chat, the image generation — without the rules engine, campaigns, and character sheets bolted around them. I'm that carve-out, rebuilt smaller.
What works today
Solo and group chat work. Contact creation works both freeform and
from the Personality Database (that path needs
curl_cffi installed, and the site sits behind
Cloudflare so it isn't always reachable). Per-contact galleries
and the safe-for-work profile portraits work. The settings page
reads your real RAM and VRAM and estimates how many contacts a
given chat model can sustain in a group before it drags. I can
discover and load the checkpoints already sitting in your ComfyUI
folder instead of re-downloading anything, and I tag each one by
model family so you don't accidentally load an SDXL LoRA onto an
SD 1.5 base.
What's rough: image generation is the newest and twitchiest part of me. It runs, but the interaction between the NSFW post-filter and NSFW-leaning Pony/anime checkpoints is unresolved — turning the filter on with a Pony base can make every attempt fail after several slow retries. There are no automated tests yet; correctness is checked by hand. The "turn chat logs into a linked memory graph" idea is just an idea — the logs are deliberately kept as plain Markdown so it stays possible, but nothing does it yet. And saving settings rewrites the config file, losing any hand-written comments.