Senior Software Engineer

Israel Dryer

hello@israeldryer.com github.com/israel-dryer (704) 379-2454 Charlotte, North Carolina

I design frameworks other developers build on.

Three of these frameworks live in Python's desktop ecosystem: a theming and design-system layer, an icon system, and a full application framework on Tk. My day job is platform work within a supply-chain product, where the same instinct applies: build a cohesive solution and configuration framework that enables and expedites solution implementation. The connecting factor in all of these is API design.

Plenty of developers are satisfied with an API that works correctly; this is expected. But for me, it should also feel good to use — organized, discoverable, documented, easy to read. That is the difference between an API that is usable and one that is productive and pleasant to use. I spent most of my career as a consumer of productivity applications. The end user experience is always at the forefront of my mind when designing an API.

ttkbootstrap

ttkbootstrap.org2021 — present · creator & maintainer
ttkbootstrap widget showcase: color swatches, themed buttons, inputs, meter, data table and notebook
The widget set under one theme. Every control here is stock ttk — the styling comes from the theme, not from per-widget color work.

A theming and design-system layer for Python's tkinter. Thirty curated light and dark themes that switch at runtime, a single bootstyle keyword that styles any widget by intent, 2,000+ icons rendered from a font rather than shipped as image assets, and a declarative Theme() API for building a custom design system. Pure Python, one dependency.

Problem
Existing ttk themes are static, must be loaded at runtime to be available, and do not allow for much customization. Additionally, customization itself is painful, with dot-separated names like primary.Striped.Horizontal.TProgressbar. The segments are order-dependent, largely undocumented, and — the real cost — a wrong one fails silently. You get an unstyled widget and no error, so the feedback loop is guesswork. Tkinter does not ship with icons. You must use png images, which is a packaging nightmare.
Constraint
I couldn't change ttk. Whatever I built had to sit on top of the existing style engine, keep working with plain tkinter code already in the wild, and stay pure Python with one dependency so it installs anywhere Python does.
Decision
All themes were generated on-demand at runtime through a theme definition. This maximizes memory while providing maximum flexibility on theme availability and customization. Image-based widgets greatly enhanced the look and feel, and packaged assets were inconsequential through a method of color replacement - black, white, magenta color were replaced on-demand to provide any color combination with a single asset. Instead of long dot styles, the open-ended string with a closed grammar. bootstyle accepts a fixed keyword vocabulary in any order, resolves it to the underlying ttk style name, and raises on anything it doesn't recognize. Colors come from whichever theme is loaded rather than from literals at the call site, which is what makes runtime theme switching possible at all. Finally, icons are built-in and were added through a created technique I deployed on the `tkinter-icons` project by creating on-demand images through a bootstrap font icon. This gives you access to thousands of customizable icons.
Tradeoff
A closed grammar means the library has to know every valid combination, so supporting a new widget is library work rather than something a user can improvise. And validating loudly is a behavior change from tkinter's silent tolerance — worth it, but it's a real break with what the platform does by default.

tkinter

# ordered, undocumented,
# silent when wrong
ttk.Progressbar(
  style="primary.Striped.Horizontal.TProgressbar"
)

ttkbootstrap

# any order, validated;
# a typo raises
ttk.Progressbar(
  bootstyle="primary striped"
)

The same keyword vocabulary styles every widget in the library. Change the theme at runtime and all of them follow:

primary success info warning danger
ttkbootstrap Tableview: a themed data table with search and pagination
Tableview — search, sort and pagination, themed by the same keyword vocabulary as everything else.
4.2Mdownloads
145kper month
2.6kstars
30themes
5 yrsmaintained

Mediq

github.com/israel-dryer/mediqPostgreSQL · Python · Docker

The scheduling core of a medical practice, built as a Postgres project: what does it take to make double-booking structurally impossible rather than merely unlikely?

Problem
Double-booking is a race condition. Check-then-insert reads an open slot, finds it free, and writes — and so does the session running the same three steps a millisecond later. Retrying around it moves the race rather than removing it.
Constraint
I wanted the rule to hold for every writer, not just the ones that go through a booking service — a backfill script, a seed, a psql session. That rules out enforcement in application code.
Decision
Push the invariant into Postgres. Provider time — appointments, holds, time off, admin blocks — is one table with a tstzrange and a gist exclusion constraint, so two overlapping live claims on the same provider cannot both exist. There is no patient on that table: an appointment points at a claim rather than carrying its own times, so one constraint covers every way a calendar can be occupied, and a vacation block prevents double-booking for free. The losing write fails at insert time; the booking function turns that failure into a named slot_taken error.
Tradeoff
Callers have to treat a constraint violation as an expected outcome rather than a bug, and the scheduling rules live in migrations instead of in code a developer reads first. In exchange the invariant is a property of the data, not of the paths that happen to reach it.

The constraint — migrations/0003_occupancy.sql, trimmed

CREATE TYPE claim_kind AS ENUM ('appointment', 'hold', 'time_off', 'admin');

CREATE TABLE time_claim (
  id           uuid PRIMARY KEY DEFAULT uuidv7(),
  provider_id  uuid NOT NULL REFERENCES provider(id),
  during       tstzrange NOT NULL,
  kind         claim_kind NOT NULL,
  expires_at   timestamptz,  -- holds only: NULL = never lapses
  released_at  timestamptz,  -- set on cancel; the row stays

  -- two live claims on one provider cannot overlap.
  -- not a check the app runs. a fact about the table.
  CONSTRAINT no_overlap EXCLUDE USING gist (
    provider_id WITH =,
    during      WITH &&
  ) WHERE (released_at IS NULL)
);

Cancellation is a release, not a delete. Appointment status changes cascade into released_at through a trigger — canceled and bumped free the time, a no-show deliberately does not — and the row stays, so the history survives. The same table carries time-limited holds, which is the groundwork for an ASAP waitlist: a released slot is held for one patient at a time, and a hold that nobody takes lapses on its own rather than needing a sweeper to be running.

Also maintaining

bootstack2026 — present
A bootstack analytics dashboard: charts, metrics and a data table in a desktop window
A dashboard built with bootstack. Desktop Python, no web view.

A full application framework on Tk, and the largest of the three. Declarative context-manager layout where the code hierarchy is the UI hierarchy; reactive signals for state that flows between widgets; an event stream API with composable filtering, debounce and throttle; hot reload that keeps your place across saves; and a CLI that scaffolds a project, runs it, and packages it to a standalone executable.

bootstack workbench layout: navigation rail, sidebar and content area
Workbench — rail, sidebar, content.
bootstack DataTable with column chooser, filtering and grouping
DataTable — filter, group, edit, export.
PythonReactive stateCLI toolingPackaging
60+widgets
Signalsreactive state
Hot reloadkeeps your place
tkinter-icons2025 — present
Icon glyphs from sixteen icon packs rendered by tkinter-icons
Sixteen icon families, one API, no image files on disk.

A font-based icon system for tkinter — Material, Font Awesome, Lucide, Bootstrap, Simple Icons and eleven more behind one uniform API. Shipped as eighteen distributions that install as extras, so you pick the families you want and the distribution names never surface in your code.

PythonPackagingFont rendering
61,000+icons
16families
18distributions

On the web

Catan DiceAngular · Ionic · Firebase · Dexie
Catan Dice running on a phone: dice roll screen and roll history
Rolling and roll history. Installs to the home screen and runs offline.

A companion PWA for the Catan board game: Firebase for authentication and remote storage, Dexie and IndexedDB for local persistence so it keeps working offline. Source.

Adventures in FaithReact 18 · Chakra

A fast, installable book reader for the memoirs of Duane H. Klepel and related works. One layout that reflows from a two-pane desktop view to a single phone column, with bookmarks and reading position carried across all 165 pages. Source.

Adventures in Faith on desktop: page-thumbnail sidebar on the left, chapter text on the right, page 9 of 165
Desktop — page thumbnails and bookmarks alongside the text.
Adventures in Faith on a phone: continuous scrolling chapter text with a bookmark marker, page 18 of 165
The same book on a phone — one column, position kept.

Work

LogistiVIEWCharlotte, NC

I find the gaps in the platform, propose what should fill them, and then build it. Shared capabilities — Workflow Builder, Dataset Builder, Parameter Guidance, configurable web forms — designed so implementation teams can adapt them without pulling in engineering. Underneath that, the high-volume operational workflows themselves, including a re-architecture of core task management for the batch-driven operating model of a Fortune 100 retail enterprise.

Roles
Senior Software EngineerNov 2024 — present
Platform ArchitectOct 2021 — Nov 2024
AngularTypeScriptSystems designClient-facing
Grant ThorntonCharlotte, NC

Predictive modeling, sentiment analysis, process automation, and intelligence gathering through document and web-based extraction — delivered for internal stakeholders and owned end to end, from requirements discovery through knowledge transfer.

Roles
Manager, Enterprise Reporting & AnalyticsAug 2016 — Oct 2021
Senior Financial AnalystMar 2014 — Jul 2016
PythonSQLData modelingMachine learning

Before software

I came into engineering from finance and data analysis: five years of budgeting, forecasting and pricing work at Time Warner Cable and Grant Thornton, a CPA license, an M.S. in Accounting, and five years teaching graduate and undergraduate accounting courses as adjunct faculty at Indiana Wesleyan University.

My experience in various fields and domains has proven to be a practical advantage as I can more easily connect the product and design goals to the needs of the customer and end user. Hard problems are often operational and data-shaped rather than purely technical. I'm most useful where the right answer isn't obvious yet and someone has to weigh tradeoffs across the whole system before committing.