Vitor VenturiniOS Engineer - Swift Developer - Mobile App Development
Portfolio
About Me
Professional Background
With over 10 years of experience in software engineering, I worked with many different programming languages and frameworks. My core expertise is Swift but I am always excited to expand my skill set.
International Experience
Since 2017, I have been living and working in the Netherlands, which has broadened my perspective and enhanced my ability to work in diverse, multicultural environments. Prior to this, I lived and worked in São Paulo, Brazil.
Progressive Mindset
I approach both my work and worldview with a progressive mindset. I believe in creating technology that positively impacts society, promotes inclusivity, and contributes to a more equitable world.
Seeking a Positive Work Environment
I am specifically seeking opportunities with smaller, more agile organizations. I believe these environments often foster more creativity, allow for greater individual impact, and maintain a healthier work-life balance.
Mojo Player
MOJO is a free, ad-free music player that brings your scattered music collection together in one place. Import tracks from YouTube, YouTube Music, Bandcamp, and SoundCloud, and MOJO organizes everything into a clean library by artist, album, and playlist, with a built-in player. Everything lives on your device: no cloud required. It is the mobile evolution of Musicalibre, the original web scraper.
Role: Founder and sole developer, from product and design to both native apps and release.
Highlights
Shipped native apps on both platforms: Swift and SwiftUI on iOS, Kotlin and Jetpack Compose on Android.
Built a multi-source import pipeline that turns tracks from different platforms into one consistent library.
Built CI/CD pipelines for different app variants: Debug, QA, Alpha and Release (Prod).
Designed a custom dark design system (amber accent) applied across Library, Now Playing and Search.
Growing an organic early user base with no paid promotion.
Design
Designed the UI in Wonder: one “Mojo Player” file with an artboard per screen (Library, Album Detail, Artist Detail, Now Playing), in dark and light variants.
Design tokens (colors, typography, shapes) were read straight from the artboards into a token layer in code, so screens never use raw hex values.
Reusable Wonder pieces (tab bar, mini player, pills, media cards, track and album rows) became a shared component layer, and each screen is composed from it.
Every screen and component is guarded by screenshot tests, so the build stays faithful to the design.
LibraryAlbum DetailArtist DetailNow Playing
Backend
Built the MOJO backend in Python with Flask, exposing a REST API consumed by both the iOS and Android apps.
The API receives a track link, resolves it on the source platform and returns the audio and metadata for the app to store locally.
Appron is an internal app made by IBM for KLM. It is exclusive for iPad and mainly consists on a checkup list for all flights. It is fed by different subsystems and shows the number of passengers, luggages, fuel, dangerous goods, delays, estimations, containers, etc.
Client:
IBM for KLM
Date:
2022-2024
Service:
Enterprise iOS
Sonora
Sonora is an app for foley artists and sound explorers: type a word and it becomes a sound on your screen. Mix 'tropical rain' + 'helicopter flying' + 'battlefield', drag the sound objects around to shape volume and panning, and add effects to each one. It started as a Godot app for iOS and Android and was later rebuilt as a native Android app.
Role: Sole developer, from concept and sound design to both store releases.
Highlights
Built the original app in Godot with GDScript and shipped it to the App Store and Google Play from one codebase.
Integrated the Freesound API: text search plus a “word + number” syntax that finds sounds around a given BPM (for example “Techno 120”).
Every search result becomes a draggable sound object with its own audio bus, so each sound gets independent volume, pitch, looping and effects.
Covered the core (effects, sound objects, API, input) with unit tests using the GUT framework, run on GitHub Actions.
Native Android rewrite
Rebuilt the app in Kotlin and Jetpack Compose to get true multi-touch: every bubble handles its own pointer events, so several sounds can be dragged at once with different fingers, which Godot’s input model did not allow cleanly.
Wrote the audio effects by hand as Media3 audio processors: reverb (Freeverb, with room, hall and plate presets), delay (slapback, ping-pong, tape), chorus, phaser, flanger, distortion, filter, compressor, bitcrush glitch and stutter/repeat.
Designed a custom rotary knob control and a color-coded effects panel in a bottom sheet.
Added recording of the full mix with Android’s playback capture, saved as WAV and ready to share.
Multi-touch dragging is covered by instrumented UI tests.
A tribute to Knightmare, the Konami game released in 1986 for MSX computers. I started this remake myself with the Godot engine: an action game with exploration, combat and a boss battle.
Role: Sole developer: game design, programming and music.
Highlights
Four levels, each with its own environment and challenges.
Light and dark variants of the weapons, which adapt to the level.
Boss battle with an animated boss and multiple attack phases.
Collectibles: coins, health potions and speed potions.
Soundtrack mixing the original MSX music with my own remixes.
With Memefy you decorate photos with funny, 100% original stickers and turn them into memes. I built the app from scratch, and my sister was responsible for UX, UI and illustrations.
Role: Sole developer of the iOS and Android apps. UX, UI and illustrations by my sister.
Highlights
Built the original iOS app with UIKit: custom components, stack views, direct manipulation of view layers and a stack data structure behind the editor.
Meme editor based on multi-touch gestures: move, pinch to scale and rotate stickers and text, with layer ordering.
Backed by Firebase: Database, Auth, Messaging, Storage, Analytics and Crashlytics.
Started a 2025 rewrite of the iOS app in SwiftUI, moving local storage to SwiftData and adding Google sign-in.
Android
Android version with its own touch system for gesture-based editing of stickers and text.
Migrated the codebase from Java to Kotlin, moved the camera to CameraX and added Android 15 support (16 KB page size).
Stickers are served from Firestore with a local offline fallback and image caching.
Backend
Wrote a Firebase Function in Python that checks uploaded images with an NSFW filter before they are shared.
For Itaú bank, we created the mobile banking app from scratch. This is one of my favorite works and it has opened many opportunities to me. The app is rated 4.7 on App Store Brazil and it has more than 1,3 million evaluations.
Role: iOS developer, responsible for UI components and screens.
Highlights
Part of the team that created the app from scratch.
Built the UI components: custom alerts, virtual keyboard, buttons, styles and menu.
Built screens for billing, transfers, chat, payments and favorite shortcuts.
Sopa is a catalog of recipes in Portuguese: browse a photo grid, search by title or ingredient, and follow each recipe step by step with a carousel of images. Recipes can be read aloud, in a Brazilian or European Portuguese voice. It started as a native iOS app and grew into Android and web versions.
Role: Sole developer of the iOS, Android and web versions.
Highlights
Built the native iOS app in Swift with MVVM and the Coordinator pattern, using protocols for dependency injection and testability.
Recipes live in Firebase Firestore with offline persistence, so the app keeps working without a connection.
Text-to-speech narration of recipes with a choice of Brazilian or European Portuguese voice.
Pinterest-style photo grid, parallax header on the recipe screen, and recipe sharing.
Refreshed the app in 2025 (version 1.1): safer concurrency around Firestore setup, fewer third-party dependencies, updated unit tests.
Android and web
Built the Android version in React Native with TypeScript: paginated recipe list, masonry grid, debounced search over title and ingredients, light and dark mode, Jest tests.
Built a Progressive Web App in React: masonry grid with infinite scroll, offline support through a Workbox service worker, automatic dark mode, hosted on Firebase.
For Safra bank, we built a very detailed prototype of the mobile banking app, covering its main features and screens, and tested it directly with users.
Role: iOS developer on the prototype team.
Highlights
Built a detailed prototype with the main features and screens: invoice, investment charts, card billing, chat, payment log and shortcuts.
Interviewed users with the prototype in hand, collecting instant feedback on what they liked, disliked and wanted improved for the next version.
Design your future home and shop for home furnishings through an immersive Augmented Reality experience with Curate by Sotheby's International Realty(sm) brand powered by roOomy. Built as a visualization tool for homebuyers, renters and real estate agents, it lets you see how furniture and décor will look, feel, and fit as you envision your home. Interact with the products you love and tap to purchase them on retailers' websites.
Role: iOS developer in a small team that built the app from scratch.
Highlights
Augmented Reality furniture and décor placement built on ARKit.
Universal app, supporting both iPhone and iPad.
Structured with the VIPER architecture.
Worked with CI/CD, code reviews and unit testing as part of the team workflow.
Tech
ARKit, VIPER, ReplayKit, CoreData, CI/CD, unit testing
Bela is a tiny wallpaper and screensaver web app. It fills the screen with photos and scrolls through them one at a time, endlessly, turning any idle screen (TV, tablet, laptop) into a photo frame.
Role: Sole developer.
Highlights
Single-page React app with no backend: it runs entirely in the browser and is deployed as a static site on GitHub Pages.
Photos auto-advance every 10 seconds and are centered on screen whatever their orientation, portrait or landscape.
Started with Unsplash as the photo source, then moved to the Google Photos Picker so people can use their own photos.
Picked photos are downloaded once and cached in IndexedDB, so the screensaver keeps working after a reload without signing in or picking again.
Google sign-in is handled with Google Identity Services and silent token renewal, with no server-side secret.
Tech
React, JavaScript, Google Photos Picker API, Google Identity Services, IndexedDB, GitHub Pages