BLUF
After several months evaluating commercial cloud AI and companion platforms, the project moved onto locally operated AI. An M3 Pro MacBook Pro with 18 GB of unified memory successfully ran a useful conversational model, differentiated companion characters, local speech recognition, and character-specific synthesized voices.
The unexpected finding was that model inference was not the largest obstacle.
The difficult work came from connecting every stage of the interaction: starting the required services, capturing speech, transcribing it, inserting the transcription into the correct application, sending it to the model, receiving the character response, routing that response to the correct voice, preventing the system from hearing itself, and eventually making the interface privately accessible from an iPhone over cellular.
The local system provided greater control and inspectability, but it also transferred integration, maintenance, security, and recovery responsibilities from a commercial platform to the human tester.
The cloud platforms established the benchmark
The local project did not begin in isolation. Commercial services had already established expectations for what an AI companion should feel like.
Kindroid demonstrated polished access, managed infrastructure, persistent character configuration, memory, voice interaction, generated media, and continuity across devices. ChatGPT demonstrated how a cloud AI could grow from isolated questions into continuing project work. Those services concealed most of their underlying infrastructure from the participant.
The local experiment asked a different question:
How close can consumer hardware get to a cloud AI-companion experience, and what does the tester gain and give up by building and operating the system?
The objective was not to prove that a home-built system was superior or free. It was to determine which parts of the experience could be reproduced locally and what new work local ownership created.
The local project evolved through several systems
The project did not move directly from a cloud companion to one finished local application.
Bionic was used during an earlier stage of the local experimentation. SillyTavern then supplied a configurable character-chat frontend. A custom launcher and integration layer called The Construct was developed to start and coordinate the SillyTavern workflow. LM Studio became the local model server, with Qwen3-14B Q4_K_M providing the primary tested conversational model.
Front Porch AI was evaluated as a more polished companion-oriented interface. It provided guided character configuration, portraits, optional memory and realism features, text-to-speech clients, and a web interface. The tester generally preferred its presentation, while SillyTavern and The Construct provided a faster and more configurable voice-conversation workflow on the existing Mac.
These were not interchangeable names for the same product. They occupied different layers of the system:
| Component | Role in the local system |
|---|---|
| Bionic | Earlier local AI environment |
| SillyTavern | Configurable character-chat frontend |
| The Construct | Custom launcher and integration layer |
| LM Studio | Local language-model server |
| Qwen3-14B Q4_K_M | Primary conversational language model |
| Front Porch AI | Companion-oriented interface and optional memory/state layer |
| Whisper small.en | Local English speech recognition |
| sherpa-onnx | Local inference runtime used for speech recognition |
| YAP | Dictation and local speech-service layer |
| Pocket TTS | Local character-specific voice cloning and synthesis |
| Front Porch/YAP bridge | OpenAI-compatible local voice-routing adapter |
| Tailscale | Private remote network access |
LM Studio officially supports serving local models through REST and compatibility endpoints. Front Porch describes itself as a local-first companion interface capable of working with local models, including those served through LM Studio. Those capabilities provided the starting pieces, but they did not automatically form a complete working companion.
Running the model worked earlier than expected
The known-good language path became:
Qwen3-14B Q4_K_M
↓
LM Studio
↓
SillyTavern / The Construct or Front Porch
↓
Character responseThe working SillyTavern configuration used a 512-token maximum response length, a temperature of 0.85, and /no_think in the primary prompt. Qwen documents /no_think as a method for requesting non-thinking mode. In this project, the tester reported that it reduced perceived delay in Front Porch, although the installed prompt-assembly path was not fully audited and the observation does not prove that every internal reasoning path was disabled.
On the M3 Pro MacBook Pro, Qwen3-14B produced useful conversational responses. Multiple configured characters remained recognizably different, and the model supported both ordinary conversation and roleplay. During a successful session, macOS memory pressure remained green.
This established a practical baseline: the existing consumer Mac could run a useful local conversational model while supporting the surrounding companion services.
The conversation was a chain, not a single model call
Adding local voice exposed the real engineering problem.
The complete interaction required this sequence:
Microphone capture
↓
Speech recognition
↓
Visible text insertion
↓
Message sending
↓
Local model inference
↓
Character response
↓
Voice routing
↓
Character-specific speech playbackEach stage could succeed while the overall conversation still failed.
YAP could record and transcribe the tester correctly while the transcription remained only in YAP history or on the clipboard. A target application could appear focused while its visible message field remained empty. An accessibility operation could report that text had been assigned even though the Flutter interface did not show it. A Send control could be located even when there was no usable message to send.
Successful transcription therefore did not prove successful insertion. Successful insertion did not prove successful sending. A generated response did not prove that the correct character voice would play.
That separation became one of the most important methodological lessons of the local phase.
Front Porch revealed the integration problem
Front Porch’s companion-oriented presentation was appealing, but its Flutter message composer did not behave like a conventional macOS text field.
Several approaches were attempted:
- Clipboard-only capture.
- Simulated paste operations.
- Direct accessibility value assignment.
- Searching the accessibility tree for the visible composer.
- Simulated Return.
- Activating the accessibility-exposed Send control.
- Focus checks based on element coordinates.
- Investigating the optional Front Porch web server as an alternative input route.
Some approaches produced false success. Accessibility could report an assigned value that was not present in the visible controller. The Send button could be found even when the text had not actually entered the composer. Missing screen coordinates could be misinterpreted as missing focus.
The working repair used genuine macOS keyboard events after activating and focusing the composer. It selected and cleared existing text, typed the transcription into the visible field, and then activated the actual Send control. The final Front Porch launcher baseline confirmed that Option-Space speech input reached the visible composer and sent successfully.
The lesson was simple but consequential:
An intermediate software state could claim success while the human-visible end-to-end workflow was still broken.
Local voice worked, with compromises
YAP and Pocket TTS provided local character-specific voices through a local OpenAI-compatible bridge. In the Front Porch configuration, the endpoint used the Mac’s loopback address. The word “OpenAI” described the API format; it did not mean that OpenAI received the character text or audio in that configuration.
The tester confirmed that multiple characters could use distinct voices and that the existing clones retained recognizable identity. In The Construct, character responses played automatically. American-style reference voices appeared particularly successful during the observed tests.
The principal limitation was emotional expression. Pocket TTS preserved recognizable voice identity but did not consistently match the inflection associated with the strongest commercial voice systems.
The project also established that a cloned voice does not become more expressive merely because a conversation becomes longer. The language model may generate more emotional wording and punctuation over time, but the TTS system separately renders that text from its existing voice representation.
This preserved an important distinction among character writing, voice identity, emotional prosody, latency, privacy, and cost. They are related parts of the experience, but improving one does not automatically improve the others.
Half-duplex made hands-free conversation practical
The Construct later incorporated local speech recognition using Whisper small.en with sherpa-onnx. The resulting hands-free flow was deliberately half-duplex:
Listen for the tester
↓
Stop microphone capture
↓
Transcribe locally
↓
Send to the local model
↓
Generate and play the character voice
↓
Resume listeningStopping the microphone during synthesized playback prevented the system from transcribing its own character voice.
The tester confirmed that this hands-free workflow worked, while Option-Space remained available as a fallback. Full duplex and natural interruption were deferred because they would require reliable echo cancellation, playback cancellation, or speaker discrimination.
This was not a failure of the language model. It was an audio-engineering boundary around the complete system.
Local AI left the desk, but not all at once
The September 22 baseline documented another milestone: Front Porch loaded on an iPhone over cellular through a private Tailscale route while the Mac remained the host system.
Tailscale distinguishes Serve, which shares a local service privately within a tailnet, from Funnel, which can expose a service to the broader internet. The captured baseline used Serve, and Funnel was disabled.
The private HTTPS route forwarded traffic to Front Porch’s loopback web-server port on the Mac. The connection remained responsive while Proton VPN and Tailscale were both active, and Front Porch’s Disconnect control successfully disconnected remote web clients.
This demonstrated that “local” did not have to mean “sitting in front of the host computer.” It did not yet create a complete remote voice companion. The documented milestone covered secure remote text access. Character-correct remote voice playback, remote autoplay, half-duplex phone conversation, restart recovery, sleep behavior, and remote latency remained unfinished or unmeasured.
Exact private hostnames and device identifiers are intentionally omitted from this public draft.
Owning the stack exposed failures that services normally hide
The local system was not uniformly successful.
Characters could fall into unwanted behavioral patterns. One character shifted into therapist-like responses. Another continued repetitive affection despite guidance intended to reduce it. Qwen hallucinated facts. Longer sessions appeared to slow as displayed context grew. Memory and journal settings could contribute to stale behavior. Microphone contention and interface accessibility created additional failures.
The tester also spent many hours assembling and repairing the workflow.
These shortcomings make the comparison with commercial platforms more credible. Kindroid continued to offer advantages in polish, stronger managed models, mature memory, infrastructure, remote availability, and minimal systems administration. The local system did not reproduce all of those advantages merely because it ran on personally owned hardware.
What changed was responsibility.
The commercial service operated the model, infrastructure, updates, networking, storage, and recovery process. In the local system, the tester gained greater control over the model, character definitions, records, voices, configuration, and network path—but also became responsible for maintaining them.
How Finding #9 connects to the earlier findings
Finding #3 established that voice became increasingly important after visual identity stabilized. Finding #9 documents the engineering required to reproduce character-specific voice interaction locally.
Finding #4 distinguished persistent identity from perfect recall. The local work showed that continuity depended on an inspectable combination of character instructions, chat history, optional memory systems, journal state, and model behavior.
Finding #5 showed that the complete platform experience mattered more than an isolated attention-grabbing capability. Finding #9 reached a similar conclusion from the opposite direction: a capable local model did not automatically produce a complete companion.
Finding #7 documented how a managed cloud AI became useful across continuing projects. Finding #9 begins the comparison with infrastructure operated directly by the tester.
Finding #8 closed the initial cloud-companion chapter. Finding #9 begins the locally operated phase of the longitudinal study.
What this finding does not establish
This is a single-participant field observation of one evolving hardware and software configuration. It does not demonstrate that every M3 Pro Mac can reproduce the same performance, that Qwen3-14B is the best local companion model, or that locally operated AI is inherently more private, less expensive, or more capable than cloud AI.
A loopback endpoint shows that a particular request remained on the host, but it does not prove that every feature of every application operated without network access. A complete disconnected-network test of the entire stack had not been documented at the time of this draft.
Response time, remote latency, context-processing cost, and total setup labor were not measured under controlled conditions. The relationship between increasing displayed context and increasing delay remained an observed correlation rather than a complete causal measurement.
The proposed higher-memory Mac Studio had not been purchased or benchmarked. Claims about larger models, greater context, additional concurrent services, or improved quality on that hardware remain projections.
Preliminary conclusion
The local phase established that consumer Apple Silicon hardware could run a useful AI-companion stack containing a local language model, differentiated characters, speech recognition, cloned voices, hands-free interaction, and private remote text access.
But the model was not the finished product.
The hardest part of local AI was not making a model answer. It was making every layer of the experience work together reliably enough that the technology could disappear into the conversation.
Local ownership increased control and inspectability. It also transferred integration, maintenance, networking, security, backups, and recovery to the tester. That tradeoff—not a claim of local superiority—is the central finding.



