Joshua Curry

Full stack web developer with a focus on mobile, accessibility, and creative coding

Email Joshua Curry LinkedIn Joshua Curry

JC
ChatJC Online

Hi, I'm ChatJC

Ask me anything about Joshua's experience, skills, projects, recommendations, volunteer work, writing, or how this chatbot was built.

Berliner Zeitung logo

Advanced advertising and tracking features for Berliner Zeitung

Developed advertising and analytics integrations within a large-scale hybrid Next.js/TypeScript codebase for one of Germany's major daily newspapers. Implemented header bidding and ad delivery via Quality Media Network and Outbrain, with tracking and analytics across Segment, Google Analytics, Clarity, and Sourcepoint for consent management (CMP). Built custom scroll-intersection event staging to handle paywall instrumentation and ad viewability — several vendor scripts were not designed for SPAs, requiring adapter logic that also survived React's deprecation of legacy page lifecycle events in recent versions.

React
Next.js
TypeScript
Node.js
Prebid
Segment
Sourcepoint
Berliner Zeitung logo

React Native app for Berliner Zeitung

Complete rewrite of a legacy React Native codebase to a current Expo managed workflow, replacing a Fastlane-based build pipeline with Expo's managed build and distribution system. Internationalized the member area and subscription interface to support multiple languages and currencies. Rebuilt all animations to use current React Native Reanimated standards. Added accessibility support for dynamic type scaling and screen magnification. Architected bidirectional messaging between native contexts and embedded WebViews, with shared data across navigation contexts using React's context API.

React Native
TypeScript
Expo
Apollo
MongoDB Atlas
Screenshot of website

Sprogeny: online tool to mashup Spotify playlists

A full-stack SvelteKit web app integrating with the Spotify Web API via server-side OAuth 2.0. Users combine multiple playlists with configurable weight ratios — tracks are deduplicated using hashed user IDs in PostgreSQL to preserve privacy, then the shuffled result is written back to the user's Spotify library via the API without modifying originals. Three.js handles 3D visual rendering. Self-hosted on Digital Ocean with Matomo for cookieless, privacy-respecting analytics.

SvelteKit
Three.js
Spotify API
PostgreSQL
Matomo
Node.js
Skulls composing music with computer vision and a custom YOLO5 AI model

AI model for computer vision and music composition

Trained a custom YOLOv5 object detection model on a self-created dataset annotated in Roboflow. Inference runs on a Grove Vision AI module at the edge, with detected object classes and confidence scores mapped to musical parameters — pitch, velocity, and timing. Results are published over a local MQTT broker to a Raspberry Pi running FluidSynth and Pygame for real-time audio synthesis. Winner of the Seeed Studio Vision AI challenge.

Python
YOLOv5
Roboflow
Grove Vision AI
MQTT
FluidSynth
Raspberry Pi
Screenshot of the source code of a web page

Internal AI tools for web development

Two open-source Node.js CLI tools that use Mistral AI to augment existing or statically-built web projects with structured metadata — no framework lock-in or vendor dependencies required. alt-tagger fetches images from a Cloudinary library via the Admin API, generates WCAG-compliant alt text using the Mistral vision API with a tightly constrained prompt, and writes results back to the Cloudinary DAM. generatejsonld crawls a target URL up to a configurable cap with politeness delays, analyzes page content and metadata to determine contextually appropriate JSON-LD schema specific to what the site is rather than how it was built — in practice producing accurate outputs such as medical service schema for a therapist's site. Both tools are configured via CLI parameters and packaged as part of a freely available general-purpose web development toolkit.

Node.js
Mistral AI
Cloudinary API
JSON-LD
Screenshot of berlinartgalleries.de homepage showing gallery directory

Dynamic directory of Berlin art galleries

A PHP/JavaScript web application maintaining a live directory of Berlin's 300+ art galleries. A Node.js cron job runs Playwright to scrape and screenshot each gallery's homepage on a regular schedule. Screenshots are processed with ImageMagick to generate optimized versions in JPEG, WebP, and AVIF formats, then stored on the server. Gallery metadata is sourced from the Google Places API. Self-hosted on Digital Ocean.

Node.js
Playwright
PHP
JavaScript
ImageMagick
Google Places API
Screenshot of a video playing abstract images

vid2midi: open source tool to sonify video files

A Python CLI tool that sonifies video by analyzing each frame's HSV (Hue, Saturation, Value) color data and mapping the values to chromatic scale notes with proportional durations. Outputs standard MIDI files, with optional CC signal output for continuous parameter control in a DAW. Designed for video-first composition workflows in Reaper, Ableton, or Reason — the inverse of audio-reactive visuals. Available as a GitHub release.

Python
MIDI
Deed logo

React Native mobile and web development for Deed

Frontend development for the Deed charitable giving platform — an unusual hybrid architecture where React Native powered both the main website and the mobile apps within a single codebase. Upgraded app-specific build libraries including Expo (unmanaged workflow). Built the employee onboarding flow and account management UI. Backend integration via Apollo GraphQL against MongoDB Atlas with custom data components. Accessibility work included custom speech announcements for interactive elements, keyboard navigation, and programmatic focus outlining to meet WCAG standards across iOS and Android.

React Native
TypeScript
Expo
Apollo
MongoDB Atlas
Hand holding a phone

Mobile app for Charleston Wine+Food

A mobile-optimized HTML5 PWA for the annual Charleston Wine+Food festival, distributed via mobile web. Featured interactive maps, a vendor directory sourced from Google Sheets, and a dynamically updated event schedule pulled from a custom API built on a proprietary CMS called Foundation. Broadly compatible across the mobile device landscape of 2011.

HTML5
JavaScript
Google Sheets API
Art Review Generator website interface

AI-powered art review generator

A Flask web application that generates art criticism from natural language prompts using a GPT-2 model fine-tuned on a corpus of 10,000+ Artforum Magazine reviews (purchased access, scraped with Puppeteer). Training was done in Google Colab using GPT-2 Simple with Google GPU compute. Inference runs on TensorFlow on CPU via a separate Python worker process subscribed to a RabbitMQ queue — currently deployed on a Raspberry Pi 4 connected to the Flask host through an SSH tunnel. MySQL handles persistence.

Python
GPT-2
TensorFlow
Flask
RabbitMQ
MySQL
Mathway (formerly Chegg Math Solver) interface

Code refactor for Chegg

Brought in mid-migration to assist converting a high-traffic PHP/Twig codebase to a React SPA for Chegg's Math Solver product (now Mathway). Full component rewrites with minimal documentation and no knowledge transfer from the outgoing team. The product served multiple subscription tiers, each unlocking different solver capabilities — requiring careful state modeling beyond simple auth gating. Implemented ARIA definitions, focus trapping, and full keyboard interaction throughout. Added Jest unit tests alongside new feature development.

React
TypeScript
Node.js
PHP
Jest
Oath website navigation interface

Accessible navigation and web development for Oath

Rebuilt the global navigation for Oath (now Verizon Media / Yahoo!) as part of a company-wide rebrand and accessibility initiative. The navigation was multi-level and responsive, with positioning that adapted to page context — all from a single React/TypeScript codebase serving mobile and desktop. Full screen reader and assistive control support throughout. Required IE11 and broad Safari compatibility, i18n localization, and marketing tracking integration. Production releases were carefully staged due to the scale of active users on the live property.

React
TypeScript
Node.js
PHP
Twig
i18n
People waving paper fans

Embers: a breath powered interactive installation celebrating collaboration

A standalone interactive LED installation built from 1,250 WS2811 LEDs across 25 strands, driven by an Arduino Mega 2560 running FastLED. Sixteen Modern Device wind sensors (Rev. P) arranged in concentric circles feed analog readings into a dedicated sensor Arduino, which maps activity levels and transmits to the LED driver Arduino over I2C. Outer rings trigger baseline light activity; sustained collaborative wind from multiple directions raises the average activity threshold, shifting color from red through orange to white at peak intensity. 300ft of rice paper diffuses the output. Debuted at the SubZERO festival, exhibited at Kaleid Gallery.

C++
FastLED
Arduino
I2C
Blackbaud Interactive services page

Lead development for redesign of Blackbaud Interactive

Led frontend development for a greenfield redesign of Blackbaud Interactive's agency portfolio. Built a custom child theme on classic WordPress, with distinct responsive layout templates per case study. Extended the CMS with custom post types and fields so non-technical staff could publish new case studies without developer involvement. Pre-flexbox, CSS alone couldn't maintain the required positional relationships between elements — JavaScript handled layout geometry that the cascade couldn't express at the time. Self-hosted, 2013.

PHP
Javascript
WordPress
Bootstrap
DreamFactory website homepage

UX/UI development and API integration for DreamFactory Software

Frontend development and API integration across DreamFactory's marketing site and platform. Delivered 42 A/B tested landing pages using Google Optimize and a custom Drupal plugin. Integrated HubSpot for form processing, CRM sync, and marketing automation — with a HubSpot–Salesforce bridge for lead pipeline management. Modernized a legacy PHP authentication flow to align with DreamFactory's evolving REST API platform. Traditional server-rendered Drupal install.

Drupal
Google Optimize
HubSpot
Salesforce
PHP
Hand holding phone with application running

Spoleto Festival mobile app

A mobile-optimized HTML5 web app for Charleston City Paper's three-week coverage of Spoleto Festival USA, distributed via QR code in print marketing. Featured a full event calendar and editorial content driven by a proprietary CMS (Foundation). Geolocation-based dining suggestions used a dual approach — the browser Geolocation API where available, with venue proximity calculated from known coordinates as a fallback. Automatically updated throughout the festival run. 2010.

HTML5
Javascript
Geolocation API
PHP
Man holding cellphone

GPS enabled web app for tracking wolves

A GPS-enabled web app for tracking animated wolves projected across city neighborhoods as part of a public art performance. Wolf locations updated in real time via GPS data transmitted from performers over the cell network to a hosted PHP endpoint, stored in MySQL, and rendered on a Mapbox GL JS map backed by OpenStreetMap tiles. Custom KML overlays displayed the pre-planned wolf routes. Built from scratch — client and server. Designed to run across a broad range of mobile devices. 2017.

Javascript
Mapbox GL JS
PHP
MySQL
OpenStreetMap
Hand holding a phone

AAN Web Conference event app

A mobile web app for the annual AAN tech conference in San Francisco, distributed directly via social media. Event organizers managed all content — schedule, speaker profiles, nearby restaurants, and marketing content — in a Google Sheet, which was fetched at runtime via the Google Sheets API and hydrated into the page with JavaScript. Served via Apache/PHP. 2013.

Javascript
Google Sheets API
PHP
Apache