// Fix image URLs on page load (for existing pages with GitHub URLs) (function() { function normalizeImageUrl(imageUrl) { if (!imageUrl) return null; if (imageUrl.startsWith('data:')) return imageUrl; const baseUrl = window.location.origin; if (imageUrl.includes('raw.githubusercontent.com')) { const urlParts = imageUrl.split('/'); const filename = urlParts[urlParts.length - 1]; if (filename.startsWith('blog-')) { return baseUrl + '/images/blog/' + filename; } const blogIndex = urlParts.findIndex(part => part === 'blog'); if (blogIndex > -1 && blogIndex < urlParts.length - 1) { return baseUrl + '/images/blog/' + urlParts[urlParts.length - 1]; } return imageUrl; } if (imageUrl.startsWith('http://') || imageUrl.startsWith('https://')) return imageUrl; if (imageUrl.startsWith('/')) { if (imageUrl.startsWith('/images/blog/') || imageUrl.startsWith('/valleytainment_final_working_v2/images/blog/')) { return baseUrl + imageUrl; } return baseUrl + imageUrl; } if (!imageUrl.startsWith('/') && !imageUrl.includes('://')) { if (imageUrl.match(/\.(jpg|jpeg|png|gif|webp|svg)$/i)) { return baseUrl + '/images/blog/' + imageUrl; } return baseUrl + '/images/blog/' + imageUrl; } return imageUrl; } function fixImageUrls() { const postImages = document.querySelectorAll('.post-image, .featured-image-section img'); postImages.forEach(img => { const originalSrc = img.src; const normalizedSrc = normalizeImageUrl(originalSrc); if (normalizedSrc && normalizedSrc !== originalSrc) { console.log('🔄 Normalizing image URL:', originalSrc, '→', normalizedSrc); img.src = normalizedSrc; } img.addEventListener('error', function() { console.log('❌ Image failed to load:', this.src); if (originalSrc.includes('raw.githubusercontent.com')) { const urlParts = originalSrc.split('/'); const filename = urlParts[urlParts.length - 1]; const fallbackUrl = window.location.origin + '/images/blog/' + filename; if (this.src !== fallbackUrl) { console.log('🔄 Trying fallback URL:', fallbackUrl); this.src = fallbackUrl; return; } } this.style.display = 'none'; const placeholder = document.createElement('div'); placeholder.className = 'post-image-placeholder'; placeholder.style.cssText = 'width: 100%; height: 400px; background: linear-gradient(135deg, rgba(0, 255, 221, 0.2), rgba(147, 112, 219, 0.2)); display: flex; align-items: center; justify-content: center; color: rgba(0, 255, 221, 0.6); font-size: 4rem;'; placeholder.textContent = '📝'; this.parentNode.insertBefore(placeholder, this.nextSibling); }); }); } if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', fixImageUrls); } else { fixImageUrls(); } })();

How to Get Shows Booked & Find Open Mics

By YT412 5 min read
I don’t wait for invites. I run a simple system: **find**, **pitch**, **advance**, **promote**, **perform**, **follow up**. This guide shows exactly how I discover open mics, contact bookers, lock dates, and convert small sets into paid shows—without burning bridges or wasting time. ## 1) Mindset & Offer - **Venue-first thinking.** Bookers care about **fit**, **draw**, **low headache**. Make your pitch answer all three. - **Proof over promises.** One clean live clip and a simple poster mock beats a paragraph of claims. - **Small wins → bigger slots.** Crush a 10-minute open mic, bring 5 fans, post a tidy recap. Repeat. - **Be easy to say “yes” to.** Clear date ranges, short set options (15/30/45), and a no-drama tech setup. --- ## 2) EPK That Actually Books A one-screen **booking page** (or PDF) with: - **1-sentence elevator line** (genre + vibe + for fans of ___). - **60–90s live performance video** (phones ok if audio is clean). - **3 standout tracks** (links). - **Clean press photo** (landscape + portrait). - **Stage plot & input list** (see template below). - **Socials + last 60-day stats** (followers, avg. reel views). - **Contact** (email + phone) and **availability window**. > Pro tip: Put the live clip **above the fold**. Bookers skip fast. --- ## 3) Where I Find Open Mics & Bookers Use these **search patterns** (swap CITY): - Google: `CITY "open mic"`, `CITY singer-songwriter open mic`, `CITY comedy + music open mic` - Instagram: search Places/Tags for `CITY open mic`, `CITY showcase`, `CITY songwriter night` - Event sites: Bandsintown, Songkick, Eventbrite, Meetup (filter by “music” + date) - Community: local FB groups, Discords, university orgs, neighborhood cafés/breweries - On-foot: posters near campuses, record stores, indie venues, coffee shops **Pittsburgh anchors to check regularly:** Mr. Smalls, The Funhouse @ Mr. Smalls, Thunderbird Café & Music Hall, Roxian Theatre, Spirit, The Government Center, Club Café, open stages at cafés/breweries around Lawrenceville, Bloomfield, and South Side. --- ## 4) Booking Pipeline (Lead → Pitch → Confirm → Advance → Perform → Follow-Up) Keep a tiny **Outreach Tracker** (CSV below) with columns: **Venue/Host | Contact | Platform | Fit (why) | Pitch Date | Status | Hold/Confirm Date | Tech Sent | Promo Sent | Recap Sent | Notes** **Status codes I use:** Lead / Pitched / Soft Hold / Confirmed / Advanced / Played / Recapped / No **Cadence:** - **Mon:** find 5 new leads - **Tue:** send pitches - **Thu:** nudge follow-ups - **Sun:** post recaps + send thank-yous --- ## 5) How I Pitch (Email/DM Templates) **Subject (pick one):** - `Local opener — 30m set, flexible dates (live video inside)` - `CITY artist — can bring 10–20, easy tech, looking for weeknight` **Email (3 sentences + links):** Hi **[Name]**, I’m **[Artist]** (alt-R&B / hip-hop hybrid; for fans of **[X/Y/Z]**). Here’s a **90-sec live clip** and **3 tracks**: **[YouTube link]**, **[Link 1]**, **[Link 2]**. **Ask:** 20–30 min **opener** or **weeknight** set in **[2–3 date windows]**. I’ll provide poster assets, a clean stage plot (2 mics, stereo playback), and short reels to help promo. If a fit, I’ll send the **stage plot**, **one-pager EPK**, and **promo kit** same day. Thanks! **Instagram DM (short):** Hey **[Venue/Host]** — local **[genre]** artist with a tight 20–30 min set. Live clip (90s): **[link]**. Looking at **[2–3 dates]**. I bring 10–20 and handle promo assets. If it helps, I can also **host an open mic** or **run a showcase segment**. Open? **Follow-up (72h):** Bumping this kindly in case it slipped through. Still open for **[date window]**; happy to hold a **15/30/45** option and send a poster + stage plot today. --- ## 6) Open Mic Strategy (From 5 Minutes → Full Set) - **Arrive early** (sign-up order matters). Ask for **timekeeper + host name**. - **Bring playback** on phone/USB; carry your **own 1/8" → 1/4" adapter** and a spare XLR. - **Perform one undeniable song** (no medleys). Take **10 sec of crowd video** from a friend. - **Close with a booking line:** “If you book shows or run a space, I’ve got a 20-minute set—DM me.” - **Thank the host** and ask: “Any open slots coming up?” - **Convert on the spot:** exchange IGs, send your live clip that night, and offer a **guest slot** for their next event. - **Post a recap in 24h** tagging the venue/host and 2 performers you liked. That’s how you get invited back. --- ## 7) Promotion That Helps Venues Say “Yes” - **Promo kit** (deliver with confirmation): 1080×1350 poster, 1920×1080 story, 15s reel, caption w/ tags, ticket link if any. - **Posting plan:** T-14, T-7, T-3, T-1, and day-of. - **Street team micro-asks:** 3 friends each post once; offer guest list + merch discount. - **QR codes:** tip jar + mailing list at the table. - **After the show:** post a clean recap w/ setlist + thanks; email venue a Google Drive folder of photos/reels they can reuse. --- ## 8) Money & Terms (Guarantee vs. Door) - **Common deals:** - Weeknight local: **door split** (50/50 after costs) or small **guarantee + %** - Support slot: flat **$50–$150** or **merch-heavy** deals - Headline indie room: **guarantee** based on draw + presale - **Ask cleanly:** “Open to a small guarantee or standard door split; I’ll handle posters and short-form promo.” - **Settlement checklist:** count at end, confirm split, collect pay, thank staff, book the next hold. --- ## 9) 14-Day Sprint to Your Next Booking **Day 1–2:** Assemble EPK (live clip, photos, one-pager, stage plot). **Day 3:** Build tracker; list 15 leads (5 open mics, 10 venues). **Day 4–5:** Pitch 10 venues/hosts with date windows. **Day 6–7:** Hit 2 open mics (capture content, meet hosts). **Day 8:** Follow-ups; send promo kit to any soft holds. **Day 9–10:** Lock one **weeknight** and one **open mic feature**. **Day 11–12:** Design poster + 15s reel; schedule posts (T-7, T-3, T-1). **Day 13:** Rehearse a **tight 20–30**; print a simple setlist. **Day 14:** Play, collect contacts, post recap, send thank-yous, request next hold.
// Fix image URLs on page load (for existing pages with GitHub URLs) (function() { function normalizeImageUrl(imageUrl) { if (!imageUrl) return null; if (imageUrl.startsWith('data:')) return imageUrl; const baseUrl = window.location.origin; if (imageUrl.includes('raw.githubusercontent.com')) { const urlParts = imageUrl.split('/'); const filename = urlParts[urlParts.length - 1]; if (filename.startsWith('blog-')) { return baseUrl + '/images/blog/' + filename; } const blogIndex = urlParts.findIndex(part => part === 'blog'); if (blogIndex > -1 && blogIndex < urlParts.length - 1) { return baseUrl + '/images/blog/' + urlParts[urlParts.length - 1]; } return imageUrl; } if (imageUrl.startsWith('http://') || imageUrl.startsWith('https://')) return imageUrl; if (imageUrl.startsWith('/')) { if (imageUrl.startsWith('/images/blog/') || imageUrl.startsWith('/valleytainment_final_working_v2/images/blog/')) { return baseUrl + imageUrl; } return baseUrl + imageUrl; } if (!imageUrl.startsWith('/') && !imageUrl.includes('://')) { if (imageUrl.match(/\.(jpg|jpeg|png|gif|webp|svg)$/i)) { return baseUrl + '/images/blog/' + imageUrl; } return baseUrl + '/images/blog/' + imageUrl; } return imageUrl; } function fixImageUrls() { const postImages = document.querySelectorAll('.post-image, .featured-image-section img'); postImages.forEach(img => { const originalSrc = img.src; const normalizedSrc = normalizeImageUrl(originalSrc); if (normalizedSrc && normalizedSrc !== originalSrc) { console.log('🔄 Normalizing image URL:', originalSrc, '→', normalizedSrc); img.src = normalizedSrc; } img.addEventListener('error', function() { console.log('❌ Image failed to load:', this.src); if (originalSrc.includes('raw.githubusercontent.com')) { const urlParts = originalSrc.split('/'); const filename = urlParts[urlParts.length - 1]; const fallbackUrl = window.location.origin + '/images/blog/' + filename; if (this.src !== fallbackUrl) { console.log('🔄 Trying fallback URL:', fallbackUrl); this.src = fallbackUrl; return; } } this.style.display = 'none'; const placeholder = document.createElement('div'); placeholder.className = 'post-image-placeholder'; placeholder.style.cssText = 'width: 100%; height: 400px; background: linear-gradient(135deg, rgba(0, 255, 221, 0.2), rgba(147, 112, 219, 0.2)); display: flex; align-items: center; justify-content: center; color: rgba(0, 255, 221, 0.6); font-size: 4rem;'; placeholder.textContent = '📝'; this.parentNode.insertBefore(placeholder, this.nextSibling); }); }); } if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', fixImageUrls); } else { fixImageUrls(); } })();