Skip to content

πŸͺ„ Audoly is a music intelligence platform designed to assist artists and producers in getting their music discovered, playlisted, and charted. The primary tool currently is a Spotify playlist search engine that allows users to search for playlists based on specific criteria and retrieve relevant playlist information.

Notifications You must be signed in to change notification settings

Ryguy-1/audoly-writeup

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

3 Commits
Β 
Β 

Repository files navigation

Check Out the Audoly Public Web App

Note: The code really has to be private, but I wanted to share how
I structured the project and why I made certain decisions! I can
always show you the code personally if you're interested 😊

🎡 Audoly: Playlisting and Music Intelligence Platform

Audoly is a music intelligence platform designed to assist artists and producers in getting their music discovered, playlisted, and charted. The primary tool currently is a Spotify playlist search engine that allows users to search for playlists based on specific criteria and retrieve relevant playlist information, including the playlist creator's contact details.

πŸ› οΈ Key Features

Audoly includes the following core features:

Feature Description
Spotify Playlist Search Users can search for playlists on Spotify based on specific criteria and retrieve relevant playlist information, including the playlist creator's contact details.
User Authentication Secure user authentication using NextAuth, integrating Google and Spotify accounts.
Subscription Management Stripe integration allows users to upgrade to premium subscriptions for enhanced features and unlimited credits.
User Profile Users can manage their profile information, subscription details, and track their usage statistics.

🧩 Technical Implementation

Audoly is built using the following technologies:

  • Next.js: Utilized for server-side rendering and efficient route management, enhancing performance and search engine optimization. The file-based routing system facilitated straightforward route creation and management.

  • TypeScript: Employed across the codebase to improve code quality and maintainability through static typing. Interfaces and types were used to ensure clear documentation and robust code.

  • Tailwind CSS: Applied for rapid UI development with its utility-first approach, enabling consistent styling and promoting component reusability while maintaining a minimal CSS bundle size.

  • DynamoDB: Chosen for its scalability and performance to store user data and authentication information, supporting flexible data modeling and seamless application integration.

  • Stripe: Integrated for subscription management and payment processing, leveraging its APIs for secure payment handling and efficient billing processes.

  • Spotify Web API: Used to fetch detailed playlist data, enabling users to access comprehensive music-related information directly from Spotify.

  • Vercel: Deployed on Vercel for streamlined deployment and automatic scaling, ensuring high availability and performance through its serverless functions.

🌐 Deployment and Monitoring

To maintain optimal performance and gain insights into user behavior, Audoly employs:

  • Google Analytics: Implemented to track user interactions and page views, providing data to inform user behavior analysis and decision-making processes.
  • Microsoft Clarity: Utilized for session recording and heatmap analysis to identify areas for UI improvements, enhancing user interaction understanding and guiding interface optimizations.

Project Structure

The project is organized to promote maintainability and scalability:

  • The app directory contains the main application components and pages.
  • The components directory houses reusable UI components.
  • The lib directory includes utility functions and helper modules.
  • The public directory stores static assets.
  • The cdk directory contains the AWS Cloud Development Kit (CDK) infrastructure code for DynamoDB table creation.

🌟 Conclusion

Audoly is a robust platform developed using Next.js, TypeScript, and various third-party services to support musicians in their careers. Its scalable architecture and thoughtful design ensure it meets the needs of a growing user base while providing valuable insights through data analytics.

For any further information or inquiries about Audoly, please reach out to the team. 🎧🎡

πŸ“ Full Project Structure

πŸ“‚ audoly/
β”œβ”€β”€ πŸ“‚ @types/
β”‚   └── πŸ“„ next-auth.d.ts
β”œβ”€β”€ πŸ“‚ app/
β”‚   β”œβ”€β”€ πŸ“‚ api/
β”‚   β”‚   β”œβ”€β”€ πŸ“‚ auth/
β”‚   β”‚   β”‚   └── πŸ“‚ [...nextauth]/
β”‚   β”‚   β”‚       β”œβ”€β”€ πŸ“„ authoptions.ts
β”‚   β”‚   β”‚       └── πŸ“„ route.ts
β”‚   β”‚   β”œβ”€β”€ πŸ“„ dynamodb.tsx
β”‚   β”‚   β”œβ”€β”€ πŸ“‚ spotify/
β”‚   β”‚   β”‚   β”œβ”€β”€ πŸ“‚ search/
β”‚   β”‚   β”‚   β”‚   └── πŸ“„ route.ts
β”‚   β”‚   β”‚   └── πŸ“„ spotify.tsx
β”‚   β”‚   β”œβ”€β”€ πŸ“‚ stripe/
β”‚   β”‚   β”‚   β”œβ”€β”€ πŸ“‚ createcheckoutsession/
β”‚   β”‚   β”‚   β”‚   └── πŸ“„ route.ts
β”‚   β”‚   β”‚   β”œβ”€β”€ πŸ“‚ getbillingportal/
β”‚   β”‚   β”‚   β”‚   └── πŸ“„ route.ts
β”‚   β”‚   β”‚   β”œβ”€β”€ πŸ“‚ subscriptionWebhook/
β”‚   β”‚   β”‚   β”‚   └── πŸ“„ route.ts
β”‚   β”‚   β”‚   └── πŸ“„ types.ts
β”‚   β”‚   └── πŸ“‚ user/
β”‚   β”‚       β”œβ”€β”€ πŸ“„ route.ts
β”‚   β”‚       └── πŸ“‚ updatename/
β”‚   β”‚           └── πŸ“„ route.ts
β”‚   β”œβ”€β”€ πŸ“‚ contact/
β”‚   β”‚   β”œβ”€β”€ πŸ“„ layout.tsx
β”‚   β”‚   └── πŸ“„ page.tsx
β”‚   β”œβ”€β”€ πŸ“‚ dashboard/
β”‚   β”‚   β”œβ”€β”€ πŸ“„ layout.tsx
β”‚   β”‚   β”œβ”€β”€ πŸ“„ page.tsx
β”‚   β”‚   └── πŸ“‚ spotifyplaylistsearch/
β”‚   β”‚       β”œβ”€β”€ πŸ“„ layout.tsx
β”‚   β”‚       β”œβ”€β”€ πŸ“„ page.tsx
β”‚   β”‚       └── πŸ“‚ [query]/
β”‚   β”‚           └── πŸ“‚ [market]/
β”‚   β”‚               └── πŸ“‚ [magicsearch]/
β”‚   β”‚                   └── πŸ“‚ [offset]/
β”‚   β”‚                       β”œβ”€β”€ πŸ“„ loading.tsx
β”‚   β”‚                       └── πŸ“„ page.tsx
β”‚   β”œβ”€β”€ πŸ“‚ (homepage)/
β”‚   β”‚   β”œβ”€β”€ πŸ“„ layout.tsx
β”‚   β”‚   └── πŸ“„ page.tsx
β”‚   β”œβ”€β”€ πŸ“„ layout.tsx
β”‚   β”œβ”€β”€ πŸ“‚ login/
β”‚   β”‚   β”œβ”€β”€ πŸ“„ layout.tsx
β”‚   β”‚   └── πŸ“„ page.tsx
β”‚   β”œβ”€β”€ πŸ“‚ privacypolicy/
β”‚   β”‚   β”œβ”€β”€ πŸ“„ layout.tsx
β”‚   β”‚   └── πŸ“„ page.tsx
β”‚   β”œβ”€β”€ πŸ“‚ profile/
β”‚   β”‚   β”œβ”€β”€ πŸ“‚ billing/
β”‚   β”‚   β”‚   β”œβ”€β”€ πŸ“„ loading.tsx
β”‚   β”‚   β”‚   └── πŸ“„ page.tsx
β”‚   β”‚   β”œβ”€β”€ πŸ“„ layout.tsx
β”‚   β”‚   └── πŸ“‚ myinformation/
β”‚   β”‚       └── πŸ“„ page.tsx
β”‚   β”œβ”€β”€ πŸ“‚ success/
β”‚   β”‚   β”œβ”€β”€ πŸ“„ layout.tsx
β”‚   β”‚   └── πŸ“„ page.tsx
β”‚   └── πŸ“‚ termsofservice/
β”‚       β”œβ”€β”€ πŸ“„ layout.tsx
β”‚       └── πŸ“„ page.tsx
β”œβ”€β”€ πŸ“‚ cdk/
β”‚   β”œβ”€β”€ πŸ“‚ bin/
β”‚   β”‚   └── πŸ“„ cdk.ts
β”‚   β”œβ”€β”€ πŸ“„ cdk.json
β”‚   β”œβ”€β”€ πŸ“‚ cdk.out/
β”‚   β”‚   β”œβ”€β”€ πŸ“„ cdk.out
β”‚   β”‚   β”œβ”€β”€ πŸ“„ DynamoDBStack.assets.json
β”‚   β”‚   β”œβ”€β”€ πŸ“„ DynamoDBStack.template.json
β”‚   β”‚   β”œβ”€β”€ πŸ“„ manifest.json
β”‚   β”‚   └── πŸ“„ tree.json
β”‚   β”œβ”€β”€ πŸ“„ jest.config.js
β”‚   β”œβ”€β”€ πŸ“‚ lib/
β”‚   β”‚   └── πŸ“„ dynamodb-stack.ts
β”‚   β”œβ”€β”€ πŸ“„ package.json
β”‚   β”œβ”€β”€ πŸ“„ README.md
β”‚   β”œβ”€β”€ πŸ“‚ test/
β”‚   β”‚   └── πŸ“„ cdk.test.ts
β”‚   β”œβ”€β”€ πŸ“„ tsconfig.json
β”‚   └── πŸ“„ yarn.lock
β”œβ”€β”€ πŸ“‚ components/
β”‚   β”œβ”€β”€ πŸ“‚ custom/
β”‚   β”‚   β”œβ”€β”€ πŸ“‚ buttons/
β”‚   β”‚   β”‚   β”œβ”€β”€ πŸ“„ dynamic-redirect-button.tsx
β”‚   β”‚   β”‚   └── πŸ“„ static-redirect-button.tsx
β”‚   β”‚   β”œβ”€β”€ πŸ“‚ cards/
β”‚   β”‚   β”‚   └── πŸ“„ upgrade-card.tsx
β”‚   β”‚   β”œβ”€β”€ πŸ“„ center-column.tsx
β”‚   β”‚   β”œβ”€β”€ πŸ“„ login-signup.tsx
β”‚   β”‚   β”œβ”€β”€ πŸ“‚ pages/
β”‚   β”‚   β”‚   β”œβ”€β”€ πŸ“‚ dashboard/
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ πŸ“„ credit-counter.tsx
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ πŸ“„ dashboard-redirect.tsx
β”‚   β”‚   β”‚   β”‚   └── πŸ“‚ spotifyplaylistsearch/
β”‚   β”‚   β”‚   β”‚       β”œβ”€β”€ πŸ“„ pagination-controls.tsx
β”‚   β”‚   β”‚   β”‚       β”œβ”€β”€ πŸ“„ playlist-table.tsx
β”‚   β”‚   β”‚   β”‚       β”œβ”€β”€ πŸ“„ search-form.tsx
β”‚   β”‚   β”‚   β”‚       └── πŸ“„ search-helpers.ts
β”‚   β”‚   β”‚   β”œβ”€β”€ πŸ“‚ login/
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ πŸ“„ login-buttons.tsx
β”‚   β”‚   β”‚   β”‚   └── πŸ“„ login-redirect.tsx
β”‚   β”‚   β”‚   β”œβ”€β”€ πŸ“‚ profile/
β”‚   β”‚   β”‚   β”‚   └── πŸ“„ profile-sidebar.tsx
β”‚   β”‚   β”‚   └── πŸ“‚ tl_layout/
β”‚   β”‚   β”‚       β”œβ”€β”€ πŸ“„ footer.tsx
β”‚   β”‚   β”‚       β”œβ”€β”€ πŸ“„ mode-toggle.tsx
β”‚   β”‚   β”‚       β”œβ”€β”€ πŸ“„ nav-bar.tsx
β”‚   β”‚   β”‚       β”œβ”€β”€ πŸ“„ next-auth-provider.tsx
β”‚   β”‚   β”‚       β”œβ”€β”€ πŸ“„ side-navigation.tsx
β”‚   β”‚   β”‚       β”œβ”€β”€ πŸ“„ theme-provider.tsx
β”‚   β”‚   β”‚       └── πŸ“„ top-navigation.tsx
β”‚   β”‚   └── πŸ“„ scroll-to.tsx
β”‚   └── πŸ“‚ ui/
β”‚       β”œβ”€β”€ πŸ“„ accordion.tsx
β”‚       β”œβ”€β”€ πŸ“„ alert-dialog.tsx
β”‚       β”œβ”€β”€ πŸ“„ badge.tsx
β”‚       β”œβ”€β”€ πŸ“„ button.tsx
β”‚       β”œβ”€β”€ πŸ“„ card.tsx
β”‚       β”œβ”€β”€ πŸ“„ command.tsx
β”‚       β”œβ”€β”€ πŸ“„ dialog.tsx
β”‚       β”œβ”€β”€ πŸ“„ dropdown-menu.tsx
β”‚       β”œβ”€β”€ πŸ“„ input.tsx
β”‚       β”œβ”€β”€ πŸ“„ label.tsx
β”‚       β”œβ”€β”€ πŸ“„ navigation-menu.tsx
β”‚       β”œβ”€β”€ πŸ“„ pagination.tsx
β”‚       β”œβ”€β”€ πŸ“„ popover.tsx
β”‚       β”œβ”€β”€ πŸ“„ scroll-area.tsx
β”‚       β”œβ”€β”€ πŸ“„ select.tsx
β”‚       β”œβ”€β”€ πŸ“„ separator.tsx
β”‚       β”œβ”€β”€ πŸ“„ sheet.tsx
β”‚       β”œβ”€β”€ πŸ“„ skeleton.tsx
β”‚       β”œβ”€β”€ πŸ“„ table.tsx
β”‚       β”œβ”€β”€ πŸ“„ textarea.tsx
β”‚       β”œβ”€β”€ πŸ“„ toast.tsx
β”‚       β”œβ”€β”€ πŸ“„ toaster.tsx
β”‚       └── πŸ“„ use-toast.ts
β”œβ”€β”€ πŸ“„ components.json
β”œβ”€β”€ πŸ“„ DISPLAY.md
β”œβ”€β”€ πŸ“‚ lib/
β”‚   └── πŸ“„ utils.ts
β”œβ”€β”€ πŸ“„ next.config.mjs
β”œβ”€β”€ πŸ“„ next-env.d.ts
β”œβ”€β”€ πŸ“„ package.json
β”œβ”€β”€ πŸ“„ postcss.config.mjs
β”œβ”€β”€ πŸ“‚ public/
β”‚   β”œβ”€β”€ πŸ“„ favicon.png
β”‚   β”œβ”€β”€ πŸ“„ googlefc25c951d7703d50.html
β”‚   β”œβ”€β”€ πŸ“‚ pngs/
β”‚   β”‚   β”œβ”€β”€ πŸ“„ auth-portrait.png
β”‚   β”‚   └── πŸ“„ spotify-album-cover.png
β”‚   β”œβ”€β”€ πŸ“‚ screenshots/
β”‚   β”‚   β”œβ”€β”€ πŸ“„ audoly-screenshot-0.png
β”‚   β”‚   β”œβ”€β”€ πŸ“„ audoly-screenshot-1.png
β”‚   β”‚   └── πŸ“„ audoly-screenshot-2.png
β”‚   └── πŸ“‚ svgs/
β”‚       β”œβ”€β”€ πŸ“„ google-logo.svg
β”‚       └── πŸ“„ spotify-logo.svg
β”œβ”€β”€ πŸ“„ README.md
β”œβ”€β”€ πŸ“‚ styles/
β”‚   └── πŸ“„ globals.css
β”œβ”€β”€ πŸ“„ tailwind.config.ts
β”œβ”€β”€ πŸ“„ tsconfig.json
└── πŸ“„ yarn.lock

About

πŸͺ„ Audoly is a music intelligence platform designed to assist artists and producers in getting their music discovered, playlisted, and charted. The primary tool currently is a Spotify playlist search engine that allows users to search for playlists based on specific criteria and retrieve relevant playlist information.

Topics

Resources

Stars

Watchers

Forks