Client-side only implementation