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.
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
A marketplace connecting travel nurses with staffing partners, including automated matching and outreach.
- DataJava crawlers and feeds from 15 sources
- APIJersey REST service on MySQL
- WebReact app with member, partner and admin dashboards
- MobileFlutter app, preceded by native Android
- GrowthAutomated matching, email campaigns, ad generation
Gem City Jobs
A regional job-search service that gathers openings from local employers and alerts users when new ones appear.
- DataSelenium crawlers for 12 regional employers
- APIContainerized Java service with two replicas
- WebReact app delivered with Docker and Kubernetes
- MobileAndroid background service that checks every 30 minutes
Web platforms & APIs
Multi-user web products, the services behind them, and business integrations.
RN Travel Jobs web app
AdvancedJavaScriptRN 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
Multi-product REST backend
AdvancedJavaRN 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
Supplier order integration
ComplexC#
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
Gem City Jobs web app
ModerateJavaScriptGem 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
Gem City Jobs API
ModerateJavaGem City Jobs
REST API for account management, job lists and company data, run as a two-replica Kubernetes deployment.
Jersey · MySQL · Firebase Admin · Kubernetes
Gem City Jobs, first version
ModerateJavaScriptGem 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
React and Redux member portal
ModerateJavaScript
A login and file-upload application with Redux state management, extended from an open-source registration starter.
React · Redux · Material UI
Atomidevs site
SimpleJavaScript
The company contact site, with a validated lead form and an email unsubscribe page.
React · Bootstrap
Spring Boot service starter
SimpleJava
A minimal Spring Boot REST service used to prototype a middle tier.
Spring Boot
Data pipelines & automation
Programs that collect, clean and act on data without anyone watching.
Job data and marketing engine
AdvancedJavaRN 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
Local employer job crawler
ComplexJavaGem 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
Job feed pipeline, second generation
ModerateJavaRN Travel Jobs
A leaner rewrite of the original pipeline that adds Jsoup parsing and PostgreSQL storage.
Jsoup · Selenium · PostgreSQL
Personal job feed crawler
ModerateJavaGem City Jobs
Collects the newest postings into a database that feeds my job-alert mobile app.
Selenium · MySQL · Firebase Admin
External IP updater
SimpleJava
A small utility that records a home machine’s public IP address in a cloud database so it stays reachable.
JDBC · AWS RDS
AI & semantic search
Retrieval systems and local model tooling, built on open models.
Policy document Q&A
ComplexJavaScript
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
Document ingestion and RAG prototype
ComplexJavaScript + 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
In-browser translator
SimpleJavaScript
Runs a translation model entirely on the client, using a web worker to keep the interface responsive.
React · Vite · Transformers.js
Local LLM API
SimplePython
A compact HTTP endpoint that puts a locally hosted coding model behind a simple API.
FastAPI · Ollama
Private AI chat stack
SimpleYAML
A Docker Compose definition for a self-hosted chat interface backed by local models.
Docker Compose · Ollama · Open WebUI
Embeddings in TypeScript
SimpleTypeScript
A typed experiment calling a Hugging Face sentence-embedding model.
TypeScript · Hugging Face
Mobile & wearable
Native Android, Flutter, and one very small screen.
RN Travellers mobile app
ModerateDartRN 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
Gem City Jobs alerts
ModerateJavaGem 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
Simple Sugars
ModerateJava
A blood-sugar tracker for logging readings and reviewing history, stored on the device.
Android · SQLite
RN Travellers for Android
ModerateJavaRN Travel Jobs
The native predecessor to the Flutter app, with a splash flow, login and an API client.
Android · REST
Fitness companion
SimpleDart
A Flutter app with a BMI calculator, live weather from a web API and saved training sessions.
Flutter · HTTP · Shared Preferences
Masonic watch face
SimpleJava
A custom watch face for Wear OS.
Android · Wear OS
Games & interactive
Rules engines, physics loops and things that are just fun to make.
Draw Poker for Android
ComplexJava
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
Desktop Poker
ModerateJavaAI-assisted
A graphical draw-poker game with custom-painted cards and a phased game state.
Java Swing
Roblox Obby
ModerateLuaAI-assisted
An obstacle course with moving and blinking platforms, generated by server scripts and paired with client UI.
Luau · Roblox Studio
Corporate Jargon Bingo
SimpleHTML/CSSAI-assisted
A self-contained browser game for surviving meetings.
HTML · CSS · JavaScript
Space Invaders in Java
SimpleJavaAI-assisted
An arcade shooter with a hand-written game loop.
Java Swing
Breakout in Java
SimpleJavaAI-assisted
Paddle-and-brick arcade game with collision handling.
Java Swing
Console Poker
SimpleJavaAI-assisted
Terminal poker using compact integer card encoding and full hand ranking.
Java
Catch game
SimpleJavaAI-assisted
A bucket-and-raindrops game with sprites, sound and music, runnable on the desktop.
libGDX
Fishy Swimmer
SimpleJava
Animated fish swimming across a resizable ocean scene, for desktop and Android.
libGDX
NATO alphabet quiz
SimpleJavaAI-assisted
A console quiz that tracks score and streaks.
Java
Turtle Animation
SimpleJava + Python
A sprite animation, with a Python script that generates its sprite sheet.
libGDX · Python
Bouncing balls
SimpleDart
A ticker-driven animation with wall collisions.
Flutter
Cloud & infrastructure
Small, focused pieces of deployment and serverless work. Container and Kubernetes work also appears in the platforms above.
Serverless functions
SimpleTypeScript
AWS Lambda functions behind API Gateway, defined with the Serverless Framework.
AWS Lambda · Serverless Framework
Kubernetes environment config
SimpleTerraform
Terraform environment definitions that build on the open-source kubernetes-ops modules.
Terraform · GitHub Actions
Email & marketing
The work that gets people to the product.
Recruiting email campaigns
SimpleHTML/CSSRN Travel Jobs
Responsive HTML campaigns and banner artwork for outreach to nurses.
HTML email
Branded email template library
SimpleHTML/CSS
Twenty responsive templates rebranded for Atomidevs, adapted from an MIT-licensed Colorlib set.
HTML email
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