[v1.0.0] – 2026-10-02
First stable release. Update: AUR yay -Syu linuxvr-viewshot or the new AppImage – open the app once, it copies the new layer + background service to ~/.local by itself (or press ⬆ Update layer). From a clone: 🔧 Rebuild & install. Then restart the VR game.
- 👋 Welcome on first start: three short windows – the app is only for setup/installing, afterwards everything happens in VR · install now (🔧 Install now / Later, skipped if already installed) · set up your translators → OK opens Options → Translation. Shown once (
welcome_donein ui.json) - 🇫🇷 French as app language (Options → General → Language), all texts in
UI/core/i18n_fr.py; missing texts fall back to English. The VR panel of the background service speaks French too - 🔘 Button to open/close the panel (like WayVR) – drawn by the layer on the same anchor as the panel (default: on top of the anchor hand, 3 cm, right hand mirrored; head: bottom left; world: in front). Laser + trigger toggles the panel (white ring = open), state is kept in
panel_state.json. Edit mode: button and panel move/rotate (grip) and resize (bottom right corner + trigger) separately – ownbutton_pose.json; a new panel appears above the button. ⟲ resets both. Options → Shot and ⚙ in VR: button on/off, Open when translating (closed panel opens after a photo, on by default), button size (2–20 cm), button colour (7 colours in VR, colour picker in the app). - Faster size switch between translation and gallery: the layer checks
panel_pose.jsonevery 80 ms instead of 500 ms - 🖼 VR panel: pages + gallery – at the bottom ◀ left / ▶ right switch between 🌐 translation and 🖼 gallery (● ○ shows where you are), ⚙ stays at the top. Size per page: translation and gallery each keep their own width/height in VR (
panel_sizes.json), the gallery is bigger by default (48 cm) and opens big right away. The gallery fills the whole panel: 4 thumbnails per row with month dividers, ▲ / ▼ pages next to ⚙. Tap = photo large with 📋 Copy · ☁ Upload + link · ↗ Share · 🌐 Translate · ⓘ Info · 🗑 Delete (tap twice → trash) and ‹ ›. Same in the app and in the background service (it copies via wl-copy/xclip, uploads to directupload.eu, shares, moves files to the trash itself). The app's panel works right away - 📁 Gallery folders – ⚙ in the desktop gallery: photo folder (fixed) + more folders (e.g.
~/Pictures/VRChat), change / remove, include subfolders for each. Desktop + VR gallery show all of them, newest first; only ViewShot photos are translated. Thumbnails load in the background (no freeze with thousands of screenshots) - 📅 Month dividers in the desktop and VR gallery (“──── 2026 October ────”)
- Options → Translation: Settings for dropdown – set up any service without switching Main; 🧪 Test checks the service shown
- Service dropdowns grouped: “── Translation ──” (Lingva, Google, LibreTranslate, DeepL, own API) and “── AI translation ──” (Claude, Gemini, ChatGPT, own command, image LLM) – main page, options and VR panel
- 🕘 History on the main page moved to Options → General (card Main page)
- Fix – share to Discord: Vesktop / Discord / WebCord are also found as Flatpak (e.g.
dev.vencord.Vesktop) - 🪟 Panel: ⚙ settings instead of the edit/reset buttons – they slide down from the top like on a phone (a few frames; the layer now checks the panel image every 80 ms): size slider (panel width 15–80 cm, also in Options → Shot), opacity slider (click anywhere on the bar with the laser), attach to 🤚 left / ✋ right hand, 👤 head, 🌍 world, ✥ move (grip), ⟲ reset position, detection & buttons (auto/manual, shutter, type button). Same in the app's panel and in the background service
- 🪟 Panel: long translations are split into pages that fit – ▼ below the text shows the next page, ▲ goes back (1 / 3)
- 🪟 Panel: mode 🤖 automatic / ✋ manual right in the service list
- Round laser dot instead of the small square
- 🔧 Rebuild shows % – cargo's progress (
Building … 120/231) becomes the percentage on the button; the progress lines stay out of the log - ⚙ Works without the desktop app: new background service
viewshot-daemon(Rust,daemon/). It does what the app did in the background – new photo → text recognition → translation → 🪟 VR panel, and 🔁 Lens with the overlay – so the app is mainly for settings and for looking at what you did (gallery, history). Same PaddleOCR models as RapidOCR via onnxruntime (identical text, boxes ±1 px), same services, same auto/manual routing, sametranslations.jsoncache and history – the app shows the service's results without asking again. Start: the layer sendshelloto 127.0.0.1:47932 during a VR game and systemd (socket activation) starts the service; it quits ~2 min after the game (the OCR model leaves memory after 1 min idle). Options → Shot → Without the app: off / every VR game / only selected games (recently played games to tick + own names). While the app is open it holds~/.local/state/linuxvr-viewshot/app.lockand the service steps aside. The app copies the service, onnxruntime and the OCR models to~/.local/lib/linuxvr-viewshot/and sets up the systemd user units (also AppImage / AUR). Custom snippet translator ("Eigene API") only with the app. Log:~/.local/state/linuxvr-viewshot/daemon.log.daemon/contract.json(texts, defaults, cache keys, prompts) is generated from the app and checked by tests on both sides. - ↻ Send again really asks again (the saved answer used to come back)
- 🪟 Translation panel in VR (Options → Shot, on by default): a window with the photo and numbers ①②③ on the recognised lines and the translations 1, 2, 3 below (AI answers as text). Service, task, from → to and ↻ right in VR: point with the controller (laser) and press the trigger – lists instead of dropdowns. Attached to the left/right hand, head or world. ✥ Edit mode (yellow border): grip = move, corner lights up + hold trigger: bottom right = width, top left = height; opacity − / + (30–100 %, also in Options); ⟲ reset position in the panel or in Options. The app draws the panel (invisible Qt window →
panel/panel.png), clicks come back via UDP (port 47931). Grip/trigger still reach the game. - 🥽 🔁 Lens: translation over the original (Options → Shot, off by default): a grey box with the translation over every recognised line inside the blue frame, updated with every new picture. Photos are shown in the 🪟 panel instead (photo overlay removed from the layer too,
overlay_secondsis gone). The app draws the image (overlay/overlay.png), the layer shows it. If the number of lines doesn't match (e.g. AI answers) there is one big box over the text. - 🖼 Local image LLM (Ollama) – new AI service: gets the photo plus the OCR lines, answers line by line (fits the VR overlay), fixes OCR mistakes and reads text OCR missed. Streaming, all AI tasks, model dropdown with the installed image models, 📥 Download model, and Keep in graphics memory (30 s … always) so VR gets the memory back. 📦 Install Ollama button: on Arch/CachyOS the pacman package that fits the graphics card (NVIDIA →
ollama-cuda, AMD →ollama-rocm, elseollama) +systemctl enable --now ollama, on other distros the official script from ollama.com – runs in a terminal, hidden once Ollama is installed. - Text recognition now also keeps the position of every line (cached)
- Answer question: the lines go to the AI numbered (1), 2), …) – the answer names the number (➜ ③ …), the same number as on the photo in the panel. Image LLM: first a short quiz? yes/no, then either a quiz prompt or a line-by-line translation (small models do two small steps much better than one big one)
- 🧭 Service per task (Options → Translation, one card): Mode 🤖 automatic / ✋ manual, Main, Explain context AI, Answer question AI (model = the one set for that AI, also changeable there). 🤖 Automatic (only with an AI as main – LibreTranslate & Co. switch the mode to manual): for every photo the main AI decides with a one-word question (QUIZ / EXPLAIN / TEXT), translates normal text itself and hands the rest to the task's AI. Picking a task on the main page / in the VR panel overrides it for the current + next photo, then it's automatic again. ✋ Manual: the task you pick stays, with its fixed AI
- 🏷 Last AI under Task (main page + VR panel): which AI, model and task wrote the answer shown; remembered per photo in the cache, stays until the next answer
- The service no longer switches automatically: if a service fails, Lingva/Google step in once and your setting stays
- Image LLM thinks first: for quizzes it first writes the full proverb/idiom/fact (💡 line), then picks the number – small models no longer just pick the first option as often