Portfolio · 2000 – present

Code & Projects

I’m a Staff frontend engineer at InterNations, and I’ve been building for the web since 2000. This page collects the personal work: a travel-planning product, command-line tools, and open-source libraries—some of them maintained for well over a decade.

50+ repositories~700 starsArctic Code Vault contributorgithub.com/patik

Dovetail

dovetail.travelThe dovetail.travel landing page: “Plan every day of your trip—with the details and control you want.”

Dovetail is a complete product—design, engineering, and operations—built and run solo. It’s a trip-planning calendar for hands-on travellers: day-by-day logistics with rich entry types, a trip map, a wishlist for unscheduled ideas, and print-friendly itineraries. It runs on the web and as native iOS and Android apps, with subscriptions handled across Stripe and the app stores.

The source is closed, but the engineering is the interesting part:

  • Offline-first by design. Trips live in an IndexedDB cache with a sync queue, so the app stays fully usable without a connection and reconciles with Supabase when it returns.
  • One TypeScript codebase, three platforms. React 19 on Vite, wrapped in thin Capacitor shells that provide native auth, networking, and geolocation.
  • Tested like a team built it. A Playwright end-to-end suite runs against seeded IndexedDB fixtures with a fake signed-in user, so CI needs no backend credentials.
  • Systematic theming. A design-token colour system keeps light and dark mode consistent across web and native.

Role

Design, engineering, and operations—solo

Stack

React 19TypeScriptViteTanStack QueryTailwind CSS 4SupabaseIndexedDBMapbox GLCapacitorPlaywright

Links

Command-line tools

Developer experience is a feature. Small tools that remove daily friction from the terminal—each one built because I kept wanting it.

$ git prune-branches

git-prune-branches

Answers the eternal question of which local branches are safe to delete. It fetches and prunes, then sorts branches into three groups—merged and safe (pre-selected), unmerged and requiring a force-delete (deliberately not), and informational—and shows the exact git commands before running them.

inquirer-form-prompt

inquirer-form-prompt

A form in the terminal: text inputs, radios, and checkboxes laid out on one screen with sensible keyboard navigation—for CLIs that would otherwise ask a dozen questions one at a time.

inquirer-grouped-checkbox

inquirer-grouped-checkbox

A checkbox prompt for long, structured lists: choices are grouped under selectable headers, filterable in real time, with per-group counts and select-all / select-none controls.

inquirer-select-with-state

inquirer-select-with-state

Inquirer’s select prompt with one addition: a live banner above the choices. Kick off async work—a directory size, an API call—and stream its progress while the user decides.

Apps & sites

Depth-of-Field Calculator

A calculator and comparison tool for photographers. Line up any number of camera-and-lens configurations, adjust apertures and distances, and compare the results in a chart. The whole setup is encoded in the URL, so a comparison is easy to share.

  • patik.com

    Astro with React islands, Cloudinary-backed travel galleries, and a CI pipeline that runs visual-regression and accessibility tests with Playwright. The codebase is public.

Libraries

Long-term maintenance is the point. These have been carried across several eras of the JavaScript ecosystem—script tags, jQuery, AMD, and now typed ES modules.

  • within-viewport

    Determines whether an element is entirely inside the viewport—or any scrollable container —with configurable thresholds per side. Began as a jQuery plugin, rewritten over the years into a dependency-free TypeScript package, with the API kept steady the whole way.

  • kindjs

    typeof, but precise: kind([1, 2, 3]) is 'array', kind(null) is 'null', and kind(new Date()) is 'date'. Useful names for JavaScript values, DOM nodes included.

  • simple-stdout

    Run a shell command, get its stdout as a string—a tiny promise-based wrapper around Node’s child_process, with an execFile variant for untrusted input.

Contributions

Notable work from my public-sector years, built with the New York State Office of Information Technology Services.

  • Core UI & the Excelsior Web Framework

    Core contributor to Excelsior, the framework behind dozens of New York State sites, and to Core UI, its component-based successor designed for web apps.

  • DMV Registration Renewal

    A responsive redesign of one of the state’s highest-profile transactions on the Department of Motor Vehicles’ site.

  • Talks & code sprints

    Go Responsive, a showpiece from a responsive-web-design code sprint, and an Ignite talk at NYS DevCon 2013.

From an earlier era

Kept online because old links shouldn’t rot. Interesting today mainly as artifacts of what the web used to require.

  • console.log-wrapper

    Made console.log safe and consistent across the browsers of the early 2010s — including the ones where the console only existed while the developer tools were open. Obsolete in the best way: the platform caught up.

  • User scripts & extensions

    Greasemonkey scripts and small browser extensions, from the era when you fixed websites yourself.

There’s more—experiments, forks, and abandoned ideas included—at github.com/patik , and occasional writing on the blog.