While TomTsagk covered most of the basics in his answer, there are a few other points to think about;
You can use procedural generation to generate challenges. This may have the result in repetitive or boring challenges, however, if implemented badly, or even problems with difficulty (too easy, impossible, ect). Whereas creating by hand will ensure this won't be a problem.
If you want everyone to have the same challenge but would rather not have a server, you can use something like the following to decide which challenge to pick:
var rand = new System.Random((int)(DateTime.UtcNow.Date.Ticks >> 10));
(Note; not tested this code. May throw a conversion error. The basic idea is to create a local random using todays date in UTC, then use it to choose which challenge to run).
Do you want challenge highscores shared? Then use a server.
A server does not necessarily need be implemented in Unity. In fact, if it does nothing more than serve challenges made by yourself and highscores, Unity is overkill. A restserver can serve just fine. One thing to watch out for is the potential for cheating on the highscores, since you are relying on the client to accurately report them.