The tour

  • no private APIs
    • great for dog-fooding public API
    • not perfect for the UI’s needs, but good enough
  • skip discussion of Compojure, Ring, etc
  • circleci is open source


  • controllers swap into app state, that renders into the view

The atom

  • the good
    • debuggable
    • simple
    • easy
  • the bad
    • anti-modular - all views must agree on the shape of the data
    • complex - couples API requests to the views
    • hard - discipline required to manage the schema of the atom at scale
  • the ugly
    • fetch vs render performance conflict
    • denormalization is the norm
    • tastes like a shared filesystem


  • page centric
  • centralized
    • blessing - global logging, easily audited
    • curse - no component isolation
  • not-deterministic
    • take network non-determinism with core.async
    • inadvertently introduce UI non-determinism


  • 180 Om components
  • pure components
  • assume controllers pre-fetch all data
  • minimize component-local state - don’t be afraid to use local state
  • limit callbacks to message enqueues
  • encapsulate violations of the above


  • a pain point
  • syntax really matters
  • hiccup works well for them
  • but: react breaks “data”, e.g. print/read
  • want to normalize primitives vs components vs functions

Asset builds

  • ClojureScript builds
  • wanted: asset pipeline - ClojureScript friendly build on-demand tooling needed