KrzysztofDeveloper and infrastructure Contact

Hey, I'm Krzys.

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.

Portrait of Krzysztof Sliwinski

What I'm doing now

  • 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.

The Oddology dashboard overview on test data: a headline summary, open replies, leads found and invoices due, and the Today task list

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.

What it runs on

Node.js, Express 5, React 19, SQLite, Socket.IO, Stripe, PM2, Apache

How it turned out

It runs the company day to day, and paying clients use it. The redesign is going out in reviewed phases right now.

LifeLogr Play Store screenshot that reads Grow a plant by caring for yourself, free forever, no paywall, over the home screen's plant and daily rings (demo data) LifeLogr Play Store screenshot that reads Log meals with ease, over the food diary with calories and macros (demo data)

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.

lifelogr.net
FieldLedger dashboard running on demo data for a made-up company: revenue, expenses, payroll and outstanding totals, a 12 month revenue and expenses chart, recent jobs and open invoices

FieldLedger

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.

What it runs on

React, TypeScript, Vite, Tailwind, Express, Drizzle, SQLite, Twilio, PDFKit

How it turned 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 website

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.

snakeriverretail.com
TSC PM Co. website

TSC PM Co.

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.

tscpm.com

Feudline

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.

Hosting architecture Visitors reach a floating address through Cloudflare DNS. The address normally points at the primary web server. A hot standby gets synced from it all the time. A separate monitor checks the primary every ten seconds and moves the address to the standby if it fails. Nightly backups go to a different server. Visitors Cloudflare DNS Floating IP Primary web hostsites, apps, media Hot standbysame apps, kept stopped sync Monitor and backupschecks every 10 s, stores nightly backups
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

  1. 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.

  2. Windows upgrade technician, Power Construction (contract)

    Sep to Oct 2025

    I moved 120+ employees from Windows 10 to 11 in a single month.

  3. 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.

  4. 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.

Full resume and PDF
Krzysztof standing under a tree on a summer evening

A bit about me

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.

Get in touch

Send me a message

Whether it's a job, freelance work or you just want to talk shop, send it here and it'll go straight to my inbox. I usually reply within a day or two.

I only use your message to reply to you. No newsletters and no tracking.