Minimal client-side JS framework