I'm a full-stack developer from Crystal Lake, IL. I take a project from the first sketch all the way to the Linux server it runs on, and then I'm the one keeping it online. Right now I run a few web platforms, a mobile app that's live on Google Play and a couple of game servers, plus the failover and security setup that keeps it all running.
I'm open to remote work, and I speak English and Polish.
I'm redesigning the Oddology dashboard and client portal one small phase at a time. Every phase gets reviewed and has a tested rollback before it goes out.
I'm moving our two-factor secrets to encrypted storage and raising the password hashing cost. It's tested and rolling out to production now.
I'm learning networking fundamentals for the CCNA, and doing more hands-on security work.
I'm looking for an IT engineering, backend or security-focused developer job, remote or around Chicago.
What I've built
Everything here is live and used by real people. If you want the longer story, open a card and you'll see what the problem was, what I built, what it runs on and how it turned out.
Oddology dashboard and client portal
This is what my agency runs on. Clients, projects, contracts, billing and websites all live here, and clients get their own portal to check on their site and invoices.
The problem
Client work was spread across spreadsheets, email and a dozen hosting panels. A client had no single place to check on their site or their invoices.
What I built
A Node and React dashboard, plus a client portal on the same backend. Permission changes apply to people who are already signed in almost right away. It also handles contracts and Stripe billing, analytics that respect consent and export to PDF and XLSX, site integrity monitoring, automatic backups and domain setup.
It runs the company day to day, and paying clients use it. The redesign is going out in reviewed phases right now.
LifeLogr
My health and lifestyle tracker, built in Flutter and live on Google Play. Food, workouts, sleep, weight, journaling, pantry and groceries are all in one app.
The problem
I got tired of MyFitnessPal's paywalls and how bloated it had gotten, and every other app I tried overwhelmed me on day one. So I decided to build the one I actually wanted to use.
What I built
Calorie and macro tracking, barcode scanning, AI that reads nutrition labels from a photo, workout logs with personal records, insights and goals, pantry and grocery lists, and notifications that adapt to what each person actually logs. Media is served from my own servers, with a standby copy.
What it runs on
Flutter, Dart, Riverpod, Firebase, Node media server, Google Play
How it turned out
It's in production on Google Play, and I push new releases through open testing pretty often. I'm the only developer.
Invoicing, payroll and records for a property management client. It replaced a 50-tab Excel workbook that three companies were sharing.
The problem
All three companies ran on that one spreadsheet. Jobs, invoices and payroll were typed in by hand, and one bad edit could break the books without anyone noticing.
What I built
One login for all three companies. They log jobs from the field, send PDF invoices by email and text, track payments, run payroll with running totals per employee, and see revenue and expenses on a dashboard. It's typed end to end, input gets validated everywhere it comes in, and nothing is ever hard deleted, so the financial history can't be wiped out.
It launched in April 2026. I built it phone-first so it works from the truck, and I still maintain it.
Snake River Retail
A site for a micro market operator. I moved it off Wix and rebuilt it as code the owner actually owns, with an Express backend behind it.
The problem
He had a page-builder site he couldn't extend, and no way to run the customer voting and giveaways he wanted.
What I built
A custom front end plus an Express backend for the voting and giveaways, QR code pages for the screen next to the cooler, admin sign-in with hashed passwords, transactional email, and an admin panel he runs himself.
What it runs on
Node.js, Express, bcrypt, Nodemailer, Apache, PM2
How it turned out
760+ visitors in the first year, and it's indexed and ranking locally.
A site for a lawn and property maintenance business, built around a before-and-after gallery of their real jobs.
The problem
They do great work and had nowhere online to show it.
What I built
I designed and built it from scratch, no template. That covers the gallery, contact forms, SEO and schema markup, a rental listing page, and the Google and Facebook ad campaigns that send people to it. I host and maintain it on my servers.
What it runs on
HTML, CSS, JavaScript, schema.org, Apache, Google and Meta Ads
How it turned out
312+ visitors in the first year, and it's indexed and ranking locally.
Feudline is a Minecraft factions server I run. Players team up, claim land, build power and raid each other, and all of that gameplay comes from one Java plugin I wrote by myself, about 45,000 lines of it.
What makes it different is the season. It doesn't run on a calendar. Every block mined and every hit landed feeds one counter for the whole server, and the world moves to its next stage when enough work goes in. And nothing on the server is sold for real money, so nobody can pay to win.
Factions and territory
Factions with ranks and per-rank permissions, allies, truces and enemies, land claims, power and raiding, plus faction homes, warps, banks, vaults and upgrades.
Economy and events
Money with a shop and an auction house, bounties on players, King of the Hill fights, and timed supply drops called Envoys.
Progression
Skills you level just by playing, each with its own trait tree, custom enchants, kits, ranks and perks, and Vein rites that factions unlock with their share of the season.
Server tools
Chat channels and faction chat, mail, moderation tools and a jail, cosmetics like nicknames, pets and particles, and the inventory GUI framework every menu is built on.
The problem
I tried the usual plugin bundles first. They kept conflicting with each other, and I couldn't balance them together or make them fit the game I actually wanted to run.
What I built
So I made one plugin for all of it, on top of an inventory GUI framework I wrote so every menu works the same way. Configs reload live, so I can push balance changes without kicking anyone off the server. I also took the crate system out on purpose, because it was basically a loot box.
What it runs on
Java, Paper / Bukkit API, LuckPerms, Vault, YAML and JSON persistence, systemd on Ubuntu
How it turned out
200+ classes, about 45K lines and 20+ gameplay systems. I'm the only developer on it.
The servers behind all of this
Every site and app on this page runs on Linux servers I set up and run myself. The goal is pretty simple: one server can die and visitors shouldn't notice.
10 sbetween health checks
~42 sto fail over in a real test I ran
5 minbetween file and database syncs to the standby
Nightlybackups, sent to a separate server
A primary and a hot standby
One server handles everything. A standby copies its files and database snapshots every few minutes, and its certificates and site configs every hour. The standby's apps are set up but kept stopped, so they can't drift out of date or run scheduled jobs twice.
Automatic failover
A third server checks the primary every ten seconds. If it fails three checks in a row, the monitor calls my hosting provider's API, moves the floating address to the standby and starts its apps. When the primary comes back, everything moves back. If the monitor itself goes down, the standby only takes over when it can't reach either of the other two.
The mistake that shaped it
I learned this one the hard way. For six days, two of my servers were both answering for the same address and almost nothing looked wrong. A site loading doesn't tell you which server answered. Now a routine check makes sure exactly one server holds that address.
What every server gets
SSH with keys only, firewalls that block everything by default, fail2ban, automatic security updates and capped logs. Each project also gets its own restricted login instead of everything sharing one admin account.
Security fixes I've made
These are real security problems I found and fixed on systems I run. Every fix went out with tests, a dry run and a rollback I'd practiced first. I kept the details general on purpose.
Client portal access control
Before redesigning the client portal, I audited it. I found a tenant check that compared the wrong ID, and a few actions that didn't check the user's role at all. It's fixed and live.
What I found
Tenant isolation that could fail in some account setups, destructive and billing actions any member could call, temporary passwords shown to whoever sent the invite, and third-party scripts loaded from public CDNs without pinned versions.
What I changed
I fixed the tenant checks, added a role check to every destructive and billing route, stopped sending temporary passwords back, rate limited password resets, and moved the portal to a build step with pinned dependencies I host myself. The regression tests only use fake users.
Encrypted 2FA secrets and stronger hashing
Two-factor secrets and backup codes were sitting in the database as plain text. The fix encrypts or hashes them without breaking anyone's sign-in. It's tested, and it's rolling out to production now.
What I found
Authenticator secrets stored as plain text, backup codes made with a random generator that isn't meant for security, emailed one-time codes stored exactly as typed, and a password hashing cost that was due to go up.
What I changed
Every 2FA secret gets authenticated encryption with a key that stays on the server, plus key IDs so keys can be rotated later. Backup and one-time codes come from a secure generator, and only their hashes get stored. The higher hashing cost kicks in quietly the next time someone signs in. The migration has a dry run and a rollback that decrypts everything back, and I tested both.
Path validation on an internal endpoint
An internal staff endpoint built a file path from a URL parameter without checking it. The real risk was low, but I fixed it anyway, and the fix is live.
What I found
The parameter is always generated by the server, but nothing actually enforced that, and the framework decodes encoded slashes before the handler ever sees them.
What I changed
Now the parameter has to match the exact generated format, every resolved path has to stay inside its own folder, and tests cover encoded and double-encoded traversal attempts. I also wrote down an honest severity rating with my reasoning, instead of making it sound worse than it was.
Visitor IP masking
An analytics screen masked simple IPv4 addresses, but showed proxy chains and IPv6 addresses in full, both on screen and in CSV exports. That's fixed and live.
What I found
The masking only handled one shape of address. Anything else, like forwarded lists or IPv4 mapped into IPv6, went straight through.
What I changed
I replaced it with a masker that handles every entry in a list, IPv6, ports and mapped addresses, and builds its output from the parsed numbers instead of copying the input. Raw addresses never reach the screen or the exports.
I don't name any client systems here, and none of these include exploit details. I'm happy to walk through any of them in an interview though.
Stuff I build for fun
Infamy
A multiplayer pirate game in Unreal Engine 5 that's still in development. I built the ocean myself: Gerstner waves come from one source of truth that both the physics and the GPU read from, synced to server time, and ships float using buoyancy probes.
C++, Unreal Engine 5.5
Horror SMP
A private modded Minecraft server for my friends. It has around 46 mods, a self-hosted modpack that updates itself on launch, and world generation I kept tuning until the heavy biome mods stopped crashing it.
Fabric 1.20.1, Linux, systemd
OddoBot
A Discord bot with separate production and development instances, its own self-hosted audio node, and a Stripe-connected API for the paid features.
Node.js, discord.js, Lavalink, Stripe, PM2
Fledgerly
A personal finance app for me and a couple of friends. It has bank sync, statement imports, subscription detection, and take-home pay forecasts that get checked against real payslips.
Next.js, TypeScript, Prisma, SQLite, Auth.js
Rooted
A plant-care app I'm still planning. It's built around a map of your home, because I think people remember their plants by where they are, not by their names.
Flutter, Firebase
This site
Plain HTML, CSS and a little JavaScript, no framework. It has light and dark themes, and a Polish version.
HTML, CSS, JavaScript
What I work with
Languages
JavaScript and Node, TypeScript, Java, Dart, Python, C++ and C#, SQL, Bash
Front end
React, Flutter, HTML and CSS, design systems, accessibility
Back end and data
Express, SQLite, PostgreSQL, Firebase, Stripe, auth and role-based access
Infrastructure and IT
Ubuntu, Apache, PM2, systemd, Let's Encrypt, Cloudflare, Active Directory, Okta, Microsoft 365
Where I've worked
Co-founder and full-stack developer, Oddology LLC
2023 to present
I built and run the agency's platform, the client sites and the servers they're on.
Windows upgrade technician, Power Construction (contract)
Sep to Oct 2025
I moved 120+ employees from Windows 10 to 11 in a single month.
IT technician I, AIT Worldwide Logistics (contract)
Oct 2024 to Feb 2025
After an acquisition, the ServiceNow queue was in the low thousands. I helped get it under 100, closing 400 to 500 tasks a month, and I handled account setup and offboarding across Active Directory, Okta and Microsoft 365.
Computer science
Southern Illinois University, McHenry County College
I've also done penetration testing basics on TryHackMe, and I'm studying Cisco networking for the CCNA.
I got into computer science because I saw my dad coding in Python and Rust and thought it looked really cool, and ever since, he's had me hooked. I started off building websites and learning olcPixelGameEngine, and got to know the really great community around olc. Then I moved to Python, C++, C, Java, React and more.
Honestly, most of what I know I learned because I needed something to work. I started building things that didn't exist yet, and that turned into a company, a SaaS platform, a mobile app, a game server full of custom systems and a small group of Linux servers I keep online.
I like owning the whole project. That means understanding the problem, designing the interface, getting the backend working, deploying it, and being the one who gets the alert when it breaks. My enterprise IT jobs made me better at the boring stuff that matters, like access control, clean audit trails and not breaking production. I use AI tools day to day, the same way I use any other tool.
I speak English and Polish. Outside of client work I still build things for fun, like a pirate game, modded servers for my friends and tools I use every day.