Classical for Everyone is a music blog meant to make classical accessible for everyone. It seeks to use approachable writing, good design, and interactive tools to make listening fun and enlightening.
- A grid view displays articles in order of recency
- Title, description, image, color-coded category, and tags
- Pagination
- Fully-featured markdown display, including images and HTML5 audio
- Dynamic table of contents
- Social media share buttons for Twitter, Facebook, and Reddit
- Interactive music videos with timestamps and sectioned descriptions
- Dropdown of video choices, which updates listening guide timestamps
- Automatic expansion of sections (for example, when a new movement begins)
- Admin authorization with Google OAuth2
- Admin dashboard with tables and logout button
- Articles table shows published articles and unpublished drafts
- Drafts table shows all drafts, published or otherwise
- Archives automatically save old versions of articles, and can be used to manually "unpublish" old articles
- Trash table backs up clutter, and allows old articles and drafts to be restored
- Draft editor with tabs for metadata, content, and listening guides
- Metadata tab shows a dynamic preview of the landing page card for the article
- Image uploading tied into Google Cloud Storage, with a dialog to set alt text
- Content editor is a split-screen between a text editor and a WYSIWYG markdown display, including table of contents and share buttons
- Listening guide editor shows a table where videos can be added, configured, grouped, and ordered
- Listening guide editor has a table of descriptions, allowing the editor to set timestamps for each video
- The listening guide editor has a split screen, the right side dynamically rendering the actual listening guide
- In the root directory, run
npm install
- Run the development server with
npm run dev
- Manually build the production files with
npm build
, or deploy with Google Cloud Build
- In the
/api
directory, runnpm install
- If you are missing environment variables, consult the
node-pg
and Google OAuth2 documentation - Configure a PostgreSQL server, and configure your
NODE_ENV
andPGHOST
environment variables to configure your servers - Run the server with
npm start
, or run the tests withnpm test