~/jacobramos.com
$pwd:~/projects

Jacob Ramos

I build the apps that run your business — from custom e-commerce platforms to geospatial tools to AI agents that work while you sleep.

Available for new projects
// skyway-map.ts
export

SPSkywayMap

Live2026
from '@jacobramos/skyway-stack'
spskyway.com
the challenge

As a St. Paul resident, I wanted to give back to my community in a way that could have real impact. The skyway system connects 47 blocks of downtown but had no usable digital map — so I built one.

A geospatial navigation app mapping all 47 blocks of Saint Paul's skyway system. Multi-layer indoor maps with time-based routing, business POI search, transit integration, and ADA accessibility data — built on PostGIS with custom OpenStreetMap tiles. Businesses claim their listing through an onboarding call, then run hours, photos, events and review responses from a self-serve dashboard with one-way Google Business Profile hours sync.

47blocks5 miwalkways418directory placesPostGISspatial engine
3,100+ active users and 38K tracked events in one quarter — entirely organic, zero paid acquisition.
Multi-layer indoor map
Time-based routing
Business POI search
Transit integration
ADA accessibility data
Business self-serve dashboard
Google Business Profile hours sync
Self-hosted OSRM routing in Docker
Grow Downtown program
Next.jsSupabasePostGISOpenStreetMapOSRMDockerResendVercel
// routing-infra.ts
export

SkywayRoutingStack

Live2026
from '@jacobramos/skyway-stack'
spskyway.com
SkywayRoutingStack — The routing backend for spskyway.com: three OSRM engines in Docker — production,
the challenge

Turn-by-turn routing through the skyway needs a graph engine, and the hosted options either could not express an indoor network or wanted per-request money for a civic map with no revenue. So the routing runs on a Mac mini in my apartment — which means I own the uptime, and had to learn what that actually costs.

The routing backend for spskyway.com: three OSRM engines in Docker — production, a preview lane for graph promotes, and an unbiased outdoor profile — behind Caddy, with hand-written Lua profiles that bias walking routes onto the named skyway network. Ingress is a Cloudflare tunnel and a Tailscale funnel; a shared-secret header gates everything but the version endpoints; Postgres and PostgREST sit alongside. A cron script probes four endpoints every five minutes and mails me when one stops answering.

6containers3OSRM graphs88.86%checks passed, lifetime99.982%checks passed, July
88.86% of 81,992 synthetic checks passed across 100 days — three outage episodes, the worst ten days when the host lost outbound network and could neither serve requests nor send its own alerts. July: 99.982%.
Three OSRM graphs in Docker
Hand-written Lua walking profiles
Cloudflare tunnel + Tailscale funnel
Shared-secret gate at the proxy
Cron monitor with email alerts
Out-of-band check against the public site
DockerOSRMCaddyPostgresPostgRESTCloudflareTailscale
// city-portal.ts
export

CityPortal

Live2026
from '@jacobramos/skyway-stack'
www.spskyway.com/portal
the challenge

The city can't act on foot-traffic vibes. After the public map, I built the evidence layer: a sensor network over downtown and an authenticated portal where city staff see what's actually moving — with the privacy posture engineered in, not promised.

An authenticated common operating picture for City of Saint Paul staff. Live skyway foot traffic from Raspberry Pi sensors with on-camera AI person detection, joined with NWS weather and EPA air quality. Dashboard data reaches the city's browser only through a hand-enumerated field allowlist, and the live crossing feed is stripped server-side to bare count ticks. Counts display as calibrated ranges set against a manual head count, and every number carries a plain-language note explaining how it's made. The whole view lives in the URL — except the live-camera switch, deliberately excluded so a shared link can never start a stream.

0.45–0.65calibration factors32method notes0images storedIMX500on-sensor AI
In production with provisioned city-staff accounts — aggregate-only by design: counting happens on the sensor, and no camera images are ever recorded.
On-device person counting
Hand-enumerated data allowlist
Calibrated ranges, no midpoints
Plain-language method notes
Link-is-the-view URL state
Weather + air-quality context
Next.jsSupabaseRaspberry PiSony IMX500NWS / AirNow
// skyway-seek.ts
export

SkywaySeek

Live2026
from '@jacobramos/seek'
www.spskyway.com/hunt
// live — solve it yourself
SPSkyway_Hunt · Day 1 of 5
FROM clues@tctreasure.com · 11:00 AM
CLUE 01 / 05
READ ALOUD

“I share my name with every saint they call,
and from a copper crown I watch them all.”

Click a building to guess →
Tap any building above. The real hunt: 5 clues like this, one per day.
the challenge

Could the free map carry a paid product? A five-day treasure hunt through the skyway would prove it — if strangers would pay for tickets, follow daily clues, and point their cameras at QR codes in the field, all inside a 16-day build window before the event date.

A ticketed scavenger hunt built as two apps: a co-branded lander with Stripe checkout on the map's own domain, and seek — the play app where seekers receive daily clues, scan QR pickups with an in-browser camera, solve mini puzzles, and climb a leaderboard. Paid orders provision seeker accounts automatically. Behind it, a mission-control admin ran the live event: seekers, clues, QR codes, pickups, and the final cache, with every camera scan logged by stage — including the failures.

5hunt days16days to build42tickets sold259staged QR scans
42 tickets sold to strangers — 323 lander visitors, 93 to checkout, a 45% checkout-to-purchase rate — and 259 QR scan events logged by stage across 39 devices.
Practice clue before paying
Stripe checkout, early-bird tier
Cron-dropped daily clues
In-browser camera QR scanning
Mini puzzles + leaderboard
Mission-control admin console
Next.jsSupabaseStripeZXingWeb PushResend
// friends-of-skyway.ts
export

FriendsOfSkyway

Live2026
from '@jacobramos/skyway-friends'
skywayfriends.org
the challenge

Friends of the Saint Paul Skyway is a grassroots group working to preserve and expand downtown's skyway system. They needed more than a brochure — a working platform to run events, register members, gather community input, and broadcast updates. So I built one.

The organizing platform for Friends of the Saint Paul Skyway. A Next.js front-end paired with a 14-table Supabase schema powers event registration with guests and waitlisting, member signups, surveys, a community document library, QR short-link tracking, and a role-gated admin dashboard for running check-ins, exporting CSVs, and sending Resend email campaigns.

14DB tables20+dynamic routes573Friends recruitedResendbroadcasts
Event registration + guests
Role-gated admin dashboard
Email broadcast campaigns
Community document library
QR short-link tracking
Interactive skyway visualizations
Next.jsSupabaseResendTailwind CSSTypeScriptVercel
// skyway-eat.ts
export

SkywayEat

Live2026
from '@jacobramos/skyway-eat'
eat.skywayfriends.org
the challenge

Friends of the Skyway runs a seasonal dine-around event across multiple downtown restaurants. Attendees needed to rate dishes in real time, chefs needed a menu and sold-out console, and everyone needed a personalized recap email afterward. A single app had to hold all three audiences without confusing any of them.

A full-stack event platform with three distinct auth flows — attendee, chef, and admin — sharing a Supabase schema. Attendees scan in with zero taps, hold a 30-minute slot with a push warning near its end, and get pointed at whichever room has headroom next. Chefs manage menus and sold-out state. Admins watch a live health dashboard. Server actions compute a Bayesian-ranked 'Dish of the Night' and Resend dispatches HTML recap emails when the event closes.

5user roles8dietary tagsBayesiandish rankingLiveratings feed
Multi-chef menu management
1–5 star dish ratings
Wishlist tracking
Zero-tap QR check-in, plus-ones included
Live capacity + next-stop routing
Auto-handoff between venues
Personalized recap emails
Admin health dashboard
Next.jsReact 19SupabaseResendTailwind CSSTypeScript
// skyway-social.ts
export

SkywaySocial

Live2026
from '@jacobramos/skyway-social'
social.skywayfriends.org
the challenge

Forty-eight hours before Friends of the Skyway's flagship event, 200+ attendees were registered and there was no way to check them in at the door. I forked the Eat app, stripped it to essentials, and shipped a dedicated check-in app — QR self-check for guests, live admin board for volunteers, Friends opt-in capture — overnight.

A purpose-built check-in app for the Skyway Social event. Guests self-check via QR with unified name search; volunteers run a live admin board with party snapshots, inline guest capture, walk-in registration, and undo. Every Supabase mutation follows a hardened 'never lose data' pattern — destructure error, verify row count, audit failures — learned the hard way from a silent data-loss bug in a sibling project.

6 hrsto ship200+check-ins6routesSharedSupabase project
Built and shipped in six hours, then used live at the event it was built for.
QR self-check-in for guests
Volunteer live admin board
Inline guest capture
Walk-in registration
Magic-link admin auth
Audit-logged mutations
Next.jsReact 19SupabaseResendTailwind CSSVercel
// metro-transit.ts
export

MetroTransitLive

Live2026
from '@jacobramos/transit-stack'
metro-transit-live.vercel.app
the challenge

The skyway map needed transit integration, and I was not going to wire a feed I did not understand into a product people navigate with. So before touching the map, I built an instrument to watch Metro Transit's NexTrip GTFS-RT feed misbehave — every vehicle in the Twin Cities, live, until its quirks were obvious.

A developer instrument, not a consumer app. It decodes the GTFS-RT protobuf feed, snaps every vehicle to official route polylines from MnDOT shapefiles, and dead-reckons along real road geometry between 10-second polls — so the raw feed's teleporting coordinates become watchable motion. Running it is how I learned the feed's lag, its off-route vehicles, and its poll cadence before integrating transit into spskyway.com. Desktop-only on purpose: its user was me.

160routes10spoll rateGTFS-RTfeed formatLivedead reckoning
GTFS-RT protobuf decoding
Route-snapped dead reckoning
Shapefile polyline tracking
Multi-route filtering
Vehicle ID search
Serverless API proxy
Leaflet.jsGTFS-RTProtobufVercel
// forever-young.ts
export

ForeverYoungThrift

Live2026
from '@jacobramos/forever-young'
www.foreveryoungthrift.com
the challenge

Forever Young is a vintage and thrift shop in downtown Saint Paul run by two brothers, Isaac Garcia and Jose Garcia Jr. Every piece is one of a kind, which breaks the assumption sitting under most store software: that a listing can sell more than once. The register and the website can both reach for the same jacket, and exactly one of them is allowed to win.

A storefront and back office built around a single unit that can only sell once. The cart clamps every line to one, checkout re-fetches price and sold status on the server instead of trusting the browser, and the Square register and the website tell each other the moment something sells. The admin is built for a phone held over a rack: an in-app camera, HEIC conversion and downscaling before upload, on-device barcode scanning that prefills name and brand, and a button that opens eBay sold listings so pricing comes from real comps rather than a guess. Pickup orders move through three columns with an email at each step. Analytics read only the database, so a failed sync shows up as an error instead of as zero dollars.

11,297lines across 121 files33pages, plus 8 API routes45declared Playwright tests105commits since May
One-of-one inventory, clamped end to end
Server-side re-price at checkout
Square catalog and inventory sync
Phone camera intake with HEIC conversion
On-device barcode scan, eBay sold comps
Three-column pickup queue with emails
Analytics read from the database, never live
Installable PWA with an offline page
Next.jsReact 19SupabaseSquareStripePlaywrightResend
// downtown-st-paul.ts
export

DowntownStPaul

Retired2026
from '@jacobramos/dtstpaul'
downtown-st-paul
the challenge

Downtown Saint Paul gets described in press releases and in complaints, and the two do not agree. I wanted a resident-run guide where no number appears without the period it covers and a link to where it came from, including the numbers that make downtown look bad.

An independent guide to downtown Saint Paul. The scoreboard prints five headline figures, each stamped with its as-of date and linked to its source, and a unit test fails the build if either is missing. Where the official numbers disagree the page shows the range and names the disagreement rather than picking a side: office vacancy is published as roughly 12% to 40% depending on the firm and on what counts as inventory. A board at /now works out which downtown places are open at the current Central time from OSM opening-hours strings, carries a rail of what opened or closed in the last 30 days written by a nightly job that diffs the database against its own previous run, and accepts resident event submissions that stay invisible until a moderator approves them. Officeholders are stored role-first with the date each name was confirmed, on the theory that names go stale and roles do not.

5 of 5figures dated and sourced106distinct sources, 222 links94civic seats, 15 orgs172declared test cases
Retired in 2026. I stopped running it and repointed the domain at the Saint Paul Downtown Alliance, which is where someone typing dtstpaul.com is now better served. There is no live link to give, so the capture above is the record of what it did.
Five headline figures, dated and sourced
Ranges where the official numbers disagree
Open-now board computed from OSM hours
Nightly diff of what opened and closed
Moderated resident event submissions
Admin gated at the edge and again in-page
Officeholders stored role-first with dates
Next.jsReact 19SupabaseTailwind CSSVitestVercel
// linear-park.ts
export

LinearParkAlliance

Live2026
from '@jacobramos/linear-park'
linearparkalliance.org
the challenge

Saint Paul's skyway is five miles of climate-controlled, publicly owned corridor that the city classifies as building circulation. The Alliance argues it should be reclassified as a linear park. That case lands better if you can walk it, so the site is one horizontal walk rather than a stack of pages. I founded the Alliance and wrote the site.

A single horizontally scrolling walk through 21 panels. Mouse wheel, arrow keys, Home/End and a bottom rail of building silhouettes all drive the same track, which glides and then snaps to the nearest panel about a third of a second after you stop, while a counter climbs from mi 0.0 to 5.0 to map your position on the page to the length of the real corridor. Seven precedent panels cover the High Line, the San Antonio River Walk, Seoul's Cheonggyecheon, the Tampa Riverwalk, the Indianapolis Artsgarden, the Des Moines Skywalk and Saint Paul's own Town Square Park, each pairing photography with a video that does not start downloading until you press play. Under 1024px the same panels stack and scroll vertically, so there is no separate mobile build. One reading on the page is live: downtown air quality and temperature from Open-Meteo, refreshed every ten minutes and coloured by EPA category.

21panels in the walk8,240lines across 41 files4runtime dependencies9embeds gated behind a click
One horizontal track, four ways to drive it
Mileage counter mapped to the real corridor
Panels restack vertically under 1024px
Live AQI and temperature from Open-Meteo
Seven precedent projects, before and after
Petition embed plus a Turnstile-checked form
Signature-checked inbound mail forwarding
Next.jsReact 19TypeScriptOpen-MeteoTurnstileResendVercel
// dazzling-duvet.ts
export

DazzlingDoggieDuvet

Live2026
from '@jacobramos/dazzling-stack'
dazzlingdoggieduvet.com
the challenge

The core challenge was explaining a patent-pending dog bed to customers — what it is and how to use it. I built the entire platform from the ground up to make the product intuitive through the shopping experience itself.

A fully custom e-commerce platform with a 42-table Supabase schema, Stripe-powered checkout, loyalty points engine, UGC community with photo reviews, and an AI agent (Cleo) running on a Mac Mini that handles customer service, inventory, and marketing autonomously.

42DB tablesStripecheckoutCleoAI agentResendtransactional email
Custom loyalty engine
UGC photo community
AI agent operations
Stripe subscriptions
Automated email flows
Admin dashboard
Next.jsSupabaseStripeResendVercel
// revival-trust.ts
export

DowntownRevivalTrust

Live2026
from '@jacobramos/trust-stack'
downtownrevivaltrust.com
the challenge

A property trust buying and restoring historic buildings in downtown Saint Paul needed a public face that reads like an institution rather than a startup — and a structure that could hold a growing portfolio without a redesign each time a building is added.

An editorial site for a historic real-estate trust: numbered sections for mission, properties, investments and partners, set in a serif type system with drop caps and rules that borrow from print rather than from software. Built to take on new buildings as sibling pages under one identity.

§ I–IVnumbered sectionsEditorialtype systemTurnstileform protectionNext.jsframework
Editorial serif type system
Property portfolio structure
Investment thesis pages
Partner roster
Branded transactional email
Bot-protected contact form
Next.jsTypeScriptCloudflareVercel
// great-northern.ts
export

GreatNorthernBuilding

Concept2026
from '@jacobramos/trust-stack'
great-northern-building
the challenge

A 1910 Lowertown office building was being marketed on a site that undersold it. I built the redesign as a working site rather than a deck — the argument for the rebrand is easier to make when you can click it.

A leasing site for the Great Northern Building, designed as part of the Downtown Revival Trust family: full-bleed black-and-white architectural photography, a fact sheet of floor plates and availability, neighbourhood context, and amenities — all under the Trust's identity so the portfolio reads as one owner.

1910year built5sectionsB&Wart directionConceptstatus
Full-bleed architectural photography
Property fact sheet
Availability listings
Neighborhood context
Amenities overview
Shared Trust identity
Next.jsTypeScriptVercel
// task-force.ts
export

TaskForceContractors

Live2026
from '@jacobramos/task-force-stack'
taskforcebuilds.com
the challenge

Task Force Contractors is a Service-Disabled Veteran-Owned small business in Tampa doing custom builds and remodels. They needed more than a brochure site — a working CRM so one operator could run leads, convert them to clients, and send branded email campaigns without paying a SaaS tax on top of their construction work.

A full-stack Next.js site with a built-in admin CRM. The public side shows off 19 before/after galleries, 7 service categories, testimonials, team bios, a Leaflet service-area map, and a lead-capture form. The admin side runs a 5-stage Kanban pipeline (New → Contacted → Proposal → In Progress → Completed), converts inquiries to clients, and sends bulk email campaigns with dynamic name substitution from a 5-template library.

19before/afters7service categories8DB tables5-stagepipeline
Before/after project galleries
5-stage Kanban lead pipeline
Inquiry → client conversion
Bulk email campaigns
Leaflet service-area map
Careers + team bios
Next.jsSupabaseResendLeafletFramer MotionTailwind CSSVercel
// bambu-menu-boards.ts
export

BambuMenuBoards

Live2026
from '@jacobramos/open-civ'
www.open-civ.com/bambu-menu-index
the challenge

Bambú, an Asian restaurant fronting the St. Paul skyway, needed its five TV menu boards to run themselves — no laptop taped behind a screen, no staff restarting anything, reliable through power cuts and a weak back-of-house Wi-Fi radio.

Five portrait menu boards driven by three Raspberry Pi 5s over dual HDMI, live since June 2026. I designed the boards as a coded design system, render each to a seamlessly looping MP4, and the Pis play from local disk so the wall never depends on the network. HDMI-CEC wakes the TVs at open and sleeps them at close; a heartbeat POSTs every five minutes and a Vercel cron mails me if a screen goes quiet for fifteen. Getting Pi 5 dual output stable meant leaving Wayland for X11 and mpv; one on-site afternoon pinning a Pi to a specific radio took its ping from 1100ms to 9ms.

5TV boards3Raspberry Pis28d+unattended uptimeX11 + mpvdual-HDMI player
The reachable player has looped for 28+ days unattended, waking and sleeping its TVs on schedule and heartbeating home — verified over SSH the day this went up.
Coded board design system
Board → looping MP4 render
Offline-first local playback
HDMI-CEC TV scheduling
Heartbeat + email alerting
One-command Pi provisioning
Raspberry PiNext.jsmpv / X11HDMI-CECSupabaseVercel
// skyway-ios.ts
export

SkywayIOS

Unreleased2026
from '@jacobramos/skyway-stack'
skyway-ios
the challenge

The web map answers 'where is it' at a desk. Walking the skyway is a different problem: you are indoors with no street to orient by, GPS gets unreliable between floors, and you want the phone in your pocket rather than in your hand. That needs a native app that can keep talking while it is locked.

A SwiftUI iPhone client for the skyway. It plans a route between two places and then speaks the turns with the phone locked and pocketed, ducking music instead of stopping it, while a Live Activity on the lock screen and Dynamic Island carries the next maneuver, the distance to it and the level you are on. Kill the app mid-walk and relaunching offers to resume at the step you were on. Indoors it ranges iBeacons and fuses them with GPS along the route, with RSSI smoothing, path-loss distance, a two-beacon crossfade and an along-route Kalman filter; that fusion path is exercised by a synthetic sighting generator in tests, not yet by hardware in the field. The explore map carries paths, buildings, entrances, parking and transit with a level selector and four basemap styles, and an entrance scout built on Look Around drops you at a specific door.

43,589lines of Swift, 239 files736test cases4recorded walks asserted in tests9local Swift packages
Spoken turn-by-turn with the phone locked
Live Activity and Dynamic Island
Resume a killed route at the same step
Level inference so routes start on the right floor
iBeacon ranging fused with GPS along the route
Explore map with level selector and 3D basemaps
Look Around entrance scout, door to door
Swift 6SwiftUIMapKitCore LocationActivityKitSwift TestingXcodeGen
// ramosware.ts
export

Ramosware

Live2026
from '@jacobramos/ramosware-studio'
ramosware.com
Ramosware — The marketing site for RAMOSWARE, a dark-first indie app studio shipping iOS and
the challenge

I needed a home for my indie app studio — somewhere that matched the dark-first philosophy of the apps themselves. Not a template, not a Squarespace site. Something built from scratch that feels like the products it represents.

The marketing site for RAMOSWARE, a dark-first indie app studio shipping iOS and visionOS apps. Features a Three.js 3D wireframe hero, Framer Motion scroll-linked animations, glassmorphism app cards with perspective tilt, custom cursor, and grain overlays — all optimized for performance without sacrificing visual polish.

3appsThree.js3D hero10shapesDarkby default
Three.js wireframe hero
Scroll-linked animations
Glassmorphism app cards
Perspective tilt on hover
Custom cursor with lerp
CSS grain overlay
Next.jsThree.jsFramer MotionTailwind CSSVercel
// wrespo.ts
export

Wrespo

Never deployed2025
from '@jacobramos/wrespo'
wrespo
the challenge

Anyone hiring a contractor can check the licence, in theory. In practice each state keeps its own database, none of them are pleasant to search, and so almost nobody checks. Wrespo was designed as three sides of one loop: a homeowner verifies a licence, the contractor finds the profile a licence import already built for them and claims it, and contractors who claim get offered AI phone agents that answer calls and book jobs. It is the oldest thing in this list, and the only one I never launched.

The finished piece is the data model. A 19-model Postgres schema covers licence records with status, issue and expiry dates, bond amounts and disciplinary flags; a five-stage claim flow with six-digit codes, attempt caps, and separate expiry clocks for the code and for the flow; consumer accounts, reviews and helpfulness votes; verification badges a contractor embeds on their own site, tied to the domain they run on and counted for impressions and clicks; referrals; sponsored placements; and a per-state sync log recording how many records each import processed, created, updated and errored. A second repo holds the voice side: eleven ElevenLabs agent configurations, two of them throwaways, and the endpoint their webhook tool calls, which reads availability out of HubSpot, books the slot and creates the contact. It was designed and built. It was never launched, and nobody has used it.

19Prisma models, 10 enums48declared indexes11voice agent configs50,771characters of agent prompt
Licence lookup by number and state, seven statuses
Five-stage claim flow with codes and attempt caps
Contractor profile with a completion score
Embeddable badge counted for impressions and clicks
One review per homeowner, one contractor reply
Per-state sync log with error detail
Voice agent that books into a HubSpot calendar
PrismaPostgreSQLNext.jsTypeScriptElevenLabsHubSpot
// services.ts

What I Build

Every project is built from scratch to fit the problem. No templates, no page builders — just clean, production-ready code.

Custom Web Applications

Full-stack applications built with Next.js, React, and TypeScript. From concept to deployment on Vercel — designed around your specific business needs.

E-Commerce Platforms

Custom storefronts with Stripe checkout, subscription billing, loyalty systems, and admin dashboards. Not templates — built from the ground up for your product.

Geospatial & Mapping Apps

Interactive maps and location-based tools built on PostGIS, Leaflet, and OpenStreetMap. Indoor navigation, spatial queries, and custom tile layers.

AI Agent Systems

Autonomous AI agents that handle real business operations — customer service, inventory management, email marketing, and more. Running 24/7 on your infrastructure.

// process.ts

How I Work

Every project follows a clear, predictable process from first conversation to production deployment.

01Discovery

We talk about your idea, your goals, and what success looks like. No jargon, no pressure — just a conversation about what you need built.

02Scope & Proposal

You get a clear plan with specific deliverables, timeline, and investment. No surprises down the road.

03Build

I develop in sprints and share progress along the way. You see real, working software — not mockups — throughout the process.

04Launch & Support

I handle deployment, DNS, and production setup. After launch, I stick around to make sure everything runs smoothly.

// about.ts

About

I'm a self-taught developer based in Minnesota building full-stack applications with a focus on geospatial data, e-commerce, and AI agent systems. I ship fast, iterate on real feedback, and care about the details.

FrontendNext.js, React, TypeScript, Tailwind CSS
BackendSupabase, PostgreSQL, PostGIS, Node.js
PaymentsStripe (checkout, subscriptions, webhooks)
AI / AutomationClaude Code, Make.com
DevOpsVercel, GitHub Actions, DNS
MappingPostGIS, OpenStreetMap, Mapbox, Leaflet
// contact.ts

Start a Project

Have an idea for a web app, e-commerce platform, or something that doesn't exist yet? Tell me about it.

# README.md

AboutProjects
© 2026 jacobramos.comv1.0.0