Graduates May 2027
Student, builder, based in Charlotte, NC. Open to relocation.
Arman
Sarrafi
Backend systems, data pipelines, and AI features.
- 01 SarrafiCarsPython, Flask, PostgreSQL, pgvector, SwiftUI Mar 2026 - present View
- 02 ZumaiClaude API, Celery, pgvector, Playwright Jun - Oct 2026 View
- 03 SchoolCenterLocal-first AI, Canvas, pgvector, SwiftUI 2026 View
- 04 EV Charging Gap AnalysisPython, pandas, folium Oct 2026 - present View
- 05 Pi DashRaspberry Pi 5, Android, Linux USB gadget, Bash Sep 2026 - present View
SarrafiCars
View on GitHubDealership inventory platform: ~215K listings across ~560 dealerships, a browser-free scanner, hybrid semantic search, and a native iOS app.
SarrafiCars gathers dealership inventory, enriches it with EPA and NHTSA data, and lets people search it in plain language. A Flask REST API serves a JavaScript web app, a dealer portal, and a native SwiftUI iOS app (ZIP-radius search, saved cars, compare up to four, a MapKit dealer map).
- Built with
- Backend
- Python, Flask, PostgreSQL 17, pgvector, curl_cffi
- AI
- Claude API, Ollama
- Apps
- SwiftUI, JavaScript, Stripe
- Infrastructure
- Docker, Kubernetes (K3s), Railway, GitHub Actions, pytest
- 01
Direct, lightweight data collection
Inventory used to come from browser-based scrapers. I rebuilt the scanner to call dealers' data feeds directly over HTTP, so it is simpler to run and much lighter to deploy: the container shrank from 11.8 GB to 1.09 GB, and it now covers 454 of 459 active dealers.
- 02
Search in plain language
Shoppers describe what they want and get matches from semantic search (pgvector) combined with normal filters like price and distance. If semantic search is ever unavailable, it falls back to standard filtering automatically.
- 03
Web, dealer portal, and iOS on one API
A Flask REST API powers the website, a dealer portal, and a native SwiftUI iPhone app with ZIP-radius search, saved cars, side-by-side comparison, and a dealer map. Cached listing requests return in about 5 ms.
- 04
An assistant that sticks to the facts
The built-in car assistant runs on Claude or a local Ollama model and treats listing and web text as untrusted input. Stripe handles billing for premium features.
- 05
Built to stay reliable
Over 5,300 automated tests, GitHub Actions CI, guarded releases and deploys, and nightly data-quality checks keep about 215K listings accurate.





Sample listing photos by Renée Kools and Autowizja (CC BY 4.0), Trop86, RichardSummersault and Retired electrician (CC0), and Bull-Doser (public domain), via Wikimedia Commons. Cropped, plates blurred. Full credits
Zumai
AI job-application agent: daily board scans, local embeddings plus Claude scoring, and apply automation that cannot double-send.
Zumai scans employer job boards every day, scores matches against a candidate profile, drafts tailored resumes and cover letters, and can apply through browser automation. It is built to be cautious: dry-run first, never apply twice, and never guess an answer to a legal question.
- Built with
- Backend
- Python, Flask, Celery, Redis, MinIO
- Data
- Postgres 16 (Apache AGE, pgvector), Flyway
- AI
- Claude API, MCP, Playwright
- Frontend
- React, Vite
- Infrastructure
- Docker Compose, Railway, GitHub Actions
- 01
Finds the right jobs
Zumai scans employer boards every day through the public Greenhouse, Lever and Ashby APIs. Local embeddings shortlist the top 100 matches, then Claude scores and ranks them against your profile.
- 02
Applies carefully
It drafts tailored resumes and cover letters and can apply through browser automation (Playwright). It runs as a dry run by default, never applies to the same job twice, and never guesses an answer to a legal question.
- 03
Respects the sites it reads
It uses official job-board APIs instead of scraping pages, follows robots.txt with no exceptions, and rate-limits itself per site.
- 04
AI costs stay predictable
Every AI call is logged with its model, token count and cost, and a daily spending cap keeps usage in check.
- 05
Works with other AI tools
An MCP server lets outside AI agents use Zumai's tools, with a separate access key for each user.



SchoolCenter
Study app that syncs a student's own Canvas and answers with citations through a local-first AI router.
SchoolCenter is a self-hosted, multi-tenant study app. Each student connects their own Canvas, the app syncs and indexes it, and questions are answered with citations from their own materials.
- Built with
- Backend
- Python 3.12, PostgreSQL, pgvector
- AI
- Ollama, Apple Intelligence, Claude API
- Clients
- JavaScript, Chrome extension (MV3), SwiftUI (iOS and macOS)
- Infrastructure
- Docker, Railway
- 01
Answers from your own courses
Each student connects their own Canvas account. SchoolCenter syncs and indexes it, then answers questions with citations back to the original material.
- 02
Your week in one place
Assignments from every course sync from Canvas into a single list, grouped by what is overdue, due soon and later, so nothing gets missed.
- 03
Study tools built from your materials
Flashcards, summaries, quizzes and an exam mode are generated from your own course documents, with the sources shown next to each answer.
- 04
Private by default
AI runs locally first, through Ollama or Apple Intelligence. Cloud AI is used only after the student reads a notice and chooses to continue.
- 05
Built for academic integrity
The browser extension stays off quizzes, submissions and gradebooks, and there is no endpoint that writes answers for a student.
- 06
Hardened and well tested
A seven-phase security review followed by fixes, backed by more than 8,300 automated tests, keeps each student's data separate.
- 07
Also on iPhone and Mac
An early SwiftUI companion app brings study tools like spaced repetition to Apple devices.




EV Charging Gap Analysis
View on GitHubResearch project: ranking Orange County ZIP codes by EVs per charger to show where new chargers are needed.
A research project asking where Orange County, California most needs new EV charging stations. It combines vehicle registrations, charging-station listings, traffic counts and nearby amenities, joins them by ZIP code in pandas, and shows the biggest gaps on an interactive map.
- Built with
- Analysis
- Python, pandas
- Mapping
- folium, OpenStreetMap
- Data sources
- State and federal REST APIs, Census ZIP data
- 01
The question
Where in Orange County, California do drivers most need new EV chargers? The goal is a repeatable, data-backed ranking instead of guesswork.
- 02
The data
State EV registrations, federal charging-station data, traffic counts, Census ZIP centers, and OpenStreetMap amenities such as restaurants and malls, cleaned and combined in Python with pandas.
- 03
The ranking
Each ZIP code is scored by how many EVs it has per charging station, then weighted by nearby traffic and amenities.
- 04
The map
An interactive folium map shows the biggest gaps alongside existing chargers and nearby places, so each gap can be checked at a glance.


Pi Dash
A Raspberry Pi 5 that plays the phone for my truck's head unit and puts a full Android tablet on its screen.
A hardware and systems project: a Raspberry Pi connects to my RAM truck over USB, completes the accessory handshake, and shows a full Android interface on the truck's touchscreen. It is a personal project in progress.
- Built with
- Hardware
- Raspberry Pi 5, RAM Uconnect 5 head unit
- Platform
- LineageOS 23.2 (Android 16), Magisk, Linux USB gadget (configfs)
- Tooling
- Bash, adb, scrcpy, AAStream
- Practices
- Idempotent scripts, runbooks, logged evidence
- 01
A Pi that talks to the truck
A Raspberry Pi 5 running LineageOS (Android 16) acts as the phone for my RAM truck's Uconnect 5 head unit. A Linux USB gadget set up through configfs completes the Android Open Accessory handshake over a wired USB connection.
- 02
The whole tablet on the truck screen
A mirror app (AAStream) projects the full Android interface onto the truck display instead of the stock Android Auto launcher. A setup script applies the root and permission grants (Magisk) so it works hands-free.
- 03
Reliable on every boot
Boot hooks re-arm the USB accessory mode each time the Pi starts, a watchdog keeps wifi up, and small collectors record evidence when something goes wrong. Each script does one job, can be re-run safely, and logs to its own file.
- 04
Documented like a real project
Runbooks, a conventions file, and a list of gotchas keep it reproducible. Bench testing turned up bugs that I fixed, and logs showed that one outage was a power cut, not software. 55 commits so far.
- 05
What's next
Making Android Auto fill the truck's tall 12-inch portrait screen, and finding a dependable way to reach the Pi while parked away from home wifi.
About
Student, builder, based in Charlotte, NC. Open to relocation.
Experience
General Sales Associate
Micro Center
Jun - Aug 2024
Diagnosed hardware and software issues, advised customers from specs, onboarded new teammates, and ranked among top floor associates.
Education
UNC Charlotte
B.S. Computer Science, Data Science focus
2023 - May 2027
Certifications
Google Data Analytics Professional Certificate
Coursera, 2025
Skills
- Languages
- Python, Java, Swift, SQL, C, C++, RISC-V assembly
- Backend
- Flask, FastAPI, Celery, PostgreSQL, pgvector, REST
- AI
- Claude API, Ollama, RAG, MCP
- Infrastructure
- Docker, K3s, GitHub Actions, pytest
- Agentic coding tools
- Claude Code, Cursor
- Practices
- Agile/Scrum, object-oriented design, testing, documentation
Let's talk.