Schedulers, which map work to execution resources, can significantly impact application performance, including latency and throughput. Although application-specific scheduling policies can improve performance, most computer systems leverage generic scheduling policies, which are very challenging for application developers to hack or customize. To address this problem, Kaffes presents Syrup, an almost-declarative framework for user-defined scheduling that enables developers to easily and safely define and deploy custom scheduling policies across the kernel networking stack, kernel scheduler, and programmable network devices. With Syrup, developers implement functions that match inputs (threads, network packets, or connections) with executors (cores, network sockets, NIC queues), thereby specifying scheduling functions without managing low-level system details.