In development

GranaryFS

I’m building a distributed filesystem in Rust for publishing software at scale. Machines mount one global namespace; content-addressed storage reuses existing data, and atomic publication exposes a complete software tree rather than a partial update. The filesystem is under active development and has not been released.

My role: Creator and developer

Development source is not public.

  • Rust
  • Distributed filesystems
  • Content addressing

In development

OpenAFS on Windows

I’m modernizing the existing OpenAFS Windows client with a native UI written in C# and XAML using WinUI 3. It brings cells, Kerberos, sign-in, mounts, service state, and diagnostics into one application. Separately, I’m developing a Windows Cloud Files integration that explores on-demand content through user processes, alongside compatibility work toward the existing client’s capabilities.

My role: Windows client modernization and integration work

Development source is not public.

  • OpenAFS
  • Windows UI
  • Cloud Files

Public open source

Keycloak Account Events

I built a self-service login-history endpoint so applications can show people their own authentication events without an administrative token. Requests use the caller’s account token, and the event-store query is restricted to that user, with filtering and bounded pagination.

My role: Extension author

  • Java
  • Keycloak SPI
  • Login history
View Keycloak Account Events on GitHub

Public open source

Keycloak Account Credentials

I built a credential inventory that reads the user’s stored credentials even when a custom authentication flow omits them from Keycloak’s built-in account view. It returns metadata, never secrets, and supports removal within the caller’s own account, with recent authentication and configured step-up checks.

My role: Extension author

  • Java
  • Keycloak SPI
  • Passkeys
View Keycloak Account Credentials on GitHub

Public open source

Keycloak Event Enrichment

I built write-time event enrichment so each application does not have to repeat GeoIP lookups and User-Agent parsing. The extension adds approximate location, browser, operating-system, and device details before Keycloak persists an authentication event. Missing enrichment data does not prevent the original event from being stored.

My role: Extension author

  • Java
  • Keycloak SPI
  • Authentication events
View Keycloak Event Enrichment on GitHub

Cookie preferences

Choose whether to share visit statistics with Google Analytics. I use them to understand this site’s traffic, not to serve ads.

Analytics cookies

Page visits, scrolling, public link clicks, and downloads. Check your current setting below.

Global Privacy Control keeps analytics off when enabled.

Turning analytics off stops future collection and removes this site’s analytics cookies. It does not delete information already sent to Google.

What stays in this browser?

Your theme, motion preference, and cookie choice. These settings work with analytics off. An allow choice lasts up to six months; an opt-out stays until you change it or clear browser storage.

When enabled, this integration sets Google Analytics cookies (_ga and _ga_<ID>) to expire after 30 days.

Read the privacy & cookie policy