Hi, I'm Cameron Ottley
Software engineer with a passion for writing software to solve random problems in my life.
View my ResumeContact Me
- ✉️ Email: cameron.ottley@gmail.com
- 💼 LinkedIn: linkedin.com/in/cameron-ottley
- 👨💻 GitHub: github.com/ottles91
About Me
- 🎓 Graduated cum laude from Utah Valley University in 2025 with a Bachelor's in Software Engineering
- 📱 I build software to solve oddly specific problems in my everyday life
- 🌆 Self-hosting an Immich server to avoid paying for Google Drive storage
- 🍿 Always tweaking my Plex setup instead of actually watching anything
- 🎮 Retro gaming nerd—constantly fiddling with my EmulationStation setup
- 🥾 Probably out hiking on the weekend if the weather's decent
Featured Projects
Flare
Swift-based social iOS app with backend API written in C#
- Swift: Built to take advantage of the newest technologies avaialble on iOS
- Swift UI: Used to create a responsive UI that feels natural and intuitive to iPhone users
- C#: API development using .NET Core
- Docker: Used for API containerization and local deployment
- AWS: Used for mass API deployment
- MySQL: Used for data storage and user relationships
- Links:
PokéFamilyDex
A Python script to aid in organizing Pokémon HOME boxes evolutionary family & National Pokédex order
- Used Python for data retrieval, normalization, and sorting
- Integrates with the PokéAPI to pull and cache Pokémon evolutionary data
- Build to handle edge cases, such as alternate forms and split evolutions
- Focused on clean architecture and reusability
- Links:
My Tech Stack
Languages
- 💻 C#
- 🐍 Python
- 📱 Swift
- ⚙️ C/C++
- 🗄️ SQL
- 🌐 HTML/CSS/JavaScript
- 🔧 Rust
- ☕️ Java
- 👨💻 Bash
- 🪛 Assembly
- 🦆 DuckyScript
Tools & Platforms
- Visual Studio/Visual Studio Code
- Xcode
- Git & GitHub
- Jira
- Figma
- MySQL Workbench
- Docker
Frameworks & Libraries
- SwiftUI/UIKit
- .NET Core
- Entity Framework
- Pandas/Requests/Flask (Python)
- Highlight.js
How I Work
- Git: I use Git to manage my codebase, keep branches clean, and make frequent commits that tell a clear story.
- Agile/SCRUM: I've worked in SCRUM teams where I contributed during sprints, standups, and retrospectives to keep momentum going.
- Rapid Prototyping: I like to get a working MVP up and running quickly so I can test ideas early and iterate based on how it actually feels to use.
- Test-Driven Development (TDD): I write tests early to catch issues before they happen and to keep my code easy to refactor later.
- Reverse Engineering & Customization: I enjoy tinkering under the hood—whether it's customizing Android with Magisk or rooting devices to understand how they work from the ground up.
- RESTful APIs: I've built and tested APIs using Postman and Swagger, and I like making sure each endpoint is both clean and well-documented.
- Accessibility Focus: I keep accessibility in mind when designing UIs—I want the tools I build to be usable by as many people as possible, not just tech-savvy users.
- Human-Centered Design: I aim to build interfaces that make sense to real people—even the ones who don't care how it works under the hood.
My Development Philosophy
My software development journey began in 2007 when I accidentally landed in a high school Computer Science class. I could have dropped it, but I was instantly hooked by the idea that I could create something functional—even something as simple as a Fahrenheit-to-Celsius converter. I've always thrived on the feeling of writing code and seeing it actually work. Over the years, I've picked up new languages, tools, and experiences that have shaped me into a stronger developer. Along the way, I've also developed a personal philosophy around how I approach building software. Here are a few of the values that guide my work:
- Clean, maintainable code: I prefer to be clear rather than clever. I want my code to be readable, reusable, and easy to debug—especially for future me
- Building for edge cases: I've always enjoyed anticipating and handling strange inputs, incomplete data, and inconsistent formatting
- Iterate & Refine: I like to quickly build something that works, then gradually improve it until it aligns with my vision
- Automate the Boring Stuff: I don't need to write boilerplate code for the 314th time. If I find myself repeating something too often, I'll find a way to automate it
- Software with a Purpose: Most of my projects are driven by a desire to solve a specific problem in my own life. My hope is that others are looking for similar solutions
- Generative AI as an Aid: I use generative AI to help myself work more efficiently; I allow it to do what it does best and I do what I do best
- Human-First Design: I value intuitive, accessible interfaces that empower users—regardless of their technical prowess
My Tech-Related Hobbies
Immich Photo Server
You know how iOS and Android try to be helpful by automatically backing up all your photos? I think that's great—I love the peace of mind that comes from knowing I won't lose everything if my phone takes a swim while I'm rafting. But I'm also frugal, and I'm not a fan of paying Apple or Google's inflated cloud storage prices.
Immich is a self-hosted alternative to Google Photos that offers automatic backups and a familiar browsing experience. With a little tech know-how and a Docker container, you can set up your own private photo server and get most of the same features—without the monthly subscription.
Android Rooting
While I use an iPhone as my daily driver, I picked up a Google Pixel 6a on sale a few years ago out of curiosity. I never planned to use it as my main phone—I just wanted to experiment with rooting without the risk of bricking my primary device.
As a developer, I love how rooting lets me dig beneath the surface of Android and customize the experience down to the smallest details. I've explored tools like Magisk and Tasker to automate tasks, tweak system behavior, and streamline the interface. It's incredibly satisfying to work with the OS at such a low level and see the impact of my changes in real time.
Emulation Station & RetroArch
I've had a fascination with retro games for as long as I can remember. As I've grown older, I've become increasingly interested in game preservation. Many of the titles I loved growing up have become difficult—or outright expensive—to access, and the companies that could preserve them (hi, Nintendo! 👋) don't always seem interested in making their older catalogs available. How am I supposed to play Pokémon Alpha Sapphire without shelling out for a used 3DS and an overpriced cartridge on eBay?
Enter Emulation Station and RetroArch, which gave me the tools to build a highly customizable retro gaming setup. I picked up a Retroid Pocket 5, and with a little bit of tinkering, I turned it into a fantastic portable emulation device. I enjoyed fine-tuning button mappings, aspect ratios, and performance settings to create a system tailored to my preferences.
As an added bonus, the Retroid Pocket 5 runs Android, so many of the skills I developed while rooting and customizing my Pixel 6a carried over. It's been a great way to blend my love of retro gaming with my passion for low-level software customization.