The levels are generated. For the 5x5 grid, I had written a brute force algorithm for finding a hamiltonian path (a path that visits each square once). Once I got to 7x7 the performance was no longer acceptable, so I found an algorithm called the biteback algorithm where you start with a completed path and then jumble it up. With that algorithm I could get some pretty large grids, but kept the game capped at 7x7. :)
Thanks for the kind words! I'm glad you enjoyed the game. 😄
A-ha, I knew it!
(Just kiddin', I had no idea :P)
The fact that every path passes through all the squares seemed something generative, but the levels were tricky enough to feel human-thought, so I was confused! But now it's clear, and I find your idea of computing a Hamiltonian path extremely intriguing - even if it may cause some computational difficulties, that however you overcome beautifully!
Thanks a lot for your answer, I loved to read this backstory! If it were for me, I'd present the game as "procedurally generated" in the first line: it's a fantastic plus! :D