Golblick
Read, inspect and render 360-camera files on Linux.
- gol /ɡol/ adjective
- Marathi गोल, borrowed from Sanskrit गोल (gola). Round, circular; in geometry, cylindrical or spherical.
- blick /blɪk/ verb
- German, the singular imperative of blicken: to look, usually in a certain direction or toward something.
Why?
I've been into photospheres since 2014-ish. My first 360 camera was a Nikon KeyMission (yes, yes... I know...) which saved images in standard formats. Then, along came Insta360 with their .insp and .insv shenanigans. It didn't bother me till earlier this year when two things happened:
- I got sick and tired of Windows 11 and just how hard Macro$lop was enshittifying it and finally migrated to Linux.
- I decided I'd rather pay once for hardware upfront, cancelled all my cloud subscriptions, and built a little Proxmox-based home server and fully migrated to Nextcloud.
Then I realised that Insta360 has no desktop app for Linux, and there was no way for me to view all my Photospheres on my PC or on Nextcloud. I didn't want to run Insta360 Studio in an emulator and I couldn't find any other solution for Linux & Nextcloud.
But Slopinators exist now, so I asked one to help me.
An Insta360 .insp opens in any image viewer on Linux, but as two fisheye circles side by side. Turns out that everything you need to turn those circles into a panorama is in a trailer at the end of the file, in plain ASCII and protobuf, readable without any of the vendor's code.
Golblick reads that trailer and renders a levelled panorama that any 360 viewer will open as a sphere. A companion Nextcloud app shows them as panoramas in Nextcloud Files, Photos and Memories, with a button to look around each one as a sphere.
https://github.com/user-attachments/assets/60cfc859-e7f0-4d17-9321-0f0ac0c8ee87
🚩 Please read this before you proceed
All of the code and much of the text here was generated by Claude Code, mostly with Opus 5, then Fable 5 and Opus 5.5; each commit names the model that made it. I directed it and tested its functionality, but I know just barely enough programming scraps to know how much I truly don't know and understand. There is absolutely no way in hell I could have built this kind of an app or written this kind of code myself. I cannot conceivably fully bug-test or security-audit it, nor can I find optimisations, issues, etc.
What I can say, however, is that
- Of the 1,438 stills from three cameras (Insta360 OneR, X3 and X5) in my photo library, 1,432 render as level panoramas (the rest are empty, or had the camera's data stripped), both from the command line and as previews in Memories on throwaway Nextcloud 33 and 35 instances in Docker, running locally, and on my prod Nextcloud AIO v14.2.0 server without anything breaking.
- The Nextcloud app only reads files and generates previews, but it needs a line in Nextcloud's config, and that line has side effects worth reading about in the app's README before you add it.
- The code has not borked anything on my desktop running Kubuntu 26.04
probe,triage,reportandvendorsonly read files.thumb,preview,renderandstabilisewrite one new file, next to the original unless you pass-o. They will overwrite an existing file with that name, but refuse to write over the file they are reading.sharewrites copies into a new folder,golblick-shareunless you pass-o, and won't overwrite a copy that's already there.
- The Nextcloud app's video support (stitching, steadying, Memories, and baking the steadying in on a GPU) ran first on test instances (the official Nextcloud Docker image and a copy of AIO v14.2.0), and since 0.5.0 on my prod server too, with an NVIDIA T1000 for the baking.
⚠️ YMMV
- Try it somewhere disposable first, like a throwaway system or a test instance. Don't point it at originals until it does what you want.
- Keep backups of anything you care about (which for photos you should be doing anyway).
It might work for you.
It might not.
I do not claim to know.
What it does
| 🧭 Triage | Pairs each video with its low-resolution copy (.lrv) and lists the clips whose full-quality video is gone, so you know what exists only in low resolution before you delete anything. Goes by filename, so it takes seconds on a whole library |
| 🔍 Probe | Shows what the camera stored in a file: model, firmware, lens calibration, and which data blocks are present |
| 🔒 Share | Copies photos for sending to someone else, without the location, the dates or the camera's serial number, and otherwise unchanged |
| 📝 Report | Summarises a file for an issue on GitHub, without its name, folder or the camera's serial number, and links to the right form: a problem with a photo or a video, or a camera golblick hasn't been tested with |
| 🖼️ Previews | Extracts the camera's own preview, if available (e.g. the Insta360 X5 already has a stitched pano) |
| 🎯 Stabilise | Works out, from the camera's motion sensor, the rotation that steadies each frame of a 360 video, and writes it as JSON |
| 🌐 Render | Projects the lens pair into an equirectangular panorama with GPano metadata, levelled against the camera's own stitch where the file has one (X5), otherwise from its motion sensor where possible. The seam between the lenses is placed per photo, where the two lenses agree best. A video is stitched whole into a 360 MP4, steadied |
| 🖥️ Desktop | Double-click a .insp photo or .insv video in your file manager to look around in it, in golblick's own viewer window. The graphics card projects it as it's drawn, so a photo is on screen in about a second and a video plays steadied with nothing stitched first |
| ☁️ Nextcloud | A preview app, so .insp stills show up as panoramas in Files, Photos and Memories, zoom included, and open as a sphere from a button. No extra server dependencies for photos. Optionally, .insv videos too: the server stitches them in the background with ffmpeg into ordinary 360° MP4s, which play as a steadied sphere from Files and can show up in Memories' timeline. Works alongside files_photospheres |
Cameras
| Camera | Status |
|---|---|
Insta360 OneR, X3, X5, stills (.insp) |
✅ Read, rendered and levelled. The lens shape is measured per camera on the OneR and X3, and read from each file's own calibration on the X5 |
Insta360 video (.insv, .lrv) |
🟨 All three cameras. render stitches a whole clip into a steadied 360 MP4 (it needs ffmpeg), open plays one in the viewer window, and the Nextcloud app stitches clips in the background and plays them as a sphere, steadied from the camera's motion sensor as they play; stabilise writes the steadying rotation for every frame. People and things close to the camera can still break up where the two lenses meet |
| Other Insta360 models | ❓ Untested. Other models may store things differently - if you have one please consider contributing |
| Other vendors | ❌ None yet - if you have a camera I do not, please consider contributing |
Quick start
You need Python 3.10 or newer and uv:
uv tool install 'golblick[render]'
golblick render IMG_20260314_090809_00_007.insp -o pano.jpg
golblick triage ~/Photos
uv tool upgrade golblick updates it later. Without [render] everything except rendering still works, with no dependencies at all. pip install 'golblick[render]' works too. Each release also has the Nextcloud app, and uv tool install 'golblick[render] @ git+https://github.com/AkshayRao27/golblick' installs the latest code from GitHub instead of the last release.
To open photos and videos by double-clicking them, install [desktop] instead, which adds the viewer window (Qt, about 100 MB), and register it once:
uv tool install 'golblick[desktop]'
golblick desktop install
More
- docs/usage.md: every command, with example output
- nextcloud-app/README.md: installing the Nextcloud app, what it changes, and setting up videos
- docs/formats/insta360.md: what is known about the Insta360 container, and how everything was measured
- docs/accuracy.md: how renders are checked, and the blind spot of each check
- CONTRIBUTING.md: reporting issues, and testing a camera I don't have
- docs/development.md and AGENTS.md: working on the code, by hand or with coding agents
Files named *agent-notes* hold the detailed working notes behind the docs: every measurement, how it was made, and the conclusions that turned out wrong. They're written mainly for coding agents, but anyone curious is welcome to read them.
Prior art
insv-stitch (MIT) is a video-only Insta360 X5 stitching pipeline and was a useful reference for the projection maths. It is not vendored here.
raw360-formats (MIT) and GyroView (MIT) read the X5's richer lens calibration as a unified camera model, and GyroView measured how far its scale is from the vendor's stitch. golblick's X5 lens curve follows that reading, measured again here against the camera's own panorama.
Licence
AGPL-3.0-or-later, for the whole repository. You can use, change and share it, including commercially, but if you distribute a modified version, or let people use one over a network, you have to publish your changes under the same licence. The full text is in LICENSE.
Not affiliated with, endorsed by, or connected to any camera manufacturer. Vendor names are used only to identify the file formats this software reads.
Metadata
Release files for golblick 0.8.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| golblick-0.8.1.tar.gz | 293.7 kB | With provenance | Details for golblick-0.8.1.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| golblick-0.8.1-py3-none-any.whl | Python 3 | none | any | Details for golblick-0.8.1-py3-none-any.whl |
Total release size: 451.1 kB
Release files / golblick-0.8.1.tar.gz
| Download URL | golblick-0.8.1.tar.gz |
|---|---|
| Size | 293.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
38ab678277a80bdf0c213a94a110fc1d0bb93d19e1f97f0d894f184d86c39685
|
|
BLAKE2b-256 checksum How to use checksums |
1647223c7281310e0104d8be60707177ef634efdf8187e3895dd2417640de6c8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 30, 2026.
Transparency logRelease files / golblick-0.8.1-py3-none-any.whl
| Download URL | golblick-0.8.1-py3-none-any.whl |
|---|---|
| Size | 157.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
4e21ee36a6e3b2b44b903fb155b831c7b7ddeb8cf56b2815515ef0532309261f
|
|
BLAKE2b-256 checksum How to use checksums |
8026511c28a3dd7feda4152b99ab759ac18abe3a7f7f10fc783fe449684be863
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 30, 2026.
Transparency logSecurity for golblick 0.8.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for golblick-0.8.1.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 30, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.