Skip to content

OlufunbiIK/tip-tune

Repository files navigation

TipTune

Real-time music tips powered by Stellar

TipTune is a revolutionary platform that connects music lovers directly with artists through instant, frictionless micro-tipping. Stream your favorite tracks and show appreciation with lightning-fast Stellar payments.

Color Palette

  • Navy (Background): #0B1C2D
  • Blue (Primary): #4DA3FF
  • Ice Blue (Secondary): #6EDCFF
  • Mint (Highlight): #9BF0E1
  • Gold (Tip Accent): #FFD166

Stellar License: MIT PRs Welcome


Features

  • Stream Music - Listen to tracks from independent artists
  • Instant Tips - Send XLM or USDC tips with one tap
  • Live Notifications - Artists see tips in real-time during performances
  • Micro-transactions - Tips as low as $0.10 thanks to Stellar's low fees
  • Global Reach - Borderless payments to artists anywhere
  • Artist Dashboard - Track earnings, top supporters, and engagement
  • Artist Profiles - Showcase music, bio, and tip history
  • Secure Wallet Integration - Connect with Freighter, Albedo, or other Stellar wallets

Why TipTune?

Traditional music streaming pays artists fractions of a cent per stream. TipTune flips the model:

  • Direct support: 100% of tips go directly to artists (minus minimal network fees)
  • Instant settlement: Artists receive funds in seconds, not months
  • Fan connection: Build stronger relationships through direct appreciation
  • Transparent: All transactions visible on the Stellar blockchain

Tech Stack

  • Frontend: React, TypeScript, TailwindCSS
  • Blockchain: Stellar Network
  • Smart Contracts: Soroban (Stellar's smart contract platform)
  • Wallet Integration: Freighter, Albedo, xBull
  • Backend: Node.js, Express
  • Database: PostgreSQL
  • Audio Streaming: Web Audio API / HowlerJS
  • Real-time: WebSockets for live notifications

Installation

Prerequisites

  • Node.js 18+ and npm/yarn
  • PostgreSQL database
  • Stellar wallet (Freighter recommended for development)

Setup

# Clone the repository
git clone https://github.com/OlufunbiIK/tip-tune/
cd tiptune

# Install dependencies
npm install

# Copy environment variables
cp .env.example .env

# Configure your .env file with:
# - Stellar network settings (testnet/mainnet)
# - Database credentials
# - API keys

# Run database migrations
npm run migrate

# Start development server
npm run dev

Visit http://localhost:3000 to see TipTune in action!


Quick Start

For Listeners

  1. Connect Wallet - Click "Connect Wallet" and approve connection
  2. Browse Artists - Explore the artist directory
  3. Listen & Tip - Play a track and tap the tip button
  4. Select Amount - Choose or enter custom tip amount
  5. Send - Confirm transaction in your wallet

For Artists

  1. Sign Up - Create artist profile with Stellar wallet
  2. Upload Music - Add tracks with metadata and artwork
  3. Share Profile - Share your TipTune link with fans
  4. Receive Tips - Get notified instantly when fans tip
  5. Track Analytics - View earnings and engagement stats

Project Structure

# TipTune Project Structure

tiptune/
β”œβ”€β”€ frontend/                           # React + TypeScript + Vite
β”‚   β”œβ”€β”€ public/
β”‚   β”‚   β”œβ”€β”€ favicon.ico
β”‚   β”‚   β”œβ”€β”€ logo.svg
β”‚   β”‚   └── assets/
β”‚   β”œβ”€β”€ src/
β”‚   β”‚   β”œβ”€β”€ components/                 # Reusable React components
β”‚   β”‚   β”‚   β”œβ”€β”€ common/
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ Button.tsx
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ Card.tsx
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ Modal.tsx
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ Toast.tsx
β”‚   β”‚   β”‚   β”‚   └── LoadingSkeleton.tsx
β”‚   β”‚   β”‚   β”œβ”€β”€ layout/
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ Header.tsx
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ Footer.tsx
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ Sidebar.tsx
β”‚   β”‚   β”‚   β”‚   └── Layout.tsx
β”‚   β”‚   β”‚   β”œβ”€β”€ player/
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ MusicPlayer.tsx
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ PlayButton.tsx
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ VolumeControl.tsx
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ ProgressBar.tsx
β”‚   β”‚   β”‚   β”‚   └── TrackInfo.tsx
β”‚   β”‚   β”‚   β”œβ”€β”€ artist/
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ ArtistCard.tsx
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ ArtistProfile.tsx
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ ArtistHeader.tsx
β”‚   β”‚   β”‚   β”‚   └── ArtistSearch.tsx
β”‚   β”‚   β”‚   β”œβ”€β”€ tip/
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ TipButton.tsx
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ TipModal.tsx
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ TipHistory.tsx
β”‚   β”‚   β”‚   β”‚   └── TipPresets.tsx
β”‚   β”‚   β”‚   β”œβ”€β”€ wallet/
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ WalletConnect.tsx
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ WalletInfo.tsx
β”‚   β”‚   β”‚   β”‚   └── WalletBalance.tsx
β”‚   β”‚   β”‚   └── notifications/
β”‚   β”‚   β”‚       β”œβ”€β”€ NotificationCenter.tsx
β”‚   β”‚   β”‚       β”œβ”€β”€ NotificationItem.tsx
β”‚   β”‚   β”‚       └── NotificationBell.tsx
β”‚   β”‚   β”œβ”€β”€ pages/                      # Page components (routes)
β”‚   β”‚   β”‚   β”œβ”€β”€ HomePage.tsx
β”‚   β”‚   β”‚   β”œβ”€β”€ ArtistPage.tsx
β”‚   β”‚   β”‚   β”œβ”€β”€ DashboardPage.tsx
β”‚   β”‚   β”‚   β”œβ”€β”€ TipHistoryPage.tsx
β”‚   β”‚   β”‚   β”œβ”€β”€ ExplorePage.tsx
β”‚   β”‚   β”‚   └── NotFoundPage.tsx
β”‚   β”‚   β”œβ”€β”€ hooks/                      # Custom React hooks
β”‚   β”‚   β”‚   β”œβ”€β”€ useWallet.ts
β”‚   β”‚   β”‚   β”œβ”€β”€ useAudio.ts
β”‚   β”‚   β”‚   β”œβ”€β”€ useTip.ts
β”‚   β”‚   β”‚   β”œβ”€β”€ useNotifications.ts
β”‚   β”‚   β”‚   β”œβ”€β”€ useWebSocket.ts
β”‚   β”‚   β”‚   └── useApi.ts
β”‚   β”‚   β”œβ”€β”€ contexts/                   # React Context providers
β”‚   β”‚   β”‚   β”œβ”€β”€ WalletContext.tsx
β”‚   β”‚   β”‚   β”œβ”€β”€ PlayerContext.tsx
β”‚   β”‚   β”‚   β”œβ”€β”€ AuthContext.tsx
β”‚   β”‚   β”‚   └── NotificationContext.tsx
β”‚   β”‚   β”œβ”€β”€ services/                   # API service layer
β”‚   β”‚   β”‚   β”œβ”€β”€ api.ts
β”‚   β”‚   β”‚   β”œβ”€β”€ artistService.ts
β”‚   β”‚   β”‚   β”œβ”€β”€ trackService.ts
β”‚   β”‚   β”‚   β”œβ”€β”€ tipService.ts
β”‚   β”‚   β”‚   └── userService.ts
β”‚   β”‚   β”œβ”€β”€ utils/                      # Utility functions
β”‚   β”‚   β”‚   β”œβ”€β”€ stellar/
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ wallet.ts
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ payments.ts
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ transactions.ts
β”‚   β”‚   β”‚   β”‚   └── addresses.ts
β”‚   β”‚   β”‚   β”œβ”€β”€ formatters.ts
β”‚   β”‚   β”‚   β”œβ”€β”€ validators.ts
β”‚   β”‚   β”‚   β”œβ”€β”€ constants.ts
β”‚   β”‚   β”‚   └── helpers.ts
β”‚   β”‚   β”œβ”€β”€ types/                      # TypeScript type definitions
β”‚   β”‚   β”‚   β”œβ”€β”€ artist.types.ts
β”‚   β”‚   β”‚   β”œβ”€β”€ track.types.ts
β”‚   β”‚   β”‚   β”œβ”€β”€ tip.types.ts
β”‚   β”‚   β”‚   β”œβ”€β”€ user.types.ts
β”‚   β”‚   β”‚   β”œβ”€β”€ wallet.types.ts
β”‚   β”‚   β”‚   └── api.types.ts
β”‚   β”‚   β”œβ”€β”€ styles/                     # Global styles
β”‚   β”‚   β”‚   └── global.css
β”‚   β”‚   β”œβ”€β”€ App.tsx
β”‚   β”‚   β”œβ”€β”€ main.tsx
β”‚   β”‚   └── vite-env.d.ts
β”‚   β”œβ”€β”€ .env.example
β”‚   β”œβ”€β”€ .gitignore
β”‚   β”œβ”€β”€ index.html
β”‚   β”œβ”€β”€ package.json
β”‚   β”œβ”€β”€ tsconfig.json
β”‚   β”œβ”€β”€ vite.config.ts
β”‚   β”œβ”€β”€ tailwind.config.js
β”‚   └── postcss.config.js
β”‚
β”œβ”€β”€ backend/                            # NestJS + TypeORM + PostgreSQL
β”‚   β”œβ”€β”€ src/
β”‚   β”‚   β”œβ”€β”€ main.ts                     # Application entry point
β”‚   β”‚   β”œβ”€β”€ app.module.ts               # Root module
β”‚   β”‚   β”œβ”€β”€ app.controller.ts
β”‚   β”‚   β”œβ”€β”€ app.service.ts
β”‚   β”‚   β”‚
β”‚   β”‚   β”œβ”€β”€ config/                     # Configuration
β”‚   β”‚   β”‚   β”œβ”€β”€ database.config.ts
β”‚   β”‚   β”‚   β”œβ”€β”€ stellar.config.ts
β”‚   β”‚   β”‚   └── app.config.ts
β”‚   β”‚   β”‚
β”‚   β”‚   β”œβ”€β”€ common/                     # Shared resources
β”‚   β”‚   β”‚   β”œβ”€β”€ decorators/
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ current-user.decorator.ts
β”‚   β”‚   β”‚   β”‚   └── public.decorator.ts
β”‚   β”‚   β”‚   β”œβ”€β”€ guards/
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ jwt-auth.guard.ts
β”‚   β”‚   β”‚   β”‚   └── roles.guard.ts
β”‚   β”‚   β”‚   β”œβ”€β”€ interceptors/
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ transform.interceptor.ts
β”‚   β”‚   β”‚   β”‚   └── logging.interceptor.ts
β”‚   β”‚   β”‚   β”œβ”€β”€ filters/
β”‚   β”‚   β”‚   β”‚   └── http-exception.filter.ts
β”‚   β”‚   β”‚   β”œβ”€β”€ pipes/
β”‚   β”‚   β”‚   β”‚   └── validation.pipe.ts
β”‚   β”‚   β”‚   └── interfaces/
β”‚   β”‚   β”‚       └── response.interface.ts
β”‚   β”‚   β”‚
β”‚   β”‚   β”œβ”€β”€ database/                   # Database module
β”‚   β”‚   β”‚   β”œβ”€β”€ database.module.ts
β”‚   β”‚   β”‚   └── migrations/
β”‚   β”‚   β”‚       β”œβ”€β”€ 1234567890-CreateUsers.ts
β”‚   β”‚   β”‚       β”œβ”€β”€ 1234567891-CreateArtists.ts
β”‚   β”‚   β”‚       β”œβ”€β”€ 1234567892-CreateTracks.ts
β”‚   β”‚   β”‚       └── 1234567893-CreateTips.ts
β”‚   β”‚   β”‚
β”‚   β”‚   β”œβ”€β”€ auth/                       # Authentication module
β”‚   β”‚   β”‚   β”œβ”€β”€ auth.module.ts
β”‚   β”‚   β”‚   β”œβ”€β”€ auth.controller.ts
β”‚   β”‚   β”‚   β”œβ”€β”€ auth.service.ts
β”‚   β”‚   β”‚   β”œβ”€β”€ strategies/
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ jwt.strategy.ts
β”‚   β”‚   β”‚   β”‚   └── wallet.strategy.ts
β”‚   β”‚   β”‚   └── dto/
β”‚   β”‚   β”‚       β”œβ”€β”€ challenge.dto.ts
β”‚   β”‚   β”‚       β”œβ”€β”€ verify-signature.dto.ts
β”‚   β”‚   β”‚       └── login.dto.ts
β”‚   β”‚   β”‚
β”‚   β”‚   β”œβ”€β”€ users/                      # Users module
β”‚   β”‚   β”‚   β”œβ”€β”€ users.module.ts
β”‚   β”‚   β”‚   β”œβ”€β”€ users.controller.ts
β”‚   β”‚   β”‚   β”œβ”€β”€ users.service.ts
β”‚   β”‚   β”‚   β”œβ”€β”€ entities/
β”‚   β”‚   β”‚   β”‚   └── user.entity.ts
β”‚   β”‚   β”‚   └── dto/
β”‚   β”‚   β”‚       β”œβ”€β”€ create-user.dto.ts
β”‚   β”‚   β”‚       └── update-user.dto.ts
β”‚   β”‚   β”‚
β”‚   β”‚   β”œβ”€β”€ artists/                    # Artists module
β”‚   β”‚   β”‚   β”œβ”€β”€ artists.module.ts
β”‚   β”‚   β”‚   β”œβ”€β”€ artists.controller.ts
β”‚   β”‚   β”‚   β”œβ”€β”€ artists.service.ts
β”‚   β”‚   β”‚   β”œβ”€β”€ entities/
β”‚   β”‚   β”‚   β”‚   └── artist.entity.ts
β”‚   β”‚   β”‚   └── dto/
β”‚   β”‚   β”‚       β”œβ”€β”€ create-artist.dto.ts
β”‚   β”‚   β”‚       └── update-artist.dto.ts
β”‚   β”‚   β”‚
β”‚   β”‚   β”œβ”€β”€ tracks/                     # Tracks module
β”‚   β”‚   β”‚   β”œβ”€β”€ tracks.module.ts
β”‚   β”‚   β”‚   β”œβ”€β”€ tracks.controller.ts
β”‚   β”‚   β”‚   β”œβ”€β”€ tracks.service.ts
β”‚   β”‚   β”‚   β”œβ”€β”€ entities/
β”‚   β”‚   β”‚   β”‚   └── track.entity.ts
β”‚   β”‚   β”‚   └── dto/
β”‚   β”‚   β”‚       β”œβ”€β”€ create-track.dto.ts
β”‚   β”‚   β”‚       └── update-track.dto.ts
β”‚   β”‚   β”‚
β”‚   β”‚   β”œβ”€β”€ tips/                       # Tips module
β”‚   β”‚   β”‚   β”œβ”€β”€ tips.module.ts
β”‚   β”‚   β”‚   β”œβ”€β”€ tips.controller.ts
β”‚   β”‚   β”‚   β”œβ”€β”€ tips.service.ts
β”‚   β”‚   β”‚   β”œβ”€β”€ entities/
β”‚   β”‚   β”‚   β”‚   └── tip.entity.ts
β”‚   β”‚   β”‚   └── dto/
β”‚   β”‚   β”‚       β”œβ”€β”€ create-tip.dto.ts
β”‚   β”‚   β”‚       └── query-tips.dto.ts
β”‚   β”‚   β”‚
β”‚   β”‚   β”œβ”€β”€ stellar/                    # Stellar blockchain module
β”‚   β”‚   β”‚   β”œβ”€β”€ stellar.module.ts
β”‚   β”‚   β”‚   β”œβ”€β”€ stellar.service.ts
β”‚   β”‚   β”‚   β”œβ”€β”€ transaction-verifier.service.ts
β”‚   β”‚   β”‚   └── types/
β”‚   β”‚   β”‚       └── stellar.types.ts
β”‚   β”‚   β”‚
β”‚   β”‚   β”œβ”€β”€ storage/                    # File storage module
β”‚   β”‚   β”‚   β”œβ”€β”€ storage.module.ts
β”‚   β”‚   β”‚   β”œβ”€β”€ storage.service.ts
β”‚   β”‚   β”‚   └── types/
β”‚   β”‚   β”‚       └── storage.types.ts
β”‚   β”‚   β”‚
β”‚   β”‚   β”œβ”€β”€ notifications/              # Notifications module (WebSocket)
β”‚   β”‚   β”‚   β”œβ”€β”€ notifications.module.ts
β”‚   β”‚   β”‚   β”œβ”€β”€ notifications.gateway.ts
β”‚   β”‚   β”‚   β”œβ”€β”€ notifications.service.ts
β”‚   β”‚   β”‚   └── dto/
β”‚   β”‚   β”‚       └── notification.dto.ts
β”‚   β”‚   β”‚
β”‚   β”‚   └── email/                      # Email module
β”‚   β”‚       β”œβ”€β”€ email.module.ts
β”‚   β”‚       β”œβ”€β”€ email.service.ts
β”‚   β”‚       └── templates/
β”‚   β”‚           └── tip-notification.html
β”‚   β”‚
β”‚   β”œβ”€β”€ test/                           # E2E tests
β”‚   β”‚   β”œβ”€β”€ app.e2e-spec.ts
β”‚   β”‚   └── jest-e2e.json
β”‚   β”‚
β”‚   β”œβ”€β”€ .env.example
β”‚   β”œβ”€β”€ .gitignore
β”‚   β”œβ”€β”€ nest-cli.json
β”‚   β”œβ”€β”€ package.json
β”‚   β”œβ”€β”€ tsconfig.json
β”‚   β”œβ”€β”€ tsconfig.build.json
β”‚   └── ormconfig.ts                    # TypeORM configuration
β”‚
β”œβ”€β”€ contracts/                          # Soroban smart contracts (optional)
β”‚   β”œβ”€β”€ tip-escrow/
β”‚   β”‚   β”œβ”€β”€ src/
β”‚   β”‚   β”‚   └── lib.rs
β”‚   β”‚   └── Cargo.toml
β”‚   └── README.md
β”‚
β”œβ”€β”€ docs/                               # Documentation
β”‚   β”œβ”€β”€ API.md
β”‚   β”œβ”€β”€ ARCHITECTURE.md
β”‚   β”œβ”€β”€ DEPLOYMENT.md
β”‚   β”œβ”€β”€ STELLAR_INTEGRATION.md
β”‚   └── DATABASE_SCHEMA.md
β”‚
β”œβ”€β”€ .github/                            # GitHub configuration
β”‚   β”œβ”€β”€ workflows/
β”‚   β”‚   β”œβ”€β”€ ci.yml
β”‚   β”‚   └── deploy.yml
β”‚   β”œβ”€β”€ ISSUE_TEMPLATE/
β”‚   β”‚   β”œβ”€β”€ bug_report.md
β”‚   β”‚   β”œβ”€β”€ feature_request.md
β”‚   β”‚   └── drips_wave_issue.md
β”‚   └── PULL_REQUEST_TEMPLATE.md
β”‚
β”œβ”€β”€ .gitignore
β”œβ”€β”€ .env.example
β”œβ”€β”€ package.json                        # Root package.json (monorepo scripts)
β”œβ”€β”€ README.md
β”œβ”€β”€ CONTRIBUTING.md
β”œβ”€β”€ LICENSE
└── docker-compose.yml                  # Docker setup for PostgreSQL

Key Features of This Structure:

Backend (NestJS + TypeORM + PostgreSQL)

βœ… Module-based architecture - Each feature is a separate module βœ… Entities folder - TypeORM entities for database models βœ… DTOs folder - Data Transfer Objects for validation βœ… Services - Business logic separated from controllers βœ… Guards & Interceptors - Authentication and request processing βœ… Migrations - Database version control with TypeORM

Frontend (React + TypeScript + Vite)

βœ… Component-based - Organized by feature βœ… Contexts - Global state management βœ… Services - API calls separated from components βœ… Hooks - Reusable logic βœ… Types - TypeScript definitions


Contributing

We welcome contributions! TipTune is participating in the Stellar Drips Wave Program - check out our open issues to earn rewards while building something awesome.

Getting Started

  1. Check out our CONTRIBUTING.md guide
  2. Browse open issues tagged with good-first-issue
  3. Read the Code of Conduct
  4. Join our [Discord community] https://discord.gg/tkbwMmJE

Development Workflow

  1. Fork the repository
  2. Create a feature branch (git checkout -b feature/amazing-feature)
  3. Make your changes with clear commit messages
  4. Write/update tests
  5. Push to your fork
  6. Open a Pull Request

🎡 Roadmap

Phase 1: MVP (Current)

  • Basic music player
  • Wallet connection
  • Simple tipping functionality
  • Artist profiles
  • Real-time notifications

Phase 2: Enhanced Features

  • Playlist creation
  • Social features (comments, likes)
  • Artist analytics dashboard
  • Multiple currency support (USDC, custom tokens)
  • Mobile app (React Native)

Phase 3: Advanced

  • NFT integration (collectible releases)
  • Live streaming with tips
  • Subscription tiers
  • Artist collaboration tools
  • Governance token for platform decisions

Use Cases

  • Independent Artists: Earn directly from superfans
  • Podcasters: Monetize episodes with listener tips
  • Live Performers: Receive virtual tips during streams
  • Music Educators: Get paid for lessons and tutorials
  • Remix Artists: Share work and receive appreciation

License

This project is licensed under the MIT License - see the LICENSE file for details.


Acknowledgments


Contact & Community


πŸ’‘ Support the Project

If you find TipTune valuable, consider:

  • Starring this repository
  • Reporting bugs and suggesting features
  • Contributing code or documentation
  • Using TipTune to support your favorite artists

Built with ❀️ by the TipTune community

About

No description, website, or topics provided.

Resources

Contributing

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors