I’m DevCasp • a full stack developer who devs iOS apps, games, emulators, and tools. This site is my portfolio and a place where I share what I’ve been working on, the lessons I learn while deving products, and the music I make on the side. I also work with youtubers.
I’m a full-stack developer focused on mobile and game development. Most of my work lives on iOS • from utility apps and wallpapers to full games and multi system emulators. I also release the occasional Steam title and started as a web dev.
I started programming things after dropping out of high school and made youtube videos on a channel with over 10,000 subs where I shared videos about programming, ios tutorials, pc and mac tutorials, and gaming content.
Outside of apps I own a card shop named cool finds, make music, appear in the occasional video, and keep open-sourcing pieces of my work so others can learn from it. This site is the central place for everything I release.
GB • GBA • SNES • DS • 3DS
A multi-system emulator focused on performance and a clean interface for playing classic handheld and console games on modern devices.
iOS
Sideloading tools & resources
A curated place for legitimate IPA distribution and related tools aimed at developers and testers who need flexible installation options.
iOSModded iOS App Store experience
An alternative distribution platform that lets users discover and install apps outside the standard App Store flow, with a focus on community and customization.
iOS
Custom Halo Wallpapers
Create and apply custom Halo-inspired wallpapers with color controls and export options. Built for fans who want their lock screen to match their style.
iOS
Retro Style Shooter
A fast-paced 8-bit inspired survival shooter with simple controls, escalating difficulty, and that classic arcade feel on mobile.
iOSHell-Themed Puzzle Game
A dark, atmospheric puzzle game centered around Blokie. Short levels, satisfying mechanics, and a strong visual identity.
iOSTap a cell to expand the full project. Every example includes every file required and a detailed write-up.
This is a complete health system for GameMaker Studio 2 / GameMaker Studio. It tracks maximum health and current health, draws a row of hearts in the GUI layer, and provides a reusable function that any object can call when the player takes damage.
You need two sprites:
Create an object called obj_player. Put the Create Event code and the Draw GUI Event code inside it. Create a script called scr_take_damage. Whenever anything should hurt the player, call scr_take_damage(1). When health reaches zero the room restarts.
max_hp = 5;
hp = max_hp;
function scr_take_damage(amount) {
with (obj_player) {
hp -= amount;
if (hp <= 0) {
hp = 0;
room_restart();
}
}
}
for (var i = 0; i < max_hp; i++) {
var xx = 20 + (i * 28);
var yy = 20;
if (i < hp) {
draw_sprite(spr_heart_full, 0, xx, yy);
} else {
draw_sprite(spr_heart_empty, 0, xx, yy);
}
}
This replaces Apple’s TabView with a custom floating tab bar. It uses a binding for the selected index, spring animation, and ultraThinMaterial for the glass look. Works on iOS 15+.
import SwiftUI
struct CustomTabBar: View {
@Binding var selected: Int
let tabs = ["house.fill", "gamecontroller.fill", "person.fill"]
let labels = ["Home", "Games", "Profile"]
var body: some View {
HStack {
ForEach(0..
import SwiftUI
struct ContentView: View {
@State private var tab = 0
var body: some View {
ZStack(alignment: .bottom) {
Group {
switch tab {
case 0:
HomeView()
case 1:
GamesView()
default:
ProfileView()
}
}
.frame(maxWidth: .infinity, maxHeight: .infinity)
CustomTabBar(selected: $tab)
}
.ignoresSafeArea(.keyboard)
}
}
struct HomeView: View {
var body: some View {
Text("Home")
.frame(maxWidth: .infinity, maxHeight: .infinity)
.background(Color.black)
}
}
struct GamesView: View {
var body: some View {
Text("Games")
.frame(maxWidth: .infinity, maxHeight: .infinity)
.background(Color.black)
}
}
struct ProfileView: View {
var body: some View {
Text("Profile")
.frame(maxWidth: .infinity, maxHeight: .infinity)
.background(Color.black)
}
}
Complete production-ready banner implementation using the official Google Mobile Ads SDK wrapped for SwiftUI. Add the SDK via SPM, put your App ID in Info.plist, and replace the test unit ID with your own.
import SwiftUI
import GoogleMobileAds
@main
struct YourApp: App {
init() {
MobileAds.shared.start(completionHandler: nil)
}
var body: some Scene {
WindowGroup {
ContentView()
}
}
}
import SwiftUI
import GoogleMobileAds
struct BannerAdView: UIViewRepresentable {
let adUnitID: String
func makeUIView(context: Context) -> BannerView {
let banner = BannerView(adSize: AdSizeBanner)
banner.adUnitID = adUnitID
banner.rootViewController = UIApplication.shared.connectedScenes
.compactMap { $0 as? UIWindowScene }
.flatMap { $0.windows }
.first { $0.isKeyWindow }?
.rootViewController
banner.load(Request())
return banner
}
func updateUIView(_ uiView: BannerView, context: Context) {}
}
import SwiftUI
struct ContentView: View {
var body: some View {
VStack(spacing: 0) {
Spacer()
Text("Your App Content")
.foregroundColor(.white)
Spacer()
BannerAdView(adUnitID: "ca-app-pub-3940256099942544/2934735716")
.frame(height: 50)
}
.background(Color.black)
.ignoresSafeArea(edges: .bottom)
}
}
Complete Theos tweak that shows a UIAlertController with a Follow button. Uses NSUserDefaults so it only appears once. Change the filter and the X URL as needed.
#import
%hook SpringBoard
- (void)applicationDidFinishLaunching:(id)application {
%orig;
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
if (![defaults boolForKey:@"DevCaspAlertShown"]) {
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
UIAlertController *alert = [UIAlertController
alertControllerWithTitle:@"Hey"
message:@"Follow me on X for more tweaks and projects"
preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *follow = [UIAlertAction
actionWithTitle:@"Follow"
style:UIAlertActionStyleDefault
handler:^(UIAlertAction *action) {
NSURL *url = [NSURL URLWithString:@"https://x.com/devcasp"];
[[UIApplication sharedApplication] openURL:url options:@{} completionHandler:nil];
}];
UIAlertAction *dismiss = [UIAlertAction
actionWithTitle:@"Later"
style:UIAlertActionStyleCancel
handler:nil];
[alert addAction:follow];
[alert addAction:dismiss];
UIWindow *window = [UIApplication sharedApplication].keyWindow;
[window.rootViewController presentViewController:alert animated:YES completion:nil];
[defaults setBool:YES forKey:@"DevCaspAlertShown"];
[defaults synchronize];
});
}
}
%end
TARGET := iphone:clang:latest:14.0
INSTALL_TARGET_PROCESSES = SpringBoard
include $(THEOS)/makefiles/common.mk
TWEAK_NAME = DevCaspAlert
DevCaspAlert_FILES = Tweak.x
DevCaspAlert_CFLAGS = -fobjc-arc
DevCaspAlert_FRAMEWORKS = UIKit
include $(THEOS_MAKE_PATH)/tweak.mk
Package: com.devcasp.alert
Name: DevCasp Alert
Depends: mobilesubstrate
Version: 1.0.0
Architecture: iphoneos-arm
Description: Shows an alert with a follow button
Maintainer: DevCasp
Author: DevCasp
Section: Tweaks
Reusable glass-style card using ultraThinMaterial and a red stroke. Drop it into any SwiftUI file.
import SwiftUI
struct GlassCard: View {
let title: String
let subtitle: String
var body: some View {
VStack(alignment: .leading, spacing: 8) {
Text(title)
.font(.headline)
.foregroundColor(.red)
Text(subtitle)
.font(.subheadline)
.foregroundColor(.white.opacity(0.8))
}
.padding()
.frame(maxWidth: .infinity, alignment: .leading)
.background(.ultraThinMaterial)
.cornerRadius(16)
.overlay(
RoundedRectangle(cornerRadius: 16)
.stroke(Color.red.opacity(0.3), lineWidth: 1)
)
}
}
The same pattern used on this site. Elements start invisible and animate when they enter the viewport.
const observer = new IntersectionObserver(entries => {
entries.forEach(entry => {
if (entry.isIntersecting) {
entry.target.classList.add('animate__animated', 'animate__fadeInRight');
observer.unobserve(entry.target);
}
});
}, { threshold: 0.15 });
document.querySelectorAll('.animate-on-scroll')
.forEach(el => observer.observe(el));
The exact glass treatment used throughout this site.
.glass-panel {
background: rgba(12, 0, 0, 0.58);
backdrop-filter: blur(18px);
-webkit-backdrop-filter: blur(18px);
border: 1px solid rgba(255, 50, 50, 0.3);
border-radius: 16px;
padding: 24px;
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.4);
color: #fff;
}
Cameos & Appearances
bin laden hard drive • tuv "hacker" • iamlucidOpen Source & Older Projects
ManaBoxPro • Source MovieHub • Source GitHub • @imdevcaspI occasionally release source for older experiments so other developers can study the code or build on top of it. More on my GitHub: @imdevcasp