Best Practices - PuzzleServer/mainpuzzleserver GitHub Wiki
Overall Project Structure
Anything that can be shared should be shared.
ServerCore is all shared logic (i.e. Shared landing page for all events, author & owner dashboards, heat map, etc)
Puzzleday is logic and UI specific to Puzzleday (i.e. food, themed landing page, custom metas, etc)
Puzzlehunt is logic and UI specific to Puzzlehunt (i.e. module logic handling, custom metas, etc)
If you want to add something to a class but it's not going to apply across all events consider whether it makes more sense to include it in the DataModel (and thus database table, where it must be nullable) or if it makes more sense to give it its own DataModel class and then create a child class that extends the existing object to include an instance of the new class.
Remember that some tables are shared between events (e.g. User) and some are not (e.g. Puzzles).
Code Guidelines
Use xml comments on public objects (they allow for mouse-over Intellisense details)
When you write a function, write a unit test to go with it
Keep in mind that this project will have a lot of people working on it. Everything needs to be clearly commented and documented, including changes to setup and deployment.