- Import parse_drgb, parse_drgbw, parse_dnrgb, FrameAssembler
- Wire DRGB/DRGBW/DNRGB parsing in udp_listener_task
- Add frame_is_rgbw flag to route to write_rgb or write_rgbw
- Add 2s frame timeout in render_task — reverts to last animation
- Initialize FrameAssembler with led_count in main()
- Add import for create_animation from animations module
- Add current_anim_instance global for animation object
- Create animation instance in udp_listener_task on anim_cmd receipt
- Implement render loop in render_task using ticks_diff for timing
- Add FrameAssembler class for multi-packet DNRGB reassembly
- 200ms timeout discards stale partial frames
- feed() returns complete frame list when all expected pixels received
- reset() clears buffer manually
- Port all 7 animations from lightsync/animations/*.py to MicroPython
- Inline _hsv_to_rgb (no colorsys in MicroPython)
- Use bytearray for FireAnimation heat buffer (avoids GC pressure)
- create_animation() factory maps parsed command dicts to instances
- No lightsync imports, no abc, no type hints