tapped = false, 1500); navigator.clipboard?.writeText(location.href.split('#')[0] + '#syncing-with-discourse')" >Syncing with Discourse
Open Up Music care a lot about accessibility, and it was important to them that the experience be consistent between the Laravel web app and their Discourse community forum.
Discourse supports SSO out of the box, and there's a reasonably well maintained Laravel library for integrating it, so syncing users and sessions wasn't a huge problem. Members sign in once and land in Discourse already signed in, with their details kept in sync, and only orchestra members get in. However, Open Up had quite a complicated design in mind, one they wanted to share between the systems.
Despite this being a server-side rendered project rather than a single page app, I decided it made good sense to scrap the built-in Discourse navigation, and build our own in Vue.js, driven by APIs and props. Both Discourse and Laravel could render it, and the systems needn't even talk to each other about it: the Vue.js components query the data they need from the Discourse and Laravel APIs, if they weren't already given it through props on page load. A command writes the web server rules that inject it into Discourse. It seems like a crazy idea, and it works really well.
tapped = false, 1500); navigator.clipboard?.writeText(location.href.split('#')[0] + '#integration-with-wordpress')" >Integration with WordPress
Open Up Music wanted Open Orchestras to feel like an integrated experience, so it made sense for the My Orchestra portal to sit alongside their existing WordPress site.
I did this by serving as much of the Laravel app as possible under a /my prefix, and routing those URLs to it in NGINX.
tapped = false, 1500); navigator.clipboard?.writeText(location.href.split('#')[0] + '#a-resource-library-made-of-blocks')" >A resource library made of blocks
Teaching resources are pages built from blocks (text, images, video, audio, case studies, quotes and grids), with drafts, previews and per-block visibility, so staff publish without me.
tapped = false, 1500); navigator.clipboard?.writeText(location.href.split('#')[0] + '#measuring-what-matters')" >Measuring what matters
Educators track each young musician's progress through milestone surveys, from a baseline onwards, and Open Up Music turn them into evaluation reports for each orchestra. The surveys are built in Formstack, and come back through a signed webhook that marks each one complete. Participants' names are kept out of the admin and out of the survey links.
tapped = false, 1500); navigator.clipboard?.writeText(location.href.split('#')[0] + '#admin-and-reporting')" >Admin and reporting
In the Nova admin, staff invite whole orchestras at once, impersonate members to help them, export anything to Excel, and see evaluation and community stats at a glance.
tapped = false, 1500); navigator.clipboard?.writeText(location.href.split('#')[0] + '#accessible-from-the-start-and-kept-current')" >Accessible from the start, and kept current
Skip links, screen reader fixes and keyboard support were there from day one. Since then I've kept it on every Laravel release from 5 to 11, and on PHP 8.4, with CI.
