Software portfolio

Phil Norris builds whole products, from the crawler to the phone in your hand.

Since 2018 I have shipped job marketplaces, data pipelines, business integrations, mobile apps, semantic search tools and games, across the full stack and in whichever language suits the job.

42projects~76klines of original code9languages2end-to-end products

Two products, built end to end

These two systems run from data collection to the customer’s screen, and I wrote each layer.

RN Travel Jobs

2019–2024 · ~45k lines · 7 projects

A marketplace connecting travel nurses with staffing partners, including automated matching and outreach.

  1. DataJava crawlers and feeds from 15 sources
  2. APIJersey REST service on MySQL
  3. WebReact app with member, partner and admin dashboards
  4. MobileFlutter app, preceded by native Android
  5. GrowthAutomated matching, email campaigns, ad generation

Gem City Jobs

2024–2026 · ~7k lines · 6 projects

A regional job-search service that gathers openings from local employers and alerts users when new ones appear.

  1. DataSelenium crawlers for 12 regional employers
  2. APIContainerized Java service with two replicas
  3. WebReact app delivered with Docker and Kubernetes
  4. MobileAndroid background service that checks every 30 minutes
Language
Complexity

01

Web platforms & APIs

Multi-user web products, the services behind them, and business integrations.

RN Travel Jobs web app

Advanced

JavaScriptRN Travel Jobs

A travel-nursing job marketplace with about 30 screens: nurse registration, quick apply, job matching, billing, and separate member, partner and admin dashboards with reporting.

React · Bootstrap · Recharts · Google Places

2021–2023 · ~13.9k lines · 259 commits

Multi-product REST backend

Advanced

JavaRN Travel Jobs

The Java service behind several of my products. It handles authentication, applications, job listings, partner accounts, file uploads and transactional email, packaged for Docker.

Jersey · MySQL · SendGrid · Docker

2020–2024 · ~15.1k lines · 187 commits

Supplier order integration

Complex

C#

An ASP.NET MVC portal that connects to the ordering systems of five promotional-product suppliers, with a common model for orders, invoices and shipment notifications.

ASP.NET MVC · C# · Web services

2018 · ~7.4k lines · 16 commits

Gem City Jobs web app

Moderate

JavaScriptGem City Jobs

A local job-search site with sign-up, login, a personal dashboard and company browsing, containerized and deployed with Kubernetes manifests.

React · Docker · Kubernetes

2024–2025 · ~792 lines · 20 commits

Gem City Jobs API

Moderate

JavaGem City Jobs

REST API for account management, job lists and company data, run as a two-replica Kubernetes deployment.

Jersey · MySQL · Firebase Admin · Kubernetes

2024–2026 · ~1.1k lines · 11 commits

Gem City Jobs, first version

Moderate

JavaScriptGem City Jobs

The original front end for the job site, with protected routes, role-aware navigation and a login and sign-up flow.

React · React Router

2024 · ~543 lines · 7 commits

React and Redux member portal

Moderate

JavaScript

A login and file-upload application with Redux state management, extended from an open-source registration starter.

React · Redux · Material UI

2021 · ~3.6k lines · 23 commits

Atomidevs site

Simple

JavaScript

The company contact site, with a validated lead form and an email unsubscribe page.

React · Bootstrap

2023–2024 · ~698 lines · 9 commits

Spring Boot service starter

Simple

Java

A minimal Spring Boot REST service used to prototype a middle tier.

Spring Boot

~79 lines

02

Data pipelines & automation

Programs that collect, clean and act on data without anyone watching.

Job data and marketing engine

Advanced

JavaRN Travel Jobs

Collects listings from 15 employer and agency sources, loads them into MySQL, matches them to candidates, sends email campaigns and generates social ad images.

Selenium · MySQL · SendGrid · SFTP

2019–2023 · ~9.2k lines · 110 commits

Local employer job crawler

Complex

JavaGem City Jobs

Browser-automation crawlers for 12 regional employers, each with its own parser, feeding a shared jobs database on a production schedule.

Selenium · MySQL · SSH

2024–2025 · ~2.8k lines · 6 commits

Job feed pipeline, second generation

Moderate

JavaRN Travel Jobs

A leaner rewrite of the original pipeline that adds Jsoup parsing and PostgreSQL storage.

Jsoup · Selenium · PostgreSQL

2023–2024 · ~1.7k lines · 6 commits

Personal job feed crawler

Moderate

JavaGem City Jobs

Collects the newest postings into a database that feeds my job-alert mobile app.

Selenium · MySQL · Firebase Admin

2025–2026 · ~897 lines · 4 commits

External IP updater

Simple

Java

A small utility that records a home machine’s public IP address in a cloud database so it stays reachable.

JDBC · AWS RDS

2025 · ~58 lines · 2 commits

03

AI & semantic search

Retrieval systems and local model tooling, built on open models.

Policy document Q&A

Complex

JavaScript

Semantic search over long policy manuals. Queries are embedded in the browser with a transformer model, then matched by vector similarity against chunked documents.

React · Express · pgvector · Transformers.js

2024 · ~1.7k lines · 8 commits

Document ingestion and RAG prototype

Complex

JavaScript + Python

Upload documents, split them into chunks, create embeddings and retrieve relevant passages. Includes four iterations of a Python data loader in notebooks.

React · Express · pgvector · LangChain · Hugging Face

2024 · ~2.2k lines · 26 commits

In-browser translator

Simple

JavaScript

Runs a translation model entirely on the client, using a web worker to keep the interface responsive.

React · Vite · Transformers.js

2024 · ~228 lines

Local LLM API

Simple

Python

A compact HTTP endpoint that puts a locally hosted coding model behind a simple API.

FastAPI · Ollama

2025 · ~11 lines

Private AI chat stack

Simple

YAML

A Docker Compose definition for a self-hosted chat interface backed by local models.

Docker Compose · Ollama · Open WebUI

2026 · ~24 lines

Embeddings in TypeScript

Simple

TypeScript

A typed experiment calling a Hugging Face sentence-embedding model.

TypeScript · Hugging Face

2024 · ~278 lines · 4 commits

04

Mobile & wearable

Native Android, Flutter, and one very small screen.

RN Travellers mobile app

Moderate

DartRN Travel Jobs

The cross-platform companion to the marketplace, with multi-step registration, emailed code verification, password reset and a member dashboard.

Flutter · REST · Shared Preferences

2023 · ~3.5k lines · 11 commits

Gem City Jobs alerts

Moderate

JavaGem City Jobs

An Android app whose background service checks for new jobs every 30 minutes and keeps them in a local database for browsing.

Android · Background services · SQLite

2025–2026 · ~867 lines · 7 commits

Simple Sugars

Moderate

Java

A blood-sugar tracker for logging readings and reviewing history, stored on the device.

Android · SQLite

2020–2023 · ~1.2k lines · 20 commits

RN Travellers for Android

Moderate

JavaRN Travel Jobs

The native predecessor to the Flutter app, with a splash flow, login and an API client.

Android · REST

2023 · ~649 lines · 18 commits

Fitness companion

Simple

Dart

A Flutter app with a BMI calculator, live weather from a web API and saved training sessions.

Flutter · HTTP · Shared Preferences

2023 · ~638 lines · 4 commits

Masonic watch face

Simple

Java

A custom watch face for Wear OS.

Android · Wear OS

2021 · ~372 lines · 2 commits

05

Games & interactive

Rules engines, physics loops and things that are just fun to make.

Draw Poker for Android

Complex

Java

A full five-card-draw engine with betting rounds, correct side pots for all-in hands, computer opponents that occasionally bluff, and unit tests for hand evaluation.

Android · JUnit

2026 · ~1.8k lines

Desktop Poker

Moderate

JavaAI-assisted

A graphical draw-poker game with custom-painted cards and a phased game state.

Java Swing

2026 · ~629 lines

Roblox Obby

Moderate

LuaAI-assisted

An obstacle course with moving and blinking platforms, generated by server scripts and paired with client UI.

Luau · Roblox Studio

2026 · ~348 lines

Corporate Jargon Bingo

Simple

HTML/CSSAI-assisted

A self-contained browser game for surviving meetings.

HTML · CSS · JavaScript

2026 · ~629 lines

Space Invaders in Java

Simple

JavaAI-assisted

An arcade shooter with a hand-written game loop.

Java Swing

2026 · ~403 lines

Breakout in Java

Simple

JavaAI-assisted

Paddle-and-brick arcade game with collision handling.

Java Swing

2026 · ~373 lines

Console Poker

Simple

JavaAI-assisted

Terminal poker using compact integer card encoding and full hand ranking.

Java

2026 · ~278 lines

Catch game

Simple

JavaAI-assisted

A bucket-and-raindrops game with sprites, sound and music, runnable on the desktop.

libGDX

2026 · ~172 lines

Fishy Swimmer

Simple

Java

Animated fish swimming across a resizable ocean scene, for desktop and Android.

libGDX

2026 · ~130 lines

NATO alphabet quiz

Simple

JavaAI-assisted

A console quiz that tracks score and streaks.

Java

2026 · ~99 lines

Turtle Animation

Simple

Java + Python

A sprite animation, with a Python script that generates its sprite sheet.

libGDX · Python

2026 · ~181 lines

Bouncing balls

Simple

Dart

A ticker-driven animation with wall collisions.

Flutter

2026 · ~171 lines

06

Cloud & infrastructure

Small, focused pieces of deployment and serverless work. Container and Kubernetes work also appears in the platforms above.

Serverless functions

Simple

TypeScript

AWS Lambda functions behind API Gateway, defined with the Serverless Framework.

AWS Lambda · Serverless Framework

2024 · ~120 lines · 1 commit

Kubernetes environment config

Simple

Terraform

Terraform environment definitions that build on the open-source kubernetes-ops modules.

Terraform · GitHub Actions

2024 · 5 commits

07

Email & marketing

The work that gets people to the product.

Recruiting email campaigns

Simple

HTML/CSSRN Travel Jobs

Responsive HTML campaigns and banner artwork for outreach to nurses.

HTML email

~815 lines

Branded email template library

Simple

HTML/CSS

Twenty responsive templates rebranded for Atomidevs, adapted from an MIT-licensed Colorlib set.

HTML email

2024

Always learning

Course and tutorial work I completed to pick up new tools. It is credited to its original authors and not counted in the totals above.

  • Flutter fundamentalsGoogle codelabs and layout exercises: namer_app, hello_layout
  • Kubernetes and DockerCourses by Nigel Poulton and Anthony Nocentino, including cluster builds with Vagrant
  • Functional programming in JavaStreams, lambdas and functional interfaces
  • Next.js and TypeScriptApp Router patterns, nested and dynamic routing
  • Transformers.js and Stable DiffusionSample apps exploring client-side and server-side inference
  • Firebase on AndroidHands-on integration test project
SimpleA focused tool or demo, usually under 500 lines.
ModerateSeveral screens or modules, with storage or API integration.
ComplexIntegrated subsystems or specialized techniques, such as vector search or a full rules engine.
AdvancedLarge systems developed over years with many external integrations.