ZDGNS Museum Guide
A native mobile museum guide for the Slovenian Association of Deaf and Hard of Hearing — with 360° panoramic tours, QR-activated exhibits, interactive quiz, and full bilingual support. Built solo, simultaneously, for both Android and iOS.
Overview
As the sole developer, I owned both platforms end-to-end — Kotlin for Android, Swift for iOS — delivering a full-featured museum companion app for the Association of Deaf and Hard of Hearing Societies of Slovenia (ZDGNS). The app launched alongside a physical exhibition at the Hiša znakovnega jezika (House of Sign Language).
The core challenge was accessibility: the primary audience is deaf and hard-of-hearing, which meant the entire UX had to work without any audio cues, with high-contrast images, clear iconography, and sign-language-community-sourced content throughout. The app connects to the client’s WordPress CMS via the WP REST API for the technical aids catalogue and history feed, while the 40+ museum exhibit stops are bundled as static data assets — meaning the guide works reliably in environments with poor connectivity.
The 360° virtual tour is rendered inside a native WebView shell pointing to the client’s hosted panorama (zveza-gns.si/virtualni-sprehod/), giving visitors a gyroscope-driven immersive walk through the museum space without requiring a separate VR app. QR codes placed at each physical exhibit panel trigger deep-link navigation directly to the relevant content in-app.
App mock
Architecture
Reading the diagram: Both native apps share the same content structure but have zero shared code — each platform implements its own navigation, language switching, and media handling. The exhibit guide (40+ stops), museum images, translations, and QR assets are bundled at install time, so the guide works offline. Network is required only for the WordPress-backed technical aids catalogue, the hosted 360° panorama, and the quiz.
Six things shipped,
three hard ones solved.
Key contributions
- Built both native apps simultaneously — Kotlin on Android, Swift on iOS — from scratch, solo.
- Implemented QR-code scanning per exhibit: visitors scan a panel code and the app loads the exhibit detail inline.
- Integrated 360° virtual tour of the museum via a hosted panorama rendered inside WKWebView / Android WebView, with per-exhibit deep-link navigation.
- Delivered an interactive quiz module backed by the client's WordPress REST API.
- Implemented runtime bilingual switching (Slovenian / English) — no app restart required on either platform.
- Built the Technical Aids catalogue — fetching posts from the zveza-gns.si WordPress CMS via WP REST API.
- Designed the Museum Guide section with 40+ exhibit stops, each with image, title, descriptive text, video button, and a 360° shortcut.
Challenges solved
- Parity across two fundamentally different native stacks — same UX, same feature set, zero shared code.
- Accessibility-first design for an audience that includes deaf and hard-of-hearing visitors — no audio cues, reliance on visual feedback throughout.
- Embedding a hosted 360° panorama seamlessly inside a native shell while keeping navigation and back-gestures intact.
- Runtime language switching without restarting the activity/scene — required rebuilding the root view controller hierarchy on both platforms.
Shipping the same product on two platforms at once means you're making every architectural decision twice. The discipline that forces is worth it.
What's under the hood.
¿Listo para arreglar, construir
o escalar?
30 minutos, conmigo personalmente. Leo tu sistema como un archivo de logs y te digo qué haría primero. Sin presentaciones, sin embudo de ventas.
— Davor Majc, fundador, Numen