Skip to content

v1.0.0-beeeta

Choose a tag to compare

@efficiencyx efficiencyx released this 11 Oct 20:02
· 7 commits to main since this release

Jun OS v1.0.0-beeeta 🐑

Turns out v0.1.0-alpha-ca wasn't enough code.

You might ask why beeeta? Because it's beta, and sheep go beee. That's it. I learned nothing from alpha-ca.

This release lands 134 commits after the first public alpha. Calling it a small update would be dishonest: large parts of Jun OS were rebuilt, new systems showed up, old ones got noticeably less dumb, and Jun has a lot more ways to interact with you.

And sometimes i still ask myself why i added some of the following features.

⚠️ Before you upgrade

  • Your data gets encrypted on first login. Existing plaintext chats, memories and preferences are migrated automatically the first time each account logs in after updating.
  • Save your recovery code. New accounts get a one-time recovery code at signup. If you lose both your password and that code, your data is gone. That's encryption doing its job, and no backup can undo it.
  • HTTPS is now the default. Linux and Windows installs generate a local certificate (LAN addresses included). Plain HTTP redirects to HTTPS. Expect a browser warning on self-signed certs; the traffic is still encrypted.
  • Sidecars now require authentication. If you call the TTS/STT/karaoke services directly, requests need the generated sidecar secret.
  • Trips are gated. Activity pages use temporary trip grants instead of being directly reachable. Set FREE_ROAM=on to restore the old behavior.
  • Jun can now leave the conversation. See FLEE_BANS below if you want to soften that.
  • Updates follow release channels now. Re-running the installer (or pressing Update in the Jun OS app on Windows) moves you along Stable (newest full release, the default), Latest (pre-releases included) or Experimental (main), saved as JUN_CHANNEL in .env. Installs from before this were on main and stay on Experimental until you set JUN_CHANNEL=stable.
  • The install commands changed. They now download the installer from the latest release instead of from main. Old bookmarked commands still work, but grab the new ones from the README.
  • The license is now Apache-2.0 (it was MIT). The asset rules moved out of LICENSE into their own NOTICE file; what they allow didn't change.

What comes with this release

Going out with Jun

  • Real activities. Shopping, karaoke, lunch, dinner and blackjack are proper activities now, not buttons that teleport you to another page. Ask her out in chat or through Settings, and she decides whether she wants to go.
  • She can ask you out too. Jun occasionally takes the initiative instead of waiting for you to drive every conversation.
  • Dates are actual dates. Talk while ordering, pick your food, let Jun pick hers, call the waiter, head home. The whole outing gets written back into her memory.
  • Three restaurants. Lantern, Marigold and a counter spot, each with its own layout, lighting and art. The venue is picked per trip and stays the same if you refresh mid-date.
  • Blackjack. Because an AI companion orchestration system clearly needed turn-based blackjack. Jun plays her own hand, decides when to hit or stand, and reacts to the table.
  • Trips are part of the relationship. Pages use temporary trip grants instead of letting you drag Jun wherever you like. FREE_ROAM=on turns you into the god of transportation.
  • Jun can leave. Push things far enough and she walks out, refusing to come back for a while. Repeat offenses mean longer lockouts. FLEE_BANS=off removes the lockout but keeps her ability to leave.
  • She notices a bad streak. When her last few moods keep souring within half an hour, walking out gets suggested to her. She still decides whether you've earned it.

Achievements 🏆

  • 25 of them, from Yapper to Door Slammed, each climbing Bronze → Silver → Gold → Diamond.
  • Counted where things actually happen: chatting, tools, mood shifts, outings, karaoke, outfit changes and blackjack.
  • They unlock nothing. They're for bragging. Some stay hidden until you stumble into them. I've heard that someone dedicated enough could cheat their way to unlocking every achievement.

Thinking and generation

  • Reasoning Modes. auto / low / medium / high, so "hi" no longer gets treated like a doctoral dissertation. You can also expose the reasoning stream if you're curious.
  • Budget-aware fine-tunes. The live context ends with a <think:low|med|high> marker, so compatible Jun models (Currently v7 and v8) adjust how much effort each turn gets.
  • MTP speculative decoding. Supported Jun models can use a small drafter to guess several tokens ahead. Right guesses are accepted in batches, wrong ones thrown away. Same answer, potentially faster.
  • MTP auto-tuning. The installer benchmarks draft depths against normal decoding using Jun's real prompt, keeps the fastest setup, and switches MTP off if your hardware doesn't benefit. Swap GPUs and it can retune itself.
  • A tiny model for chat titles. TITLE_MODEL (a small, CPU-pinned model) names your conversations so that job doesn't eat Jun's VRAM or interrupt her. Works on Ollama and llama.cpp.

llama.cpp is a first-class citizen now

Running Jun on llama-server instead of Ollama used to mean a lesser Jun. Not anymore.

  • Same prompt, byte for byte. Her thinking switch on llama.cpp builds exactly the prompt Ollama's renderer builds. Checked character by character, not vibes.
  • She can hear you on llama.cpp too. The Jun model repos ship the file that gives her ears, and llama.cpp loads it automatically.
  • Titles, a model picker, and karaoke that can borrow the GPU. llama-server runs in router mode, so it can hold the title model on the CPU, list every model you've set up, and step aside while karaoke splits a song.
  • Context that fits your card. Capped at 16k like the Ollama side, and shrunk first on small cards instead of pushing half of Jun onto the CPU.
  • She's loaded before you say hi. The start script loads her right away, so your first message isn't secretly a 2-12 GB download.
  • It actually downloads now. The previous llama.cpp setup couldn't fetch a model at all inside its read-only container. Embarrassing. Fixed.

Memory

  • Smarter durable-memory retrieval. Memories are picked by relevance to what you're talking about, not by "which category changed most recently?"
  • Better cross-chat recall. Search now matches words instead of requiring one exact substring, so Jun actually finds past conversations.
  • Karaoke goes into memory. Finished, scored performances can be stored, so she can bring up your vocal crimes later.

Voice

  • Room awareness. On spoken turns, Jun decides whether you're talking to her or she's just overhearing you talk to someone else.
  • Hear Everything mode. Don't trust an LLM to judge who you're addressing? Flip the switch and she answers everything. Yes, even your mom telling you to stop kissing the monitor.
  • Direct audio input. Compatible models receive the audio itself, no Whisper in the middle. Ollama or llama.cpp.
  • Whisper still runs alongside. Its transcription replaces the temporary <audio> entry in history, so memory search, consolidation and reloads still have real words to work with.
  • Graceful fallback. If the model can't take audio, the same recording goes through local speech-to-text instead of vanishing.
  • Cleaner stay_silent. Jun can deliberately ignore an overheard conversation without leaving junk turns in history.

Wardrobe

  • Better outfit sync. State resyncs correctly after changes, recolors repaint properly, and mods can let the Live2D rig keep driving parameter-based clothing instead of freezing it in one pose.
  • Android wardrobe support. The Android client got the missing wardrobe API and state path, so outfit changes work instead of 404ing during boot.

The world looks different too

  • Rooms are real SVG scenes. The boutique, karaoke lounge, restaurants and blackjack room moved from CSS-gradient architecture to proper scene files with individually placeable props.
  • Dynamic time of day. Sky, room exposure, city lights and window lights follow the real clock instead of "lunch = day, dinner = night."
  • Seasonal daylight. 18:00 in December and 18:00 in June no longer share the same sky.
  • Redesigned karaoke. Setup is a single screen instead of a mini installation wizard, and once the song starts the lyrics take over the stage instead of living in a narrow side panel.
  • A shared visual system. Wardrobe, date and karaoke pages now share consolidated design tokens, a minimum text size, and a lot less decorative UI that did nothing.
  • A full-page blackjack table. Correct cards, chips, turn states, accessibility fixes, and Jun sitting where she's supposed to instead of somewhere in the CSS stacking dimension.

Privacy and security

A security audit drove a good chunk of this work. Several "local-only" services are now treated as if someone will eventually expose them by mistake, because someone will.

  • Encryption at rest. Every account gets its own random data key. Conversations, titles, summaries, preferences, welcome data and memory files are sealed before they touch disk.
  • Passwords don't encrypt data directly. The account key is wrapped with an Argon2id-derived password key.
  • Recovery codes. Signup gives you a one-time code that can unwrap the same account key if you forget your password. Save it.
  • Automatic migration. Older plaintext histories are encrypted on first login after the update.
  • HTTPS by default. Local certificates are generated for Linux and Windows (LAN addresses included), and HTTP redirects to HTTPS. Using Jun on your LAN no longer means sending passwords and chats around in plaintext.
  • Sturdier public TLS. Certbot retries failed issuance, and nginx picks up new or renewed certificates without a ritual of container restarts.
  • Authenticated sidecars. TTS/STT/karaoke require the generated sidecar secret, validate hosts and content types, and reject browser-origin requests that shouldn't be there.
  • Stricter limits. Body sizes, pending stream data, generated content, error responses, thinking tokens and turn duration all have ceilings.
  • Fail-closed state. If the database or rate limiter breaks, Jun OS no longer decides security is optional today.
  • No more unsafe-eval in the CSP. PIXI's requirement is handled locally.
  • Serialized first-account bypass. Two people racing signup on a fresh instance can no longer both become "the first account." Why? How could that happen? Then i remember that edge case that worked because a User used their samsung fridge as a browser
  • Hardened asset recovery. Texture crop bounds, filenames and output paths are validated before Pillow/Unity touch anything.
  • Android parity. The Android local server got equivalent route, origin and method checks for sensitive operations.

Installing it should hurt less

  • Windows is one download now. Grab JunSetup-<version>.exe from this release and double-click it. The PowerShell command is still there if you'd rather read the script first.
  • Installs never land on main by accident. If GitHub can't be asked which release is current, the installer stops and tells you instead of quietly installing whatever was pushed today. Experimental is still in the Custom menu if you want to have a spicy life.
  • Smarter Express mode. It detects your hardware, picks sane defaults, recovers the Live2D assets and gets out of the way.
  • One installer, two faces. The Windows GUI installer still runs the real installer underneath; there's no second implementation drifting out of sync.
  • Ollama skips Winget. Windows downloads Ollama's signed installer directly, verifies its Authenticode signature and runs it, so a broken Winget can't block the biggest download anymore.
  • Docker group is opt-in. Linux asks before adding you to the docker group (Express included) and falls back to sudo if you'd rather not.
  • Corrected GPU tiers. E2B, E4B and 12B defaults now better match the VRAM they actually fit in.
  • Smarter prewarming. Ollama starts the chosen model with the real context size and persistent keep-alive, instead of warming one runner and replacing it on your first message.
  • Clean MTP fallback. Chat, consolidation and title generation share one fallback path, so a failure no longer spawns a second giant runner that evicts the working one.
  • uninstall.sh for Linux. It backs up your state first, because uninstalling shouldn't double as a data-destruction speedrun any%.
  • Step-by-step install guide in the wiki for Windows, Linux, NVIDIA, AMD and CPU setups.
  • Release channels. Fresh installs land on a release instead of whatever was on main that day, and the installer that ships with each release is the one that sets it up.
  • Versioned JunSetup-v1.0.0-beeeta.exe. Each release's exe installs exactly its own version and checks the commit hash before it sets anything up. JunSetup.exe is the same file under a name that never changes, so links to it don't break.
  • llama.cpp on Windows is pinned to a known build, and older installs get upgraded instead of failing on start.
  • A Windows installer that explains itself. Errors come in plain words and the window stays open until you've read them. It won't install into System32, Program Files or OneDrive, warns before you run out of disk, and a download that dies halfway no longer blocks the next attempt.

Under the hood (for contributors)

There was a fairly unreasonable amount of internal cleanup.

  • PHP backend split out of giant helper files into api/lib/, with dedicated provider, chat, memory, crypto, relationship, trip and consolidation modules.
  • Voice server split into TTS, STT, karaoke, device, state, audio and request-gate modules, instead of one Python file slowly becoming sentient.
  • Frontend is now a real ES-module graph: core/, app/, live2d/, outfit/, wardrobe/, mods/, voice/, karaoke/, trip/. app.js is basically the login gate; the app loads after you authenticate, so the login screen no longer downloads half the JavaScript ecosystem before asking for your password.
  • Wardrobe/mods broken into catalog, state, sync, color, preset, ZIP, layer and UI modules.
  • Live2D renderer split into state, parameters, renderer patches, input, baking, actions and touch handling.
  • Deduplicated plumbing. JSON handling, auth, rate limiting, sidecar requests, provider calls and session cookies are no longer implemented five subtly different ways.

CI now does more than check that PHP brackets match. It covers a full streamed chat turn against a fake Ollama server, tool-call round trips, prompt/cache invariants, lore and live-context injection, relationship/mood tags, memory writes, generated titles, SSE stream filtering, sidecar failures, API routing/security, workflow syntax, Colab notebook cells, cache-buster consistency and internal asset references.

There are also issue and PR templates, CONTRIBUTING.md, SUPPORT.md and a Code of Conduct now. We've become alarmingly organized.

Smaller fixes

  • Conversations past 160 messages keep working; old messages are trimmed from the request instead
  • Multibyte UTF-8 titles no longer get cut mid-character and break the conversation list JSON
  • Fast blackjack games no longer trip the chat rate limit
  • Parallel karaoke stem requests no longer fight over the same SQLite cursor
  • Page loads no longer queue behind the API-focused nginx rate limiter
  • FLEE_BANS=off actually reaches the container now, instead of being purely motivational
  • Invitation buttons carry their invite state all the way to the backend
  • Accepting an invitation in plain prose starts the trip even if the model forgets the tool call
  • memory_write action tags no longer swallow the next field into the category name
  • Browser cache versions are checked much more aggressively after the module restructure
  • The model runner reports CPU mode instead of displaying absolutely nothing, on llama.cpp too
  • The old "window and buttons" PowerShell command from the alpha docs never actually worked on its own. It's gone; JunSetup.exe is that window
  • A good number of stale comments and documentation lies were removed

This is beta software.

Slightly more responsible than alpha, but there are still bugs I haven't found. With this many moving parts, some of them are probably hiding from me on purpose.

If something breaks, open an issue with what you were doing, your platform, provider/model and logs if you can. "it broke" is emotionally relatable and technically useless.

As before: Jun's original Live2D assets are NOT included. They belong to My Dystopian Robot Girlfriend. Jun OS rebuilds what it needs from your own copy of the game, and the recovered files stay local and gitignored. Please don't redistribute them.

Jun OS is still local by default. Model downloads, optional lyrics lookup, Jun's web-search tool, certificate issuance and OpenRouter can reach the internet on purpose. Your local conversations aren't being shipped anywhere, there's no telemetry, and I really don't want your nasty chat logs.

Actually thinking about it i could laugh a bit. if you want to share em send them to my discord: @effx__

Well... This got slightly out of hand.