Untypable LLC Owner (working on malli and Typed Clojure)
Location: Portland, Oregon
Email: my first name at my website
2026-05-18: I'm looking for full-time remote work.
May 2026: $9k grant to work on malli (Clojurists Together, Q2 2026)
January 2026: TDEPS-269: Add checksum verification to Linux Clojure CLI installers (commit)
December 2025: Variants of clojure.core/{doseq,for} whose expansions grow linearly, not exponentially
November 2025: [GenAI] Bootstrap Clojure (CLI) installation from source
October 2025: [GenAI] Tutorial, tests, and examples demonstrating clojure.java.process
October 2025: Update cheatsheet, refactor metronome in Overtone
October 2025: Robust :and parser, add :andn in Malli
August 2025: Address deprecated build dependencies in plumatic/schema
June 2025: Clojars activity (Automatic Dependabot security alerts, Use deps to infer more accurate linting, Inline :defaults alias to ensure CVE overrides, Use safe edn reader)
June 2025: Added to Clojars security reporters for identifying single-character misconfiguration exposing clojars to 14 CVE's
May 2025: Close #1194: add generator for empty? schema in Malli
May 2025: Fix parsing - and + before delim and UnexpectedCharacter leaks in fast-edn
January 2025: Created library to export OCSF schemas for use in Clojure
September 2024: Found bug in ClojureScript's LazySeq class
September 2024: Fix ClojureDart bugs 1, 2, 3
September 2024: Clojure 1.12 released including a contribution of mine
August 2024: Small models to study compilation and interpretation techniques of malli schemas
August 2024: $9k grant to work on malli (Clojurists Together, Q3 2024)
April 2024: A library to run Clojure Criterium benchmarks from other JVM languages
April 2024: $9k grant to work on compojure-api (Clojurists Together, Q2 2024)
March 2024: Malli: Document vector schemas, Enforce entry specs in open map destructurings, Fix (explain :tuple []), Choose non-null base for swagger, Fix :repeat infinite loops by bailing early, Use :orn instead of :altn for map destructuring.
Feb 2024: CLJ-2552: Fix example code and improve recur description in reify docstring
Dec 2023: I am now maintainer of compojure-api and ring-swagger (added auto-deploying builds 1, 2, 3)
Dec 2023: Fix memory leaks in ring-swagger
Dec 2023: Identified 3x build speedup and 6x performance improvement for some routes in production Clojure application (Eval routes and options given to context at initialization time)
Nov 2023: clojure.java-time activity (Fix not-before?, not-after?, Preserve transitivity when comparing instants to intervals)
Nov 2023: GitHub Actions-style matrix build for sourcehut builds using babashka (~ambrosebs/hut-matrix)
Nov 2023: Malli activity (Document :or vs :union vs :merge)
Aug 2023: clojure.java-time activity (Use *clock* in ZoneId coersions)
March 2023: reagui/imgui activity (fix bad call in reaimgui demo, typos 1 2 3)
March 2023: Fennel activity (fix scoping bug, support bit ops in Antifennel, flatten associative ops in Antifennel, report bad error message, propose macros shadow locals, cljlib helloworld)
Feb 2023: Fix RSS feed of clojuriststogether.org
Jan 2023: Kaocha: Gracefully handle circular dependencies in watch mode
Jan 2023: Clojure: Directly linked protocols (failed experiment)
Oct 2022: Clojure improvements around rest-arities: CLJ-2730 (theoretical restfn error msg with 21+ required arity), CLJ-2728 (Collections, symbols, fixed-arg fns called with 22+ args report bad arity exception), CLJ-2729 (improve defmulti memory usage with 21+ args), Clojure: proof-of-concept improve infinite-args handling for fn's, defmulti, vars, colls
Oct 2022: Schema: proof-of-concept s/defmulti
Sept 2022: Misc Clojure fixes: CLJ-2725 (fix bound-fn usage in Clojure tests), CLJ-2708 (fix SOE in pprint), CLJ-2705 (improve diff perf), CLJ-2714 (improve arglists for defrecord ctor), CLJ-2710 (improve arity error messages for vectors), CLJ-2699 (deprecate fns using java.lang.Thread/stop), CLJ-2693 (document sorted sets require comparable keys), CLJ-2322 (add juxt zero-arity, alternative impl)
Aug 2022: Malli: map recursive schemas to recursive generators
Aug 2022: schema: Sketch for polymorphic fn schemas
June 2022: Added as clojure.java-time maintainer
June 2022: Support schema in Babashka
March 2022: Promesa: Fix CI
April 2022: Fix malli bug caught by Typed Clojure
March 2022: Dependabot + Clojure tutorial (Leiningen, Clojure CLI, real usage in production app)
Feb 2022: Clojure 1.11 Contribution Merged (CLJ-1973: sort proxy methods for reproducibility)
Feb 2022: Q1 2022 Clojurists Together $1k Grant (Update 1, Update 2)
Dec 2021: Added as Plumatic Schema maintainer
Nov 2021: vim-fireplace: Refresh :Last on error
Nov 2021: schema: Proposed s/defprotocol wrapper
Nov 2021: schema: Fix s/fn performance issues in Clojure
Nov 2021: schema: Migrate from cljx to cljc
Oct 2021: spec: Reviewed code for keys* enhancement
Sept 2021: clojure: Proposed fix for satisfies? to support defprotocol + :extend-via-metadata
Sept 2021: clojure: Proposed fix for memory leak involving futures + dynamic binding
Sept 2021: clojure: Proposed fix for defprotocol extensions being lost
Sept 2021: clojure: Proposed fix for defprotocol dispatch non-determinism
Sept-Oct 2021: fully-satisfies---A library with many enhancements/fixes to core Clojure bugs
Sept 2021: Q3 2021 Clojurists Together $1k Grant (Update 1, Update 2)
July 2021: test.chuck: Fix CI, support `times` in CLJS
July 2021: plumbing: Fix Plumatic plumbing to handle large graphs
May 2021: conduit: A bunch of fixes to a re-frame tutorial
May 2021: cljfx: Example of Clojure desktop app with splash screen
April 2021: clojure.java-time: Support before?/after? mixing Instants and Intervals
March 2021: test.chuck: Support `testing` inside `checking`
Dec 2020: Leiningen bugfix: Fix `lein test` false-negative exit code (also fix same bug in eftest, circleci.test)
[Commercial] Oct 2020: Auto-balance CI for large Cisco Clojure production app (Aug 2022 update: runs 2h of tests in 15-20 minutes with 10 splits, each split 9-13 minutes)
[Commercial] July-Oct 2020: Move large Cisco production app to services architecture (planning PR, no downtime)
Dec 2020: Leiningen bugfix: Fix `lein test` loading order (also fix same bug in eftest, circleci.test)
July 2020: clj-http: Fix performance regression
March 2020: lein-monolith: Significantly improve dependency cycle error message
Feb 2020: kaocha: Cannot set dynamic variables in --watch mode
Feb 2020: Fork core.typed to typedclojure and discontinue core.typed
Jan 2020: schema-tools: Fix {required,optional}-keys regression
July 2019: cljfx: (2) Fix subtle bug in state management
July 2019: cljfx: (1) Fix subtle bug in state management
July 2019: cljfx: Support JavaFX Transitions (with tutorial + gif)
July 2019: cljfx: allow descriptions in some :selected-item lifecycles
July 2019: cljfx: Support declarative event filters
2017-2018: Change ClojureScript's AST to tools.analyzer format
December 2016: An Interactive Tutorial on Hash Array Mapped Tries
May 2015: reply: Fix bad *ns* rebinding
Aug 2014: Clojure 1.7 Contribution Merged (CLJ-1251: The clojure.core/update function)
March 2014: Contributed 4 tutorials to Clojure Cookbook (O'Reilly)
2014-2016: dynalint---A library to Lint your Clojure programs as they run. (basically custom error messages for clojure.core---subsumed by spec/malli)
2014: Sponsored development of tools.analyzer via Nicola Mometto ($5k)
April 2013: clojure-doc: Improve macros tutorial
Feb 2013: Move typed-clojure to core.typed
March 2013: clojure-doc: Contribute `Growing a DSL in Clojure` (originally published 2011 in PragProg)
Aug 2012: clojure: Proposed that assoc should throw on uneven args (the behavior since Clojure 1.5)
Nov 2011: Started typed-clojure (soon to become core.typed)
Nov 2011: fogus/trammel: Fix defconstrainedtype
2011-2013: jvm.tools.analyzer: A precursor to tools.analyzer (mentioned in `The Joy of Clojure`)
2011-2013: Logic Programming tutorial with core.logic
2011: Collaborated on designing core.match with David Nolen
July 2011: `Growing a DSL in Clojure` published in PragProg magazine
FennelConf 2025 Talk: Typed Clojure via Typed Fennel?
Interview for Clojure Apropos podcast, 14th January 2025
Madison Clojure Meetup, 6th March 2024. Leveling-Up Clojure Runtime Specs (Video + Abstract, PDF (with transitions), PDF (no transitions), Keynote)
Interview for Strange Loop's YouTube channel, 1st February 2021.
Compose::Melbourne Keynote, 2nd September 2019. The Hidden Data Flow in Types (Abstract, PDF, Keynote)
The REPL Podcast, August 12th 2019: Episode 28
BloomingtonJS June 27th 2019 talk: Prototypal Inheritance [PDF, Keynote, Notes]
PL Wonks February 8th 2019 talk: Local Type Inference with Symbolic Closures [PDF, Keynote]
Clojure Conj Unsession November 29th 2018 talk: Typed Clojure: Wishful Thinking [PDF, Keynote]
PL Wonks April 20th 2018 talk: A Typed-Macro Writer’s Toolkit [Video (TBA), Abstract (TBA), PDF, Keynote]
Clojure Conj 2017 talk: Tool-assisted spec Development [Video, Abstract, PDF, Keynote]
PL Wonks September 22nd 2017 talk: Space-Efficient Runtime Tracking [Video, Abstract, PDF, Keynote]
Gradual Typing Across the Spectrum 2017 talk: Squash the work! Inferring Useful Types and Contracts via Dynamic Analysis [PDF, Keynote]
Indiegogo Campaign 2016: Automatic Annotations for Typed Clojure + clojure.spec
Gradual Typing Across the Spectrum 2016 talk: Inferring Structural Types from Tests [PDF, Keynote]
OPLSS 2016 Student talk: Inferring Structural Types from Tests [Keynote]
Houston Clojure User Group Talk 2015: Communicating between typed/untyped namespaces [Code]
Boston Clojure User Group Talk 2015: Getting started with Typed Clojure + Building a typed contracts framework [Code]
Strange Loop 2015 Talk: Typed Clojure: From Optional to Gradual Typing [Slides, Keynote]
Indiegogo Campaign 2015: Gradual Typing for Clojure Campaign
CodeMesh 2014 Talk: Typed Clojure in Practice [Slides, Keynote]
Clojure Toronto User Group Talk 2014: Typed Clojure Demo
Strange Loop 2014 Talk: Typed Clojure in Practice [Slides, Keynote]
ILC 2014 Invited Talk: Typed Clojure [Keynote]
Philly ETE 2014: What if Type Checkers Were More Like Linters? [Slides, Keynote]
Lambda Jam Brisbane 2013 Workshop: core.typed Workshop , core.typed talk
Indiegogo Campaign 2013: Typed Clojure Campaign
Cognicast Episode 042, October 8th, 2013: Recording
Illegal Argument Podcast 2013: Recording
Melbourne Functional User Group Talk 2013: Meetup [Keynote]
clj-syd User Group Talk 2013: Meetup
Clojure Conj 2012: Typed Clojure
Clojure Conj 2011: Introduction to Logic Programming (Slides)
GSoC 2015 Administrator: Clojure
GSoC 2015 Mentor: Akhilesh Srikanth (Typed Transients for Clojure)
GSoC 2015 Mentor: Aravind K N (Typed Clojure Core Annotations)
GSoC 2014 Administrator: Clojure
GSoC 2014 Mentor: Nicola Mometto (tools.analyzer extensions: cljs port, documentation)
GSoC 2014 Mentor: Minori Yamashita (Typed ClojureScript Library Annotations)
GSoC 2014 Mentor: Di Xu (Typed Clojure: Heterogeneous operations & Dotted Polymorphism)
GSoC 2013 Student: core.typed: Extensions and Documentation
GSoC 2012 Student: Typed Clojure (Optional Static Type System)
Ph.D. Dissertation: Typed Clojure in Theory and Practice (ProQuest, IUScholarWorks)
Thesis Defense: (talk PDF, talk PDF w/ presenter notes w/o animation, Keynote, Video (practice))
Unpublished manuscript: Squash the work: A Workflow for Typing Untyped Programs that use Ad-Hoc Data Structures (draft, Experiments), with Sam Tobin-Hochstadt
Thesis Proposal: (Proposal PDF, talk PDF, Keynote)
Qualifying exam: (answers, talk PDF, talk PDF w/ notes, Keynote, blog transcription)
Exploration of Hash Array Mapped Tries (unpublished tutorial)
ESOP 2016: Practical Optional Types for Clojure (with appendix), with Sam Tobin-Hochstadt and Rowan Davies. (code, talk PDF, Keynote, arXiv)
Honours Dissertation: A Practical Optional Type System for Clojure , supervised by Rowan Davies. (slides)
Advisor to Clojure core team on supply chain security and CLI design, 2025-
Madison Clojure Organizer 2024-2026
European Lisp Symposium 2024 Program Committee
European Lisp Symposium 2023 Program Committee
Trends in Function Programming 2023 Program Committee