Arman Sarrafi
About
Arman Sarrafi

Graduates May 2027
Student, builder, based in Charlotte, NC. Open to relocation.

Arman
Sarrafi

Backend systems, data pipelines, and AI features.

GitHub LinkedIn arman@khash.com
  1. 01 SarrafiCarsPython, Flask, PostgreSQL, pgvector, SwiftUI Mar 2026 - present View
  2. 02 ZumaiClaude API, Celery, pgvector, Playwright Jun - Oct 2026 View
  3. 03 SchoolCenterLocal-first AI, Canvas, pgvector, SwiftUI 2026 View
  4. 04 EV Charging Gap AnalysisPython, pandas, folium Oct 2026 - present View
  5. 05 Pi DashRaspberry Pi 5, Android, Linux USB gadget, Bash Sep 2026 - present View
Home

SarrafiCars

Mar 2026 - present

View on GitHub

Dealership inventory platform: ~215K listings across ~560 dealerships, a browser-free scanner, hybrid semantic search, and a native iOS app.

~215Kactive listings
~560dealerships scanned
5,300+automated tests
3apps on one shared API

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

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

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

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

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

Landing page with a natural-language search box and live listing countSearch for Individual listing with photo gallery, price, estimated payment and key specsCar assistant answering a question about a listingDealer locator with a map and list of dealers near a ZIP code

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

Next project: Zumai
Home

Zumai

Jun - Oct 2026

AI job-application agent: daily board scans, local embeddings plus Claude scoring, and apply automation that cannot double-send.

80K+lines of Python
3job-board APIs scanned daily
100jobs shortlisted before Claude scores them
MCPserver for outside AI agents

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

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

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

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

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

Jobs list with match scores for sample employersJob detail with a score breakdown and apply controlsScan health and monthly AI spend by task
Next project: SchoolCenter
Home

SchoolCenter

2026

Study app that syncs a student's own Canvas and answers with citations through a local-first AI router.

8,300+automated tests
LocalAI first, cloud only on opt-in
7hardening phases
17audit findings fixed

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

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

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

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

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

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

  7. 07

    Also on iPhone and Mac

    An early SwiftUI companion app brings study tools like spaced repetition to Apple devices.

Ask-your-notes chat answering a database question with source citationsHomework list synced from Canvas, grouped by what is due soonStudy guide with flashcards and a cited chat answerNotice asking the student before any cloud AI is used
Next project: EV Charging Gap Analysis
Home

EV Charging Gap Analysis

Oct 2026 - present

View on GitHub

Research project: ranking Orange County ZIP codes by EVs per charger to show where new chargers are needed.

5public data sources
ZIPlevel of analysis
1interactive map
In progressstatus

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

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

  3. 03

    The ranking

    Each ZIP code is scored by how many EVs it has per charging station, then weighted by nearby traffic and amenities.

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

Map of Orange County, California with charging-station gaps over satellite imageryInteractive map layers: chargers, restaurants, supermarkets and malls
Next project: Pi Dash
Home

Pi Dash

Sep 2026 - present

A Raspberry Pi 5 that plays the phone for my truck's head unit and puts a full Android tablet on its screen.

Pi 5running LineageOS, Android 16
WiredUSB accessory handshake with the truck, working
Full UItablet screen mirrored to the truck display
55commits, with runbooks and docs

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

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

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

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

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

Diagram: Raspberry Pi 5 connected by USB to a truck display showing the full Android interface
Next project: SarrafiCars

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
Back

Let's talk.

GitHub LinkedIn arman@khash.com
v1.17.0
Ask me anything