Joshua Shepelsky
Trail map of what I've built
I build products end to end.
I'm Josh, a senior full-stack engineer in Charlotte, NC. I've spent 8+ years shipping production web platforms, and lately a lot of what I ship has AI in it. Each trail on this map is something I built or led, and each summit is a real number from it.
Trails
Pick a trail to see how it's built, or hike it to the top.Pick a run to see how it's built, or ski it top to bottom.Pick a trail to see how it's built, or ride it down.Pick a loop to see how it's built, or ride it around.
- Collision Repair Locator57,000 search impressionsMore difficult trail. Status: Live
- Certification platform4,700+ shops on the platformMost difficult trail. Status: In production
- Collision Estimate AI16 output languagesMost difficult trail. Status: In production
- Healthcare directory rebuild5,000 listings migratedMost difficult trail. Role: Tech lead
- TossCost<7 weeks from first commit to the App StoreMost difficult trail. Status: On the App Store
- Autism Friendly Care3.17M provider records in the pipelineMore difficult trail. Status: Private beta
- No Bulls News44 news feedsMost difficult trail. Status: Live
- TradeChickens319 automated testsMost difficult trail. Status: Paper trading
- Packlark16 packing engines on the phoneMore difficult trail. Status: In TestFlight
- essentials for Claude Code + Codex13 review and testing agentsEasier trail. Status: Open source
- Design by Flora32 booking requestsEasier trail. Status: Live
- Art Hanging Helper19 how-to guidesEasier trail. Status: Live
Easier More difficult Most difficult

Ranger station
Ask the site about my work.
An AI answers from these write-ups. It can be wrong, so email me for anything that matters.
Background

Joshua ShepelskySenior full-stack engineer
Charlotte, NC (remote)
I'm a full-stack engineer who likes owning the whole thing: data model, APIs, UI, infrastructure, payments, and launch. Most of my career has been PHP and TypeScript platforms with real users and real money moving through them. The last two years added Swift, Cloudflare Workers, and AI features in production.
I like knowing whether something I built is working, so I usually build the tracking too. On the collision repair locator, that's a weekly report on search traffic, AI assistant visits, and bookings.
8+ years as a software engineer in healthcare media and automotive. Before that, e-commerce.
- Healthcare media
- Tech lead on the rebuild of a paid directory of healthcare professionals: geocoded search, listing tiers, Stripe billing, moderated reviews, and a JWT-secured REST API.
- Designed the migration off a legacy platform with 45,000 accounts across two databases. All 5,000 listings, 4,800 leads, and the listing owners' accounts came over. Owners keep their old passwords and move to bcrypt on first login, with no mass reset.
- Set up how my team works with Claude Code, from shared CLAUDE.md conventions to plan-first workflows that produce written migration plans and launch runbooks.
- Moved a major WordPress property off Pantheon and cut its server resource needs by more than 50%. Pushed Varnish past a 90% cache hit rate on a site with millions of monthly visitors.
- Automotive
- Led four engineers and one QA through 30+ two-week sprints on parts software, and ran a security overhaul of a legacy PHP codebase.
- Built certification platforms used by thousands of repair shops, and more recently three products from an empty repo: a multi-tenant certification platform, the collision repair locator, and an AI estimating API.
- Ran security reviews of the certification platform and the locator with OpenAI Daybreak, then shipped fixes with tests.
- E-commerce
- Where I started: building and running a WordPress/WooCommerce store with custom PHP and JavaScript.
- Education
Full Stack Development, Redwood Code Academy (Irvine, CA, 2017 to 2018)
Stack
What I reach for.
- Languages
- PHP, TypeScript, JavaScript, Swift, Python, SQL
- Frameworks
- Next.js, React, Astro, SwiftUI, Expo, CodeIgniter, Django
- Cloud
- Cloudflare Workers, Durable Objects, D1, AWS Lambda, API Gateway, DynamoDB, S3, CDK, Elastic Beanstalk, Docker, Jenkins
- Data
- PostgreSQL, MySQL, MongoDB, SQLite / D1, Drizzle, Core Data
- Integrations
- Stripe, StoreKit, Salesforce, HubSpot, Twilio, SendGrid, Resend, Google Maps + Places, Tradier
- AI
- Claude (Anthropic API, Bedrock), OpenAI API, OpenAI Daybreak (security reviews), Structured output, Evals, LLM cost controls, Claude Code + Codex
- Testing + SEO
- Playwright, PHPUnit, Vitest, XCTest, Core Web Vitals, schema.org, AEO (answer engine optimization)
Trail register
A live count of the AI crawlers that visit this site. I build sites for AI assistants to read, and this is how I check that they do.
AI crawlers on this site
Last 30 daysLoading the live count…
Contact
Questions about a project? Email me.
Collision Repair Locator
More difficult run: Locator Peak, off the Summit ExpressMore difficult trail: Locator Peak, off the Summit ExpressLoop 6, more difficult: Locator PeakMore difficult trail to Locator Peak
At the topAt the topAt the checkpointAt the summit57,000search impressions
A public directory of 4,700+ certified collision centers. In its first months it went from zero to 57,000 search impressions and 2,200 Microsoft Copilot citations.
- Role
- Sole engineer, on contract for Assurity Certified Solutions
- When
- Launched July 2026
- Status
- Live
- Stack
- PHP 8, Custom MVC, MySQL, Google Maps + Places, schema.org, GA4, Search Console API, Bing Webmaster API, AWS Elastic Beanstalk
How it works
- Shop data4,700+ centers in 2,200 cities
- ZIP searchShops grouped by certification tier
- City pagesPlus driver guides with schema.org
- Google + Bing57,000 impressions by Sept 21
- Copilot2,200 citations in 60 days
Certification platform
Most difficult run: Portal Pinnacle, off the West Ridge QuadMost difficult trail: Portal Pinnacle, off the West Ridge QuadLoop 12, most difficult: Portal PinnacleMost difficult trail to Portal Pinnacle
At the topAt the topAt the checkpointAt the summit4,700+shops on the platform
A multi-tenant platform for a collision repair certification network, built from an empty repo. Shop, OEM, and management portals share one codebase, with geotagged photo checks and Stripe billing by card or ACH.
- Role
- Sole engineer, on contract for Assurity Certified Solutions
- Status
- In production
- Stack
- PHP, MySQL, Stripe, Docker, AWS Elastic Beanstalk, PHPUnit, Playwright
How it works
- Empty repoOne PHP codebase on MySQL, in Docker
- Three portalsShops, OEMs, and the management team, across 423 routes
- AssessmentsQuestions, file uploads, and geotagged photos
- ReviewApprove or reject each answer, with an audit trail
- BillingStripe invoices, paid by card or ACH
- Tests597 PHPUnit and 66 Playwright tests
Collision Estimate AI
Most difficult run: Estimate Ridge, off the East Face SixMost difficult trail: Estimate Ridge, off the East Face SixLoop 9, most difficult: Estimate RidgeMost difficult trail to Estimate Ridge
At the topAt the topAt the checkpointAt the summit16output languages
An API that turns damage photos into a line-item collision repair estimate, and explains insurance estimates in plain language, in 16 languages.
- Role
- Sole engineer, on contract for Assurity Certified Solutions
- When
- 2026
- Status
- In production
- Stack
- TypeScript, Next.js, AWS CDK, Lambda, API Gateway, DynamoDB, S3, Cognito, Amazon Bedrock, Claude
How it works
- Damage photosUp to six, plus a VIN or the year, make, and model
- API GatewayEvery API key checked against DynamoDB
- S3 uploadsPresigned URLs
- Claude on BedrockA forced tool call keeps output on schema
- Line itemsJSON plus a printable PDF invoice
Healthcare directory rebuild
Most difficult run: Legacy Pass, off the Saddle ChairMost difficult trail: Legacy Pass, off the Summit ExpressLoop 8, most difficult: Legacy PassMost difficult trail to Legacy Pass
At the topAt the topAt the checkpointAt the summit5,000listings migrated
I was tech lead on the rebuild of a healthcare publisher's paid directory of professionals. I also designed its move off a 45,000-account legacy platform, with no mass password reset.
- Role
- Tech lead
- Stack
- PHP, CodeIgniter, PostgreSQL, Stripe, JWT, Playwright
How it works
- Legacy data45,000 accounts across two databases
- ImporterAll 5,000 listings and 4,800 leads, rerunnable and checked against the old counts
- Old passwordsVerified on first login, then rehashed to bcrypt
- The directoryGeocoded search, listing tiers, and moderated reviews
- Billing and APIStripe, plus a REST API secured with JWTs
TossCost
Most difficult run: TossCost Knob, off the West Ridge QuadMost difficult trail: TossCost Knob, off the West Ridge QuadLoop 5, most difficult: TossCost KnobMost difficult trail to TossCost Knob
At the topAt the topAt the checkpointAt the summit<7 weeksfrom first commit to the App Store
A native iPhone app that reads grocery receipts with Claude vision and shows what the food you throw away actually costs.
- Role
- My product, built solo
- When
- June to August 2026
- Status
- On the App Store
- Stack
- Swift, SwiftUI, Core Data, CloudKit, StoreKit, Cloudflare Workers, Durable Objects, Analytics Engine, Claude
How it works
- Receipt photoCamera, photos, or a PDF
- WorkerApp token and image size guard
- Spend capA daily cap in a Durable Object, plus a kill switch
- Claude visionStructured output, no OCR
- Review screenYou fix anything Claude misread
Autism Friendly Care
More difficult run: Registry Dome, off the West Ridge QuadMore difficult trail: Registry Dome, off the West Ridge QuadLoop 3, more difficult: Registry DomeMore difficult trail to Registry Dome
At the topAt the topAt the checkpointAt the summit3.17Mprovider records in the pipeline
A free national directory of healthcare practices experienced with autistic patients, with the accommodation details families need before they book.
- Role
- Co-founder and sole engineer
- When
- 2026
- Status
- Private beta
- Stack
- Next.js 16, OpenNext, Cloudflare Workers, D1, Drizzle, Tailwind v4, Leaflet, PMTiles, Resend, Playwright, Vitest
How it works
- NPI registryThe federal provider registry
- GeocodingGeocodio
- D1 + Drizzle30-day point-in-time restore
- WorkersNext.js 16 through OpenNext
- Launch gatePrivate until a readiness register says so
No Bulls News
Most difficult run: Bull Butte, off the East Face SixMost difficult trail: Bull Butte, off the East Face SixLoop 7, most difficult: Bull ButteMost difficult trail to Bull Butte
At the topAt the topAt the checkpointAt the summit44news feeds
An AI news site that publishes on its own every hour. It groups coverage of each event from 44 feeds, Claude writes one short, blunt version, and a second model checks every claim against the sources before it runs. Fair warning: it swears.
- Role
- My site, built solo
- Status
- Live
- Stack
- TypeScript, Astro, Netlify Functions, Neon Postgres, Netlify Blobs, Claude, Playwright
How it works
- Every hour28 outlets, deduped by URL
- GroupingPostgres trigram matching first, then Haiku groups the rest by event
- TriageHaiku drops anything that isn't real news and merges duplicates
- Write onceSonnet writes each event once, under a daily spend cap
- Fact checkHaiku checks every claim against the sources. One rewrite, then it's out.
- PublishPage views read cached snapshots and never touch the database. Headlines go out in 8 more languages.
TradeChickens
Most difficult run: Chicken Crest, off the Summit ExpressMost difficult trail: Chicken Crest, off the Summit ExpressLoop 4, most difficult: Chicken CrestMost difficult trail to Chicken Crest
At the topAt the topAt the checkpointAt the summit319automated tests
A rules engine for stock and options trades on the Tradier brokerage API. The same code runs backtests and trades, and nothing reaches the broker until I approve it.
- Role
- My product, built solo
- Status
- Paper trading
- Stack
- Python, Django, PostgreSQL, Tradier API, Claude
How it works
- A rule firesA stock moves past the percentage I set
- StrategySizes the position, or picks the option contract
- News vetoClaude, with web search, checks why it moved. It can stop a trade, never start one.
- My approvalAn email link. Proposals expire, because a stale signal is a different trade.
- ExitA hard stop, then a trailing stop once the trade is up
Packlark
More difficult run: Lark Lookout, off the East Face SixMore difficult trail: Lark Lookout, off the East Face SixLoop 10, more difficult: Lark LookoutMore difficult trail to Lark Lookout
At the topAt the topAt the checkpointAt the summit16packing engines on the phone
A native iPhone packing app. 16 engines on the phone build the list and give a reason for every number, and Claude adds suggestions on top.
- Role
- My product, built solo
- Status
- In TestFlight
- Stack
- SwiftUI, SwiftData, CloudKit, WidgetKit, StoreKit, Cloudflare Workers, Claude
How it works
- Trip detailsDestination, dates, bags, and activities
- EnginesQuantities, activity kits, and what each item needs, each with a reason
- Claude, via a WorkerOutput checked against a JSON Schema and scored on 8 golden trips
- MergeA bad AI response can't corrupt a trip
- Travel rulesOnly from a source-backed table. Claude can't write one.
essentials for Claude Code + Codex
Easier run: Plugin Point, off the Meadow ChairEasier trail: Plugin Point, off the Meadow ChairLoop 11, easier: Plugin PointEasier trail to Plugin Point
At the topAt the topAt the checkpointAt the summit13review and testing agents
An open-source review and testing toolkit for Claude Code and Codex that detects your stack instead of hardcoding one.
- Role
- Author
- When
- 2026
- Status
- Open source
- Stack
- Claude Code plugins, Agents, Commands, Skills, Hooks, Multi-agent workflows, Codex skills
How it works
- /first-runProfiles the repo once
- /code-reviewPicks the reviewers
- ReviewersSecurity, logic, performance, and more
- One reportFix or comment on request
Design by Flora
Easier run: Flora Knoll, off the West Ridge QuadEasier trail: Flora Knoll, off the West Ridge QuadLoop 2, easier: Flora KnollEasier trail to Flora Knoll
At the topAt the topAt the checkpointAt the summit32booking requests
I rebuilt the site for a wig studio in Teaneck, NJ, and set up the marketing behind it: Google Ads, call and form tracking, and local search markup. In the first 10 weeks it brought in 32 booking requests and 40 call taps. Paid leads cost about $54 each, for wigs that sell for $2,000 and up.
- Role
- Freelance, for Design by Flora
- Status
- Live
- Stack
- Astro, Netlify, Netlify Forms, GA4, Google Ads, schema.org, Python
How it works
- RebuildOff WordPress and onto static Astro pages on Netlify. No database, no server.
- Booking formNetlify Forms, with a honeypot for bots
- Local searchschema.org markup and a Google Business Profile
- Google AdsOne search campaign at $16 a day, with call reporting
- TrackingGA4 counts booking requests and call taps. Ads imports them as conversions.
- ReportingA Python script pulls GA4 and Search Console and drops the bot traffic
Art Hanging Helper
Easier run: Hanger Hill, off the Meadow ChairEasier trail: Hanger Hill, off the Meadow ChairLoop 1, easier: Hanger HillEasier trail to Hanger Hill
At the topAt the topAt the checkpointAt the summit19how-to guides
A free calculator that tells you where to put the nail, for one piece or a whole gallery wall, plus 19 how-to guides.
- Role
- My site, built solo
- Status
- Live
- Stack
- PHP, SCSS, Heroku
How it works
- Your wallWidth and height, in inches
- Your artOne piece, or a grid of same or mixed sizes
- Hanger heightWhere the wire or hook sits on the back
- 57 inchesThe default center height, standard eye level
- Nail marksExact spots for every nail