I have been playing with the word-finding side of Kindoggle. Shaking up a board is easy enough, but it is nice to find out which words we missed when the time is up. There is a solitaire page too.
The PHP solver reads a dictionary into two lookup tables: complete words and all their prefixes. Starting at each square, it follows neighboring letters recursively, including diagonals, and marks squares as used so the same square cannot be visited twice in one word. If the current letters are not the beginning of any dictionary word, that branch stops immediately.
That prefix check is the useful part. Without it, the search wastes time wandering through combinations that can never turn into a word. Found words go into a set so different paths to the same spelling do not produce duplicate answers. The board still runs in JavaScript; this version links it to the PHP answer and solitaire pages.