I vote for #3.
I implemented #3 when I released ec-lite demo for ACS4. as three separate packages (data model, UI, and demo data). You can install the data model as a service, and mount only the UI in your site map. You can take the UI, customize (ie. "fix") it, and mount your own version instead. Then you can install the demo data package and populate your tables. At the time, people thought it was weird that I did that.
However, I assumed that most people would be intereseted in changing the look but not want do deal with the engine underneath. By separating it into two separate packages, it's a clean break, and you only need to be concerned with changes in the API and data model. On the other hand, it requires a little more discipline on the part of the developer because now you are essentially writing a service and a stock UI (which may get replaced altogether) rather than a monolithic "application".