Files
kestrelsnest-blog/static/porchfest/index.html
T
Eric WagonerandClaude Fable 5 0e9a90a302 Add Porchfest page at /porchfest/
Already live on the server via rsync; bringing the repo in sync.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-11-10 20:02:22 -05:00

639 lines
167 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
<title>Athens Porchfest 2026 Map</title>
<meta name="description" content="Interactive map of all 237 Historic Athens Porchfest sets on Sunday, Oct 18, 1–7pm. Filter by hour and genre, star your bands, and plan a walking route with trolley stops.">
<link rel="canonical" href="https://blog.kestrelsnest.social/porchfest/">
<meta property="og:type" content="website">
<meta property="og:site_name" content="Kestrel's Nest">
<meta property="og:title" content="Athens Porchfest 2026 Map">
<meta property="og:description" content="237 sets on 193 porches, Sunday Oct 18, 1–7pm. Map it, star your bands, walk your route.">
<meta property="og:url" content="https://blog.kestrelsnest.social/porchfest/">
<meta property="og:image" content="https://blog.kestrelsnest.social/porchfest/og.png">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" content="630">
<meta property="og:image:alt" content="Night map of Athens neighborhoods with glowing porch dots and the title Athens Porchfest">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Athens Porchfest 2026 Map">
<meta name="twitter:description" content="237 sets on 193 porches, Sunday Oct 18, 1–7pm. Map it, star your bands, walk your route.">
<meta name="twitter:image" content="https://blog.kestrelsnest.social/porchfest/og.png">
<meta name="theme-color" content="#eef1ea" media="(prefers-color-scheme: light)">
<meta name="theme-color" content="#141a1f" media="(prefers-color-scheme: dark)">
<link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ccircle cx='16' cy='16' r='15' fill='%23141a1f'/%3E%3Ccircle cx='16' cy='16' r='8' fill='%23ffc23d'/%3E%3C/svg%3E">
<style>:root{color-scheme:light;padding-top:env(safe-area-inset-top,0px);padding-bottom:env(safe-area-inset-bottom,0px)}body{margin:0;font:14px system-ui,-apple-system,sans-serif}img{max-width:100%}[hidden]{display:none!important}</style>
<script data-goatcounter="https://kestrelsnest.goatcounter.com/count"
async src="//gc.zgo.at/count.js"></script>
<meta name="claude:viewport-fit-sides" content="cover">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Young+Serif&family=Atkinson+Hyperlegible:ital,wght@0,400;0,700;1,400&family=IBM+Plex+Mono:wght@500;600&display=swap">
<style>
/* Layout: one-screen app. Hand-drawn street map of the Prince Ave corridor fills the left; a schedule rail on the right (stacked below the map on phones). Porch lights glow when a band is on. */
:root{
--paper:#eef1ea; --land:#e3e8dc; --street:#ffffff; --street-edge:#c9d0c1; --major:#fbf3dc; --major-edge:#d8c79a; --rail:#9aa492;
--ink:#1f2a24; --muted:#5b675f; --line:#d3d9cc; --panel:#f7f8f4; --chip:#e6eae0;
--glow:#e7a91a; --glow-soft:rgba(231,169,26,.28); --off:#a9b2a6; --route:#7a3fb0; --mark:#1f2a24; --mark-fg:#ffffff; --mark-note:#f1c04a; --trolley:#1f4fae; --trolley-fg:#ffffff; --parade:#d6336c; --parade-fg:#ffffff; --parade-soft:rgba(214,51,108,.12); --star:#c4581c;
--g-rock:#c2412d; --g-indie:#7a52c7; --g-folk:#3f8a4a; --g-jazz:#2f6fb5; --g-elec:#0f8f8f; --g-other:#8a6a3c;
--f-display:"Young Serif",Georgia,"Times New Roman",serif;
--f-body:"Atkinson Hyperlegible",system-ui,-apple-system,"Segoe UI",sans-serif;
--f-mono:"IBM Plex Mono",ui-monospace,Menlo,Consolas,monospace;
}
@media (prefers-color-scheme:dark){:root:not([data-theme="light"]){
--paper:#141a1f; --land:#18201f; --street:#2a3436; --street-edge:#222b2d; --major:#3b3a2c; --major-edge:#2e2d22; --rail:#4a5552;
--ink:#e8ede6; --muted:#9aa7a0; --line:#2a3335; --panel:#11171b; --chip:#1f282a;
--glow:#ffc23d; --glow-soft:rgba(255,194,61,.32); --off:#4d5a58; --route:#c79bff; --star:#ff8a4c; --mark:#f3eedf; --mark-fg:#141a1f; --mark-note:#9a5f00; --trolley:#8fb0ff; --trolley-fg:#0d1a33; --parade:#ff7eb0; --parade-fg:#2a0614; --parade-soft:rgba(255,126,176,.14);
--g-rock:#ff7a63; --g-indie:#b39bff; --g-folk:#7fd18a; --g-jazz:#7fb3ff; --g-elec:#4fd6cf; --g-other:#d9b37a;
color-scheme:dark}}
:root[data-theme="dark"]{
--paper:#141a1f; --land:#18201f; --street:#2a3436; --street-edge:#222b2d; --major:#3b3a2c; --major-edge:#2e2d22; --rail:#4a5552;
--ink:#e8ede6; --muted:#9aa7a0; --line:#2a3335; --panel:#11171b; --chip:#1f282a;
--glow:#ffc23d; --glow-soft:rgba(255,194,61,.32); --off:#4d5a58; --route:#c79bff; --star:#ff8a4c; --mark:#f3eedf; --mark-fg:#141a1f; --mark-note:#9a5f00; --trolley:#8fb0ff; --trolley-fg:#0d1a33; --parade:#ff7eb0; --parade-fg:#2a0614; --parade-soft:rgba(255,126,176,.14);
--g-rock:#ff7a63; --g-indie:#b39bff; --g-folk:#7fd18a; --g-jazz:#7fb3ff; --g-elec:#4fd6cf; --g-other:#d9b37a;
color-scheme:dark}
html,body{height:100%}
body{background:var(--panel);color:var(--ink);font-family:var(--f-body);font-size:15px;line-height:1.45}
*{box-sizing:border-box}
button,input,select{font:inherit;color:inherit}
:focus-visible{outline:2px solid var(--glow);outline-offset:2px}
.app{display:grid;grid-template-columns:minmax(0,1fr) 420px;height:100%}
.mapwrap{position:relative;background:var(--paper);overflow:hidden;touch-action:none;min-width:0}
#map{width:100%;height:100%;display:block;cursor:grab;user-select:none}
#map.drag{cursor:grabbing}
.st{fill:none;stroke-linecap:round;stroke-linejoin:round;vector-effect:non-scaling-stroke}
.st.c{stroke:var(--street);stroke-width:3}
.st.b{stroke:var(--street);stroke-width:5}
.st.a{stroke:var(--major);stroke-width:7}
.st.r{stroke:var(--rail);stroke-width:1.5;stroke-dasharray:5 4}
.case.c{stroke:var(--street-edge);stroke-width:5}
.case.b{stroke:var(--street-edge);stroke-width:7}
.case.a{stroke:var(--major-edge);stroke-width:9}
.lbl{fill:var(--muted);font-family:var(--f-body);paint-order:stroke;stroke:var(--paper);stroke-width:3px;stroke-linejoin:round;letter-spacing:.02em;pointer-events:none}
.hood{fill:var(--ink);opacity:.13;font-family:var(--f-display);text-anchor:middle;pointer-events:none;letter-spacing:.04em}
.pin{cursor:pointer}
.pin .halo{fill:var(--glow-soft)}
.pin .dot{stroke:var(--panel)}
.pin.off .dot{fill:var(--off)}
.pin.sel .ring{stroke:var(--ink);fill:none}
.pin .starring{fill:none;stroke:var(--star)}
#route{fill:none;stroke:var(--route);stroke-dasharray:6 5;vector-effect:non-scaling-stroke;stroke-width:3;opacity:.85}
.routeNum{fill:var(--route);font-family:var(--f-mono);font-weight:600;text-anchor:middle;pointer-events:none;paint-order:stroke;stroke:var(--paper);stroke-linejoin:round}
#trolleyRoute{fill:none;stroke:var(--trolley);stroke-width:3;stroke-dasharray:1 6;stroke-linecap:round;vector-effect:non-scaling-stroke;opacity:.7}
.tstop{cursor:pointer}
.tstop rect{fill:var(--trolley);stroke:var(--panel);stroke-width:2}
.tstop text{fill:var(--trolley-fg);font-family:var(--f-mono);font-weight:600;font-size:12px;text-anchor:middle}
.tstop.sel rect{stroke:var(--ink);stroke-width:3}
.tline{display:flex;gap:8px;align-items:center;margin-top:8px;font-size:14px}
.tnum{display:inline-grid;place-items:center;min-width:22px;height:22px;border-radius:5px;background:var(--trolley);color:var(--trolley-fg);font-family:var(--f-mono);font-weight:600;font-size:12px;flex:none}
.tbtn{border:0;background:none;padding:0;cursor:pointer;color:inherit;text-decoration:underline;text-align:left}
.thint{font-size:12px;color:var(--trolley);padding:0 0 4px 21px}
.stopnav{display:flex;justify-content:space-between;gap:10px;margin:12px 0 4px;font-size:14px}
.parade{fill:none;stroke:var(--parade);stroke-width:12;stroke-linecap:round;stroke-linejoin:round;opacity:.35;vector-effect:non-scaling-stroke;cursor:pointer}
.parade.on{opacity:.65}
.parrow{fill:none;stroke:var(--parade);stroke-width:4;stroke-linecap:round;stroke-linejoin:round;pointer-events:none}
.mark .call{display:none}.mark.open .call{display:inline}
.mark .bg{fill:var(--mark);stroke:var(--panel);stroke-width:2}.mark .ic{fill:var(--mark-fg)}.mark .icbg{fill:var(--mark)}.mark .icstroke{stroke:var(--mark-fg);stroke-width:1.4}
.lmkcard{margin-top:10px;background:var(--chip);border-radius:10px;padding:10px 12px;display:grid;gap:4px}
.lmkcard b{font-size:15px}
.lmkcard .lw{font-family:var(--f-mono);font-size:12px;font-weight:600;color:var(--muted)}
.lmkcard p{margin:0;font-size:14px;line-height:1.5}
.lmkcard .mer{font-size:13px;color:var(--muted)}
.mark .stem{stroke:var(--mark);stroke-width:2}
.mark.pm .bg{fill:var(--parade)}.mark.pm .ic{fill:var(--parade-fg)}.mark.pm .icbg{fill:var(--parade)}
.mark .chev{font-size:18px}
.mark.pm rect{fill:var(--parade)}.mark.pm line{stroke:var(--parade)}.mark.pm .mn{fill:var(--parade-fg)}.mark.pm .mt{fill:var(--parade-fg);opacity:.85}
.evrow{display:grid;grid-template-columns:auto minmax(0,1fr) auto;gap:10px;align-items:center;width:100%;text-align:left;border:1px solid var(--parade);background:var(--parade-soft);border-radius:10px;padding:10px 12px;margin:10px 0 2px;cursor:pointer}
.evrow .evdot{width:11px;height:11px;border-radius:3px;background:var(--parade)}
.evrow .meta{display:block;font-size:13px;color:var(--muted)}
.evrow .t{font-family:var(--f-mono);font-weight:600;color:var(--ink)}
.mark{cursor:pointer}
.mark rect{fill:var(--mark)}
.mark line{stroke:var(--mark);stroke-width:2}
.mark .mn{fill:var(--mark-fg);font-family:var(--f-body);font-weight:700;font-size:13px}
.mark .mt{fill:var(--mark-note);font-family:var(--f-mono);font-weight:600;font-size:11px;letter-spacing:.06em;text-transform:uppercase}
.lmk{display:inline-block;margin-top:8px;background:var(--mark);color:var(--mark-fg);border-radius:6px;padding:3px 9px;font-weight:700;font-size:13px}
.lmk span{color:var(--mark-note);font-family:var(--f-mono);text-transform:uppercase;letter-spacing:.06em;font-size:11px;margin-left:6px}
.zoom{position:absolute;right:calc(12px + env(safe-area-inset-right,0px));bottom:12px;display:flex;flex-direction:column;gap:6px}
.zoom button{width:38px;height:38px;border-radius:8px;border:1px solid var(--line);background:var(--panel);font-size:18px;cursor:pointer;display:grid;place-items:center}
.legend{position:absolute;left:calc(12px + env(safe-area-inset-left,0px));bottom:12px;background:color-mix(in srgb,var(--panel) 88%,transparent);border:1px solid var(--line);border-radius:8px;padding:8px 10px;font-size:12px;display:grid;grid-template-columns:repeat(2,auto);gap:3px 14px;backdrop-filter:blur(4px)}
.legend span{display:flex;align-items:center;gap:6px;white-space:nowrap}
.sw{width:10px;height:10px;border-radius:50%;display:inline-block;flex:none}
.helpbtn{position:absolute;top:12px;right:calc(12px + env(safe-area-inset-right,0px));width:38px;height:38px;border-radius:50%;border:1px solid var(--line);background:var(--panel);font-family:var(--f-display);font-size:19px;cursor:pointer;display:grid;place-items:center;z-index:2}
.osm{position:absolute;bottom:3px;left:50%;transform:translateX(-50%);font-size:10px;color:var(--muted);text-decoration:none;opacity:.8;white-space:nowrap}
.help h3{font-family:var(--f-display);font-weight:400;font-size:18px;margin:20px 0 4px;letter-spacing:0;text-transform:none;color:var(--ink)}
.help p,.help li{font-size:15px;line-height:1.55;max-width:62ch}
.help p{margin:6px 0}
.help ul{margin:6px 0;padding-left:20px;display:grid;gap:6px}
.help .ico{display:inline-grid;place-items:center;width:20px;height:20px;border-radius:50%;vertical-align:-4px;margin-right:2px}
.help .lede{font-size:16px}
.maptitle{position:absolute;left:calc(14px + env(safe-area-inset-left,0px));top:12px;pointer-events:none}
.maptitle h1{font-family:var(--f-display);font-weight:400;font-size:clamp(20px,2.4vw,30px);margin:0;line-height:1.05;text-wrap:balance}
.maptitle p{margin:2px 0 0;color:var(--muted);font-size:13px}
.side{display:flex;flex-direction:column;min-height:0;border-left:1px solid var(--line);background:var(--panel)}
.controls{padding-block:4px 10px;padding-left:max(16px,env(safe-area-inset-left,0px));padding-right:max(16px,env(safe-area-inset-right,0px));display:grid;gap:10px;border-bottom:1px solid var(--line)}
.tabs{display:flex;gap:4px;background:var(--chip);border-radius:10px;padding:3px}
.tabs button{flex:1;border:0;background:transparent;padding:7px 8px;border-radius:8px;cursor:pointer;font-weight:700;font-size:14px;color:var(--muted)}
.tabs button[aria-pressed="true"]{background:var(--panel);color:var(--ink);box-shadow:0 1px 2px rgba(0,0,0,.12)}
.tabs .count{font-family:var(--f-mono);font-size:12px;margin-left:4px;opacity:.75}
.hours{display:grid;grid-template-columns:repeat(8,1fr);gap:4px}
.hours button{border:1px solid var(--line);background:transparent;border-radius:8px;padding:6px 0 5px;cursor:pointer;font-family:var(--f-mono);font-weight:600;font-size:14px;line-height:1.1;position:relative}
.hours button small{display:block;font-family:var(--f-body);font-weight:400;font-size:10px;color:var(--muted)}
.hours button[aria-pressed="true"]{background:var(--ink);color:var(--panel);border-color:var(--ink)}
.hours button[aria-pressed="true"] small{color:inherit;opacity:.75}
.hours .now::after{content:"";position:absolute;top:4px;right:4px;width:7px;height:7px;border-radius:50%;background:var(--glow);box-shadow:0 0 0 3px var(--glow-soft)}
.row{display:flex;gap:8px;flex-wrap:wrap}
.search{flex:1 1 180px;min-width:0;border:1px solid var(--line);background:var(--panel);border-radius:8px;padding:9px 10px;font-size:16px}
.bar{display:grid;gap:10px;padding-block:14px 10px;padding-left:max(16px,env(safe-area-inset-left,0px));padding-right:max(16px,env(safe-area-inset-right,0px));background:var(--panel)}
.filters{display:grid;gap:10px;justify-items:start}
.filtbtn{display:none;border:1px solid var(--line);background:var(--panel);border-radius:8px;padding:0 12px;font-weight:700;cursor:pointer;align-items:center;gap:6px;min-height:42px}
.filtbtn span:not(:empty){font-family:var(--f-mono);font-size:12px;background:var(--ink);color:var(--panel);border-radius:999px;padding:1px 7px}
.filtbtn[aria-expanded="true"]{background:var(--chip)}
.mapsize{display:none;position:absolute;left:calc(12px + env(safe-area-inset-left,0px));bottom:12px;border:1px solid var(--line);background:var(--panel);border-radius:8px;padding:0 12px;min-height:38px;font-size:13px;font-weight:700;cursor:pointer}
#me .acc{fill:var(--trolley);opacity:.12}
#me .dot{fill:var(--trolley);stroke:var(--panel)}
#zloc[aria-pressed="true"]{background:var(--trolley);color:var(--trolley-fg);border-color:var(--trolley)}
.near{font-family:var(--f-mono);font-weight:600;color:var(--trolley)}
.toast{position:fixed;left:50%;transform:translateX(-50%);bottom:calc(16px + env(safe-area-inset-bottom,0px));background:var(--ink);color:var(--panel);padding:10px 14px;border-radius:10px;font-size:14px;z-index:20;max-width:calc(100% - 32px);box-shadow:0 4px 16px rgba(0,0,0,.25)}
select{border:1px solid var(--line);background:var(--panel);border-radius:8px;padding:8px;font-size:16px;max-width:100%}
.chips{display:flex;gap:5px;flex-wrap:wrap}
.chip{border:1px solid var(--line);background:transparent;border-radius:999px;padding:3px 10px 3px 8px;font-size:13px;cursor:pointer;display:flex;align-items:center;gap:6px}
.chip[aria-pressed="false"]{opacity:.45}
.chip[aria-pressed="false"] .sw{background:transparent!important;box-shadow:inset 0 0 0 1.5px var(--muted)}
.status{font-size:13px;color:var(--muted);display:flex;justify-content:space-between;gap:8px;align-items:baseline}
.status b{color:var(--ink);font-family:var(--f-mono)}
.linkbtn{border:0;background:none;padding:0;color:var(--muted);text-decoration:underline;cursor:pointer;font-size:13px}
.list{overflow:auto;flex:1;min-height:0;padding-block:6px 24px;padding-left:max(16px,env(safe-area-inset-left,0px));padding-right:max(16px,env(safe-area-inset-right,0px))}
.group{margin-top:12px}
.group h3{font-family:var(--f-mono);font-size:12px;letter-spacing:.08em;text-transform:uppercase;color:var(--muted);margin:0 0 4px;font-weight:600;display:flex;justify-content:space-between}
.act{display:grid;grid-template-columns:auto minmax(0,1fr) auto;gap:10px;align-items:start;padding:9px 6px;border-radius:8px;cursor:pointer;border-top:1px solid var(--line)}
.act:hover,.act.hl{background:var(--chip)}
.act .sw{margin-top:6px;width:11px;height:11px}
.act .nm{font-weight:700;line-height:1.25}
.act .meta{font-size:13px;color:var(--muted)}
.act[aria-expanded="true"]{background:var(--chip)}
.det{margin-top:8px;display:grid;gap:6px;cursor:auto}
.det .d{font-size:14px;line-height:1.5}
.det .dm{font-size:13px;color:var(--muted)}
.det .lk{display:flex;gap:14px;flex-wrap:wrap;font-size:13px}
.rq{border-left:3px solid var(--glow);padding:2px 0 2px 10px;display:grid;gap:3px}
.rqh{font-size:12px;color:var(--muted)}
.rqh a{color:inherit}
.rqt{font-size:14px;line-height:1.5}
.rtag{font-family:var(--f-mono);font-size:10px;font-weight:600;letter-spacing:.04em;text-transform:uppercase;color:var(--ink);background:var(--glow-soft);border-radius:4px;padding:1px 5px;vertical-align:2px;white-space:nowrap}
.act .t{font-family:var(--f-mono);font-weight:600;color:var(--ink)}
.starbtn{border:0;background:none;cursor:pointer;font-size:22px;line-height:1;color:var(--off);min-width:44px;min-height:44px;margin:-10px -10px -10px 0;display:grid;place-items:center;border-radius:50%}
.starbtn[aria-pressed="true"]{color:var(--star)}
.empty{color:var(--muted);padding:24px 4px;text-align:center}
.empty strong{display:block;color:var(--ink);font-family:var(--f-display);font-weight:400;font-size:20px;margin-bottom:6px}
.porch{padding:14px 0 6px}
.porch .back{margin-bottom:10px}
.porch h2{font-family:var(--f-display);font-weight:400;font-size:24px;margin:0;line-height:1.15;text-wrap:balance}
.porch .sub{color:var(--muted);font-size:14px;margin-top:2px}
.porch .links{display:flex;gap:12px;flex-wrap:wrap;margin:10px 0 4px;font-size:14px}
a{color:inherit}
.slot{display:grid;grid-template-columns:44px minmax(0,1fr) auto;gap:10px;padding:12px 0;border-top:1px solid var(--line)}
.slot.cur{background:linear-gradient(90deg,var(--glow-soft),transparent 70%);margin-inline:-8px;padding-inline:8px;border-radius:6px}
.slot .t{font-family:var(--f-mono);font-weight:600;font-size:15px}
.slot .nm{font-weight:700}
.slot .g{font-size:13px;color:var(--muted);display:flex;align-items:center;gap:6px}
.slot .d{font-size:14px;margin-top:4px;color:var(--ink);opacity:.85}
.slot .lk{display:flex;gap:12px;font-size:13px;margin-top:5px;flex-wrap:wrap}
.walk{font-size:12px;color:var(--route);font-family:var(--f-mono);padding:2px 0 2px 21px;position:relative}
.walk::before{content:"";position:absolute;left:5px;top:-6px;bottom:-6px;border-left:2px dashed var(--route);opacity:.6}
.warn{color:var(--g-rock);font-size:12px;font-weight:700}
.plancard{border:1px dashed var(--line);border-radius:10px;padding:12px;margin-top:12px;font-size:14px;color:var(--muted)}
@media (max-width:860px){
.app{grid-template-columns:1fr;grid-template-rows:auto auto;height:auto;--mapH:max(220px,40svh)}
.app.mapsmall{--mapH:150px}
.mapwrap{height:var(--mapH);position:sticky;top:env(safe-area-inset-top,0px);z-index:3}
.bar{position:sticky;top:calc(env(safe-area-inset-top,0px) + var(--mapH));z-index:3;padding-block:10px 8px;border-bottom:1px solid var(--line);box-shadow:0 6px 10px -10px rgba(0,0,0,.4)}
.controls{padding-block:10px;border-bottom:0}
.filtbtn{display:inline-flex}
.filters{display:none}
.filters.open{display:grid}
.mapsize{display:block}
.app.mapsmall .maptitle p,.app.mapsmall .maptitle h1{display:none}
.app.mapsmall .zoom button{width:34px;height:34px}
.app.mapsmall #zin,.app.mapsmall #zout{display:none}
.hours button{padding:8px 0 6px}
.act{padding:11px 6px}
.side{border-left:0;border-top:1px solid var(--line)}
.list{overflow:visible}
.legend{display:none}
body::before{content:"";position:fixed;inset:0 0 auto;height:env(safe-area-inset-top,0px);z-index:10;background:var(--paper)}
}
@media (max-width:420px){.hours button{font-size:13px}.maptitle p{display:none}}
@media (prefers-reduced-motion:reduce){*{transition:none!important;animation:none!important}}
</style>
</head>
<body>
<div class="app">
<div class="mapwrap">
<svg id="map" role="img" aria-label="Map of Porchfest porches in Cobbham, Boulevard, Normaltown and nearby neighborhoods">
<g id="world">
<g id="cases"></g><g id="streets"></g><g id="labels"></g><g id="hoods"></g>
<path id="route" d=""></path><g id="routeNums"></g>
<g id="paradeG"></g><path id="trolleyRoute" d=""></path><g id="pins"></g><g id="marks"></g><g id="tstops"></g><g id="me"></g>
</g>
</svg>
<button class="helpbtn" id="helpBtn" aria-label="How this map works">?</button>
<a class="osm" href="https://www.openstreetmap.org/copyright" target="_blank" rel="noopener">© OpenStreetMap</a>
<div class="maptitle"><h1>Athens Porchfest</h1><p>Sun Oct 18 · 1–7pm · lineup as of Oct 17, 4:30pm</p></div>
<div class="legend" id="legend"></div>
<button class="mapsize" id="mapSize" aria-label="Make the map smaller">Smaller map</button>
<div class="zoom">
<button id="zloc" aria-label="Show where I am" title="Show where I am"><svg viewBox="0 0 24 24" width="20" height="20" aria-hidden="true"><circle cx="12" cy="12" r="4" fill="currentColor"/><circle cx="12" cy="12" r="8" fill="none" stroke="currentColor" stroke-width="2"/><path d="M12 1v4M12 19v4M1 12h4M19 12h4" stroke="currentColor" stroke-width="2"/></svg></button>
<button id="zin" aria-label="Zoom in">+</button>
<button id="zout" aria-label="Zoom out">−</button>
<button id="zfit" aria-label="Show all porches" title="Show all porches">⤢</button>
</div>
</div>
<aside class="side">
<div class="bar" id="bar">
<div class="tabs" role="group" aria-label="View">
<button id="tabLineup" aria-pressed="true">Lineup</button>
<button id="tabPlan" aria-pressed="false">My day<span class="count" id="planCount"></span></button>
</div>
<div class="hours" id="hours" role="group" aria-label="Start time"></div>
</div>
<div class="controls">
<div class="row">
<input class="search" id="q" type="search" placeholder="Search bands, hosts, streets…" aria-label="Search" enterkeyhint="search" autocomplete="off">
<button class="filtbtn" id="filtBtn" aria-expanded="false" aria-controls="filters">Filters<span id="filtCount"></span></button>
</div>
<div class="filters" id="filters">
<select id="hood" aria-label="Neighborhood"><option value="">All neighborhoods</option></select>
<div class="chips" id="genres" role="group" aria-label="Genres"></div>
</div>
<div class="status" id="status"></div>
</div>
<div class="list" id="list"></div>
<div class="toast" id="toast" role="status" aria-live="polite" hidden></div>
</aside>
</div>
<script>
const DATA={"porches":[{"a":"380 Meigs Street","h":"Cobbham","hosts":["Adam"],"x":920,"y":290},{"a":"670 Holman Ave","h":"Normaltown","hosts":["Alex Nichols"],"x":-1287,"y":-3},{"a":"165 The Plaza","h":"Reese Hancock","hosts":["Alexandra Larsen"],"x":-84,"y":506},{"a":"399 Buena Vista Ave","h":"Buena Vista Heights","hosts":["Alison & Dan Miller"],"x":-578,"y":-671},{"a":"550 Nantahala Ave","h":"Boulevard","hosts":["Ben Mize, Stage 2","Ben Mize, Stage 1"],"x":99,"y":-599},{"a":"834 Hill Street","h":"Cobbham","hosts":["Bill Overend"],"x":59,"y":383},{"a":"575 N Harris St","h":"Cobbham","hosts":["Bob Allen"],"x":570,"y":166},{"a":"160 Park Ave","h":"Buena Vista Heights","hosts":["Breanna Teague"],"x":-319,"y":-306},{"a":"394 Dubose Ave","h":"Boulevard","hosts":["Bryson Greenwood"],"x":212,"y":-208},{"a":"145 Grady Ave","h":"Boulevard","hosts":["Cameron Norton, Stage 1","Cameron Norton, Stage 2"],"x":686,"y":-99},{"a":"137 Oglethorpe Ave","h":"Normaltown","hosts":["Claire Henry"],"x":-643,"y":-153},{"a":"635 Pulaski St","h":"Pulaski Heights","hosts":["Dave Lawson","Jillian Grant"],"x":1258,"y":-286},{"a":"258 Lyndon Ave","h":"Boulevard","hosts":["durwood pepper and Jim Taflinger"],"x":399,"y":-212},{"a":"120 Lenoir Ave","h":"Buena Vista Heights","hosts":["Eadaoin Walsh"],"x":-152,"y":-333},{"a":"310 Clover St","h":"Normaltown","hosts":["Eric & Valerie Herzig"],"x":-1542,"y":264},{"a":"762 Barber Street","h":"Newtown","hosts":["Erin Johnson"],"x":715,"y":-969},{"a":"589 Meigs St","h":"Cobbham","hosts":["Finley freeman"],"x":655,"y":378},{"a":"268 W Dougherty Street","h":"Pulaski Heights","hosts":["First Christian Church Athens"],"x":1346,"y":203},{"a":"239 N Finley St","h":"Reese Hancock","hosts":["Georgia Hartley"],"x":1080,"y":463},{"a":"445 N Milledge Avenue","h":"Cobbham","hosts":["Greg Ducote"],"x":490,"y":359},{"a":"230 Augusta Ave","h":"Newtown","hosts":["Joe Ornstein, Stage 1","Joe Ornstein, Stage 2"],"x":1035,"y":-819},{"a":"153 Boulevard Hts","h":"Buena Vista Heights","hosts":["John Holdridge and Ruth Harman"],"x":-810,"y":-488},{"a":"285 Barber","h":"Boulevard","hosts":["Katie Jarrell"],"x":896,"y":-318},{"a":"170 Lakeview St","h":"Buena Vista Heights","hosts":["kristine kishida"],"x":-235,"y":-647},{"a":"327 Prince Ave","h":"Cobbham","hosts":["Labels Resale Boutique"],"x":1052,"y":175},{"a":"564 Boulevard","h":"Boulevard","hosts":["Lance Porter"],"x":366,"y":-427},{"a":"731 Pulaski Street","h":"Pulaski Heights","hosts":["Lisbeth Wells-Pratt"],"x":1250,"y":-568},{"a":"412 Holman Ave","h":"Normaltown","hosts":["Michael Brewer"],"x":-1231,"y":499},{"a":"179 Virginia Ave","h":"Boulevard","hosts":["Michael Wegner"],"x":584,"y":-171},{"a":"425 Barber Street","h":"Boulevard","hosts":["Normaltown Brewing Co."],"x":823,"y":-550},{"a":"197 Childs St","h":"Pulaski Heights","hosts":["Patrick and Stacey Kubis"],"x":1101,"y":-154},{"a":"553 N Chase St","h":"Cobbham","hosts":["Sarah Mosseri & Noah Archambault"],"x":206,"y":299},{"a":"180 Cleveland Avenue","h":"Newtown","hosts":["Southern Star Studio"],"x":1271,"y":-706},{"a":"255 Holman Ave","h":"Normaltown","hosts":["Stella Turner"],"x":-1020,"y":716},{"a":"175 Tracy St","h":"Newtown","hosts":["Sunroof Coffee","Nighthawks Lounge"],"x":634,"y":-852},{"a":"130 Willow Run","h":"Normaltown","hosts":["Sydney James"],"x":-754,"y":501},{"a":"270 Nacoochee Avenue","h":"Boulevard","hosts":["Tanya Hudson"],"x":-29,"y":-421},{"a":"244 Nacoochee Ave","h":"Boulevard","hosts":["Addison Sanders"],"x":-33,"y":-387},{"a":"675 Pulaski St","h":"Pulaski Heights","hosts":["ATHICA Leathers Building, Stage 1","Revolution Therapy and Yoga (owned by Kate Morrissey Stahl)"],"x":1255,"y":-400},{"a":"473 Atlanta Ave","h":"Newtown","hosts":["Ben McCoy"],"x":1129,"y":-806},{"a":"150 Virginia Ave","h":"Boulevard","hosts":["Bonnie Feagle"],"x":591,"y":-316},{"a":"179 Hiawassee Ave","h":"Buena Vista Heights","hosts":["Brad Stowe","Bradley Stowe"],"x":-185,"y":-379},{"a":"340 Willow Run","h":"Normaltown","hosts":["Caitlin Mertzlufft"],"x":-982,"y":71},{"a":"425 Cleveland Ave","h":"Newtown","hosts":["Christian Haygood"],"x":999,"y":-614},{"a":"770 Barber Street","h":"Newtown","hosts":["Courtney Osterhage"],"x":710,"y":-997},{"a":"123 Chattooga Ave","h":"Boulevard","hosts":["emileigh ireland"],"x":156,"y":-723},{"a":"150 Easy St","h":"Buena Vista Heights","hosts":["Emily Chalfin"],"x":-404,"y":-357},{"a":"100 Prince Ave","h":"Pulaski Heights","hosts":["Farm Burger Athens, Stage 1","Farm Burger Athens, Stage 2"],"x":1233,"y":195},{"a":"232 Glenhaven Ave","h":"Reese Hancock","hosts":["Front Porch"],"x":-53,"y":674},{"a":"549 Sunset Dr","h":"Normaltown","hosts":["Gillian Slee"],"x":-1395,"y":311},{"a":"149 Tibbets Avenue","h":"Buena Vista Heights","hosts":["Good Shepherd Backyard"],"x":-119,"y":-528},{"a":"1022 Prince Avenue","h":"Boulevard","hosts":["Hall Booth Smith. P.C. (Contact - Emma Grace Jarvis)"],"x":108,"y":-14},{"a":"405 Buena Vista Ave","h":"Buena Vista Heights","hosts":["Hardin"],"x":-576,"y":-686},{"a":"601 W Hancock","h":"Reese Hancock","hosts":["Harrison McMahan"],"x":923,"y":436},{"a":"147 Oglethorpe Avenue","h":"Normaltown","hosts":["Hazel Altizer"],"x":-651,"y":-143},{"a":"152 Hendrix Ave","h":"Pulaski Heights","hosts":["Jen and Tony Ventry"],"x":1080,"y":-384},{"a":"143 Barrow St","h":"Pulaski Heights","hosts":["Jessica Rothacker"],"x":1200,"y":-194},{"a":"357 Lyndon Avenue","h":"Boulevard","hosts":["John and Linda Lee"],"x":398,"y":-289},{"a":"120 Westover Dr","h":"Normaltown","hosts":["Jonathan Vance"],"x":-822,"y":665},{"a":"863 N Chase Street","h":"Boulevard","hosts":["Josh Podvin"],"x":205,"y":-526},{"a":"649 Cobb Street","h":"Cobbham","hosts":["Julie Luft"],"x":48,"y":258},{"a":"735 Prince Avenue","h":"Cobbham","hosts":["Kemp Jones"],"x":503,"y":75},{"a":"590 Nantahala Avenue","h":"Boulevard","hosts":["Kristi Kinlaw"],"x":10,"y":-610},{"a":"535 Prince Ave","h":"Cobbham","hosts":["Lacey Hartley"],"x":782,"y":128},{"a":"320 Augusta Ave","h":"Newtown","hosts":["Lillie Evan Young"],"x":1002,"y":-931},{"a":"620 Meigs Street","h":"Cobbham","hosts":["Madison Baxter"],"x":605,"y":380},{"a":"175 Hillcrest Ave","h":"Cobbham","hosts":["Maggie Taylor"],"x":-91,"y":321},{"a":"1280 Prince Avenue","h":"Buena Vista Heights","hosts":["Marti’s at Midday"],"x":-461,"y":-125},{"a":"357 Dubose Ave","h":"Boulevard","hosts":["mary hallam Pearse"],"x":312,"y":-176},{"a":"163 Nantahala Ave","h":"Boulevard","hosts":["Matthew Davis, Stage 1","Matthew Davis, Stage 2","Matthew Davis, Stage 3"],"x":725,"y":-515},{"a":"140 Lakeview St","h":"Buena Vista Heights","hosts":["Peggy Dahl-Bartunek"],"x":-233,"y":-667},{"a":"120 Holman Avenue","h":"Normaltown","hosts":["Penelope Hughes"],"x":-759,"y":887},{"a":"160 Tracy St","h":"Newtown","hosts":["Pink Goblin Tattoo & Piercing"],"x":580,"y":-842},{"a":"370 Talmage Drive","h":"Normaltown","hosts":["Ronny Just"],"x":-605,"y":459},{"a":"375 Dubose Ave","h":"Boulevard","hosts":["Stella Turner"],"x":290,"y":-180},{"a":"762 Pulaski St","h":"Pulaski Heights","hosts":["steve thuot"],"x":1262,"y":-628},{"a":"334 Prince Avenue","h":"Pulaski Heights","hosts":["Taqueria Del Sol"],"x":1049,"y":162},{"a":"396 Holman Ave","h":"Normaltown","hosts":["The Day Family"],"x":-1220,"y":527},{"a":"801 N Pope St","h":"Boulevard","hosts":["Toby Fuller"],"x":847,"y":-32},{"a":"625 Barber St","h":"Newtown","hosts":["Tonique Bottle Co."],"x":767,"y":-730},{"a":"255 Boulevard Heights","h":"Buena Vista Heights","hosts":["Tracy Vance"],"x":-730,"y":-583},{"a":"115 Grady Avenue","h":"Boulevard","hosts":["Vivi Guerra"],"x":663,"y":34},{"a":"390 Glenhaven Ave","h":"Reese Hancock","hosts":["Winfrey Mutual"],"x":-269,"y":981},{"a":"1130 Boulevard","h":"Buena Vista Heights","hosts":["Alan Bowden"],"x":-492,"y":-524},{"a":"526 Pulaski Street","h":"Pulaski Heights","hosts":["Amy Pridgen and Charles Greenleaf"],"x":1272,"y":-63},{"a":"140 Westover Drive","h":"Normaltown","hosts":["Ashley Harrison"],"x":-871,"y":605},{"a":"147 Bryan St","h":"Boulevard","hosts":["Athens coffee holding and roasting"],"x":165,"y":-879},{"a":"108 Park Ave","h":"Buena Vista Heights","hosts":["Athentic Brewing Company"],"x":-283,"y":-92},{"a":"166 Hart Ave","h":"Normaltown","hosts":["Brittney Dix"],"x":-675,"y":835},{"a":"123 Cain St","h":"Boulevard","hosts":["Cameron Strange"],"x":378,"y":-315},{"a":"110 Easy Street","h":"Buena Vista Heights","hosts":["Craig Landry"],"x":-350,"y":-349},{"a":"234 Hill St","h":"Cobbham","hosts":["Cullen Timmons"],"x":808,"y":190},{"a":"634 Prince Avenue","h":"Boulevard","hosts":["Dan Roberts"],"x":631,"y":88},{"a":"169 Virginia Ave","h":"Boulevard","hosts":["Didi Dunphy"],"x":588,"y":-199},{"a":"341 Holman Ave","h":"Normaltown","hosts":["Emma Baughn, Stage 1","Emma Baughn, Stage 2"],"x":-1165,"y":614},{"a":"685 N Pope St","h":"Boulevard","hosts":["Emmanuel Stone"],"x":867,"y":48},{"a":"824 Hill Street","h":"Cobbham","hosts":["Gaby Covington"],"x":76,"y":383},{"a":"890 Boulevard Avenue","h":"Buena Vista Heights","hosts":["Good Shepherd Presbyterian Church Stage 1","Good Shepherd Presbyterian Church Stage 2"],"x":-149,"y":-485},{"a":"626 Cobb Street","h":"Cobbham","hosts":["Gwen OLooney"],"x":86,"y":250},{"a":"193 Cleveland Ave","h":"Newtown","hosts":["Hunter Hoskins"],"x":1267,"y":-692},{"a":"650 Meigs Street","h":"Cobbham","hosts":["Jack Gill"],"x":571,"y":390},{"a":"125 Nantahala Avenue","h":"Boulevard","hosts":["Jeani Wooten"],"x":794,"y":-506},{"a":"480 Nacoochee Ave","h":"Boulevard","hosts":["Joe Kubler"],"x":4,"y":-703},{"a":"270 Yonah Ave","h":"Buena Vista Heights","hosts":["JP Schmidt"],"x":-627,"y":-405},{"a":"628 Boulevard","h":"Boulevard","hosts":["Justin Widener"],"x":294,"y":-434},{"a":"776 Barber Street","h":"Newtown","hosts":["Maureen Brown"],"x":706,"y":-1018},{"a":"267 Franklin Street","h":"Reese Hancock","hosts":["Michael & Sid Jacobs"],"x":396,"y":495},{"a":"737 Nantahala Avenue","h":"Buena Vista Heights","hosts":["Peggy Brickman"],"x":-175,"y":-622},{"a":"460 Sunset Dr","h":"Normaltown","hosts":["Peter Norris"],"x":-1365,"y":480},{"a":"156 Boulevard","h":"Boulevard","hosts":["Rachel Kachur"],"x":809,"y":-374},{"a":"585 Nantahala Ave","h":"Boulevard","hosts":["Rhett Crowe"],"x":22,"y":-596},{"a":"215 Sunset Dr","h":"Normaltown","hosts":["Samantha Eskew"],"x":-1027,"y":858},{"a":"274 N Rocksprings Street","h":"Reese Hancock","hosts":["Sunshine Real Estate"],"x":73,"y":716},{"a":"297 Prince Ave","h":"Cobbham","hosts":["Tapped Athens"],"x":1080,"y":180},{"a":"169 Grady Avenue","h":"Boulevard","hosts":["Thomas Leonard"],"x":709,"y":-219},{"a":"585 Barber St","h":"Newtown","hosts":["TREEHOUSE kid and craft","Dead Beat Club"],"x":781,"y":-682},{"a":"240 Dubose Ave","h":"Boulevard","hosts":["Aaron Thompson"],"x":498,"y":-147},{"a":"150 Hart Ave","h":"Normaltown","hosts":["Adam Lowe and Tracy Moore"],"x":-651,"y":838},{"a":"140 Pulaski Hts","h":"Pulaski Heights","hosts":["Allan Aycock & Jen Cole"],"x":1199,"y":-334},{"a":"490 Cobb St","h":"Cobbham","hosts":["Anna McArthur"],"x":210,"y":228},{"a":"596 Holman Avenue","h":"Normaltown","hosts":["Ashlea Lane, Stage 1","Ashlea Lane, Stage 2"],"x":-1268,"y":220},{"a":"186 Boulevard","h":"Boulevard","hosts":["Ashley Carney"],"x":768,"y":-379},{"a":"520 Pineneedle Rd","h":"Normaltown","hosts":["Becky Hammock"],"x":-949,"y":360},{"a":"328 Sunset Dr","h":"Normaltown","hosts":["Blair Erickson"],"x":-1233,"y":727},{"a":"530 King Avenue","h":"Normaltown","hosts":["Brad Smith"],"x":-641,"y":773},{"a":"220 Normal Ave","h":"Normaltown","hosts":["Brin VandenBerg"],"x":-838,"y":54},{"a":"355 Oneta St","h":"Buena Vista Heights","hosts":["Buck Bacon"],"x":314,"y":-992},{"a":"386 N Milledge Avenue","h":"Cobbham","hosts":["Classic City Church"],"x":523,"y":432},{"a":"695 Prince Avenue","h":"Cobbham","hosts":["Cobbham Triangle Park"],"x":562,"y":87},{"a":"149 Virginia Avenue","h":"Boulevard","hosts":["Deirdre and Chris Sugiuchi, Stage 2","Deirdre and Chris Sugiuchi, Stage 1"],"x":596,"y":-255},{"a":"754 N Chase Street","h":"Boulevard","hosts":["Fever Dream (Maggie Lamb)"],"x":191,"y":-270},{"a":"744 Barber Street","h":"Newtown","hosts":["Jack Lagrone"],"x":727,"y":-905},{"a":"889 Hill St","h":"Cobbham","hosts":["Jason Cade"],"x":-25,"y":413},{"a":"594 Hill St","h":"Cobbham","hosts":["Jen Wardlaw"],"x":363,"y":318},{"a":"175 Grady Ave","h":"Boulevard","hosts":["Kelly Crowe"],"x":715,"y":-250},{"a":"562 Pulaski St","h":"Pulaski Heights","hosts":["Kelly Girtz"],"x":1272,"y":-141},{"a":"225 King Ave","h":"Normaltown","hosts":["Landon Moss"],"x":-286,"y":247},{"a":"295 Hill Street","h":"Cobbham","hosts":["Liz DeMarco"],"x":738,"y":223},{"a":"860 N Chase St","h":"Boulevard","hosts":["Mack Bosworth"],"x":217,"y":-522},{"a":"1160 Boulevard","h":"Buena Vista Heights","hosts":["Mark / McKnight Family"],"x":-534,"y":-530},{"a":"1190 Prince Ave","h":"Buena Vista Heights","hosts":["Michael Wegner"],"x":-263,"y":-51},{"a":"690 Edwards Dr","h":"Normaltown","hosts":["Pekka Honkanen and Carolina Fernandez Lamadrid"],"x":-1546,"y":232},{"a":"190 Stevens Street","h":"Pulaski Heights","hosts":["Peter James McCarron"],"x":808,"y":-829},{"a":"537 Oglethorpe","h":"Normaltown","hosts":["Sarah Frazer"],"x":-1210,"y":-54},{"a":"494 Boulevard","h":"Boulevard","hosts":["Sean Hogan"],"x":417,"y":-423},{"a":"326 Glenhaven Ave","h":"Reese Hancock","hosts":["Sean Murphy"],"x":-183,"y":853},{"a":"360 N Church Street","h":"Cobbham","hosts":["Shannon Lee"],"x":779,"y":390},{"a":"174 Cleveland Avenue","h":"Newtown","hosts":["TinyATH Gallery, Stage 1","TinyATH Gallery, Stage 2"],"x":1274,"y":-707},{"a":"329 Lyndon Ave","h":"Boulevard","hosts":["TJ & Robi Ragan, Stage 1","TJ & Robi Ragan, Stage 2"],"x":395,"y":-271},{"a":"1368 Prince Avenue","h":"Buena Vista Heights","hosts":["William M Overend Esq."],"x":-579,"y":-186},{"a":"1143 Prince Avenue","h":"Cobbham","hosts":["Norris Peacock Injury Law"],"x":-93,"y":-22},{"a":"493 Yonah Ave","h":"Buena Vista Heights","hosts":["Amanda Dzimianski"],"x":-865,"y":-583},{"a":"235 Hodgson Dr","h":"Normaltown","hosts":["Amanda Walls"],"x":-431,"y":891},{"a":"355 N Pope St","h":"Cobbham","hosts":["Camryn Lacey"],"x":902,"y":362},{"a":"115 Willow Run","h":"Normaltown","hosts":["Christopher Hassiotis"],"x":-731,"y":549},{"a":"229 Barber Street","h":"Boulevard","hosts":["Christy O'Reilly"],"x":936,"y":-189},{"a":"295 Hiawassee Ave","h":"Buena Vista Heights","hosts":["Dawn Skinner"],"x":-159,"y":-615},{"a":"426 N Billups St","h":"Reese Hancock","hosts":["Dianna and Davide Violini"],"x":161,"y":561},{"a":"555 Willow St","h":"Newtown","hosts":["Emre Downey"],"x":1547,"y":-673},{"a":"143 Bryan St","h":"Boulevard","hosts":["Happy Top"],"x":171,"y":-882},{"a":"360 Dubose Avenue","h":"Boulevard","hosts":["Jeff Fallis"],"x":300,"y":-191},{"a":"165 Hendrix Ave","h":"Pulaski Heights","hosts":["Julia Slatcher"],"x":1097,"y":-372},{"a":"850 Boulevard","h":"Buena Vista Heights","hosts":["Karen Payne"],"x":-99,"y":-479},{"a":"277 Hill St","h":"Cobbham","hosts":["Karla & Joseph Pruitt"],"x":760,"y":217},{"a":"247 Prince Avenue","h":"Cobbham","hosts":["Kenny nguyen"],"x":1111,"y":186},{"a":"338 Satula Ave","h":"Buena Vista Heights","hosts":["Kristen and Ed Morales"],"x":-458,"y":-420},{"a":"530 Pulaski St","h":"Pulaski Heights","hosts":["Lee Smith"],"x":1272,"y":-72},{"a":"609 Cobb St","h":"Cobbham","hosts":["Lewis Earnest"],"x":114,"y":265},{"a":"170 Windsor Court","h":"Normaltown","hosts":["Maci Foster"],"x":-239,"y":484},{"a":"173 Augusta Ave","h":"Newtown","hosts":["Maxwell Mahieu"],"x":1046,"y":-736},{"a":"440 Athens Avenue","h":"Newtown","hosts":["Michael Fusaro"],"x":1057,"y":-919},{"a":"690 W Hancock Ave","h":"Reese Hancock","hosts":["Olivia Roth"],"x":810,"y":456},{"a":"919 N Chase St","h":"Boulevard","hosts":["R&R Secret Flowers"],"x":213,"y":-614},{"a":"194 Childs Street","h":"Pulaski Heights","hosts":["Sam James"],"x":1113,"y":-146},{"a":"712 Cobb Street","h":"Cobbham","hosts":["Stacie Carson"],"x":-46,"y":194},{"a":"235 Normal Ave","h":"Normaltown","hosts":["Ann and John Dye"],"x":-820,"y":121},{"a":"350 Dubose Ave","h":"Boulevard","hosts":["Cassie Myers"],"x":313,"y":-189},{"a":"163 Park Ave","h":"Buena Vista Heights","hosts":["Christy Bush"],"x":-336,"y":-329},{"a":"146 Savannah Ave","h":"Newtown","hosts":["Dusty Gannon"],"x":937,"y":-669},{"a":"530 Hillcrest Ave","h":"Normaltown","hosts":["Elizabeth Marston"],"x":-270,"y":534},{"a":"341 Boulevard","h":"Boulevard","hosts":["Eric George"],"x":563,"y":-395},{"a":"825 Hill St","h":"Cobbham","hosts":["Erica Gilbertson"],"x":77,"y":396},{"a":"418 N Chase St","h":"Reese Hancock","hosts":["Frannie McClester"],"x":264,"y":459},{"a":"489 Prince Avenue","h":"Cobbham","hosts":["Historic Athens Fire Hall No. 2"],"x":879,"y":146},{"a":"554 Boulevard","h":"Boulevard","hosts":["Jane McPherson & Jon Jefferson"],"x":373,"y":-426},{"a":"630 Talmadge Dr","h":"Normaltown","hosts":["John Bourgeois"],"x":-778,"y":771},{"a":"230 Barrow Street","h":"Pulaski Heights","hosts":["Katelyn Porter"],"x":1059,"y":-157},{"a":"125 Boulevard","h":"Boulevard","hosts":["Leo Fioresi"],"x":850,"y":-356},{"a":"255 Indale Ave","h":"Reese Hancock","hosts":["Madison Hall"],"x":-54,"y":575},{"a":"253 Cobb St","h":"Cobbham","hosts":["Russ Hicks"],"x":506,"y":157},{"a":"406 Sunset Dr","h":"Normaltown","hosts":["Sybil Smith"],"x":-1334,"y":585},{"a":"180 Westover Drive","h":"Normaltown","hosts":["Trish Barefield"],"x":-969,"y":485},{"a":"650 Pulaski St","h":"Pulaski Heights","hosts":["Stan Mullins"],"x":1269,"y":-361}],"acts":[{"p":0,"t":1,"n":"Shaw Coggin","g":"Rock","d":"","m":"https://open.spotify.com/artist/6zsW9b3ldHP9T6eJ3Oxzfa?si=DjjRO7LlRT2AV9ok6WBLcQ","v":"https://venmo.com/u/shawcoggin","host":"Adam"},{"p":1,"t":1,"n":"Parking Garage","g":"Rock","d":"Alternative in the sense that every song seems to alternate to a different genre with a rock lens: emo, jazz, slowcore, punk, bedroom pop, ska, and many more.","m":"https://open.spotify.com/artist/1gHk84U3DysSY6GSBPLpFb","v":"https://venmo.com/u/theparkinggarageband","host":"Alex Nichols","r":"Relatively new ska-ish indie rock group here in Athens. Don’t know too much about them, but liked what I heard and saw on Instagram, and looks to be a good high energy show to kick off anyone’s Porchfest."},{"p":2,"t":1,"n":"Beau Anderson","g":"Rock","d":"We’re an alt/indie rock band that puts on an unforgettable show.","m":"https://beauanderson.fanlink.tv/soundtrackoflettinggo?utm_source=ig&utm_medium=social&utm_content=link_in_bio&fbclid=PAdGRleATZ1vJwZG9mAmV4dG4DYWVtAjExAHNydGMGYXBwX2lkDzEyNDAyNDU3NDI4NzQxNAABp9dk57HfGp2O06c8Bscf9OuSrWUBcv5t4C5Vd9FuQx4InWOhVPlcL1mAyMeH_aem_EjwOjZFIhDne4DUOX9XHMQ","v":"","host":"Alexandra Larsen"},{"p":3,"t":1,"n":"Rusted Radio","g":"Rock","d":"Radio Hits from the 1970s-2000s","m":"","v":"","host":"Alison & Dan Miller"},{"p":4,"t":1,"n":"Camp Amped After School Fall 2026","g":"Rock","d":"We will our usual 4 bands from our fall after school camp. They will each play for approximately 10 minutes. It would be great if we could kick things off again like we did a couple of years ago on Bertis Downs' porch. Thank you for this great event and for giving our kids a cool performance opportunity!","m":"","v":"","host":"Ben Mize, Stage 2"},{"p":5,"t":1,"n":"Backroad Riot","g":"Rock","d":"Rock, country, classic rock, 2000’s","m":"","v":"","host":"Bill Overend"},{"p":6,"t":1,"n":"The Original Screw Tops","g":"Rock","d":"Original Blues and Rock","m":"https://on.soundcloud.com/vYpRjQQn0xIctwvFjv","v":"","host":"Bob Allen"},{"p":7,"t":1,"n":"Sensai Shifty","g":"Acoustic/singer-songwriter","d":"I’m new to this, first time playing on my own with one extra person maybe. Music is rocky, bouncy and hard to describe. Def a mix of 70s to 90s influences (white stripes esque)","m":"","v":"","host":"Breanna Teague"},{"p":8,"t":1,"n":"Comer String Collective","g":"Folk","d":"Playing that old-time string music","m":"https://instagram.com/csc_ga","v":"https://venmo.com/Michael-McWilliams-8","host":"Bryson Greenwood","r":"As the name suggests, a fantastic collective of musicians from Comer, Ga playing Old-time string music and bluegrass. Always put on a great show and the nicest people."},{"p":9,"t":1,"n":"Cam Norton","g":"Acoustic/singer-songwriter","d":"Solo acoustic songwriter with looping pedal goodness","m":"https://www.allmylinks.com/camnortonmusic","v":"https://venmo.com/camnortonmusic","host":"Cameron Norton, Stage 1"},{"p":10,"t":1,"n":"Folie à Cinq","g":"Other","d":"We play French chansons, folk, pop, and jazz from the 1930s to today.)","m":"https://youtu.be/Z5ObjCQjP8A?si=Lto3_6Z26fqKdTxU","v":"","host":"Claire Henry","vt":"Lavon Smith@Lavon-Smith-24272","r":"Local musical group that plays French chasons and plays 20s/30s inspired folk jazz music. From what I've seen in live footage and band photos, it looks like Dan Horowitz from Five-Eight is in the full band iteration of the group."},{"p":11,"t":1,"n":"Crown’s Court","g":"Indie","d":"We play music between indie and rock. We have a drummer, bassist, lead guitarist, and a keyboard player that also switches to guitar for some songs.","m":"https://youtu.be/fyIxEPTclPo?is=VdI_Hv9bSYzybunX","v":"https://www.instagram.com/crowns.court","host":"Dave Lawson"},{"p":12,"t":1,"n":"Carbon Harry","g":"Indie","d":"The next wave of rock greatness!","m":"https://www.carbonharry.com","v":"","host":"durwood pepper and Jim Taflinger"},{"p":13,"t":1,"n":"Aermotor","g":"Rock","d":"Guitar driven all original modern rock","m":"https://soundcloud.com/ken-dover?utm_source=clipboard&utm_medium=text&utm_campaign=social_sharing","v":"https://venmo.com/code?user_id=4064218668074509169&created=1776083257","host":"Eadaoin Walsh"},{"p":14,"t":1,"n":"Mayberry Wine","g":"Indie","d":"Lounge-core Americana Indie Folk for the playful at heart","m":"https://mayberrywine.com/","v":"","host":"Eric & Valerie Herzig"},{"p":15,"t":1,"n":"Sarah & Friends","g":"Acoustic/singer-songwriter","d":"We like to do a variety of different things, some more acoustic, some more full band electric. This would be our 4th year doing this and we have loved it so!","m":"","v":"","host":"Erin Johnson"},{"p":16,"t":1,"n":"Fawney Rig","g":"Folk","d":"Hard edged Irish folk rock is a good short description","m":"https://www.youtube.com/@FawneyRig/videos","v":"","host":"Finley freeman","r":"Athens' own classic Irish folk group featuring members from Beat Up and Hope for Agoldensummer. They play a lot in town and typically have an open Irish session at Normal Bar most months."},{"p":17,"t":1,"n":"Andy Browne Official","g":"Acoustic/singer-songwriter","d":"","m":"https://andybrowneofficial.com/","v":"","host":"First Christian Church Athens"},{"p":18,"t":1,"n":"Los Cantares","g":"Rock","d":"Los Cantares is fronted by longtime Athens musician Jim Wilson of TaxiCab Verses and drummer for the band Pilgrim. Los Cantares had a wonderful time performing last year!","m":"https://loscantares.bandcamp.com/album/sun-snake-artist-revolution","v":"https://venmo.com/code?user_id=2512780070486016827","host":"Georgia Hartley","r":"Local desert rock outfit by Athens mainstay Jim Wilson. If you know Jim, you know how good and fun any project he fronts will be. The folks in those two new student housing high-rises next door will have a great show to hear from their apartments."},{"p":19,"t":1,"n":"Backyard Loveseat","g":"Rock","d":"Southern Rock covers","m":"https://www.facebook.com/BackyardLoveseat/","v":"","host":"Greg Ducote"},{"p":20,"t":1,"n":"Sewercat","g":"Rock","d":"Appalachian Alternative","m":"https://www.instagram.com/sewercatband/","v":"","host":"Joe Ornstein, Stage 1"},{"p":21,"t":1,"n":"KoTToN","g":"Rock","d":"Rock, indie, blues","m":"","v":"","host":"John Holdridge and Ruth Harman"},{"p":22,"t":1,"n":"Ellie Jarrell and Band","g":"Indie","d":"","m":"https://elliejarrellmusic.com/","v":"https://www.instagram.com/elliejarrellmusic/?hl=en","host":"Katie Jarrell"},{"p":23,"t":1,"n":"Frisson","g":"Metal/punk","d":"post metal","m":"https://frissonincorporated.bandcamp.com","v":"https://venmo.com/u/Devon-George-9","host":"kristine kishida","r":"Very awesome Post Metal/Atmospheric Sludge Metal band from Atlanta/Athens. Will be playing a Shadebeast show at Flicker next month if you miss them at Porchfest."},{"p":24,"t":1,"n":"Air and or Fire","g":"Acoustic/singer-songwriter","d":"Singer-songwriter, but also incorporating electronic elements","m":"https://distrokid.com/hyperfollow/airandorfire/bitterness-for-three-sleepwalkers?afsrc=1&irclickid=QVbRkO2UuxyZUUDSa80Eqzj8Ukuz-lRcrRDIws0&irgwc=1&irpid=27795&sharedid=&utm_campaign=27795&utm_medium=affiliate&utm_source=impact","v":"","host":"Labels Resale Boutique"},{"p":25,"t":1,"n":"The Rishis","g":"Indie","d":"Folk rock","m":"https://open.spotify.com/artist/1I3q0VFPTAwdTTSn4W4mpB?si=9Qo7L-cORCayJUcmFklaVA","v":"","host":"Lance Porter","r":"I've been told this is going to be a full-band set. This Elephant 6 affiliated group always put on a fantastic and mesmerizing performance. For those who want to see a comfortably heady and vibed out psych folk show."},{"p":26,"t":1,"n":"French Exit","g":"Indie","d":"Elephant 6","m":"https://youtube.com/@raulspaulding?si=4BUlBxrhyK3GpmrG","v":"https://venmo.com/u/ajgriffin","host":"Lisbeth Wells-Pratt","r":"French Exit is the musical project of Elephant 6 musician and member of Olivia Tremor Control and Circulatory System, AJ Griffin. His 2015 record \"Jerk Store\" is an underrated gem in the Elephant 6 catalog. This show will more than likely be a solo set by AJ Griffin with piano and guitar, but will be great in it's own right."},{"p":27,"t":1,"n":"NMC","g":"Rock","d":"","m":"","v":"","host":"Michael Brewer"},{"p":28,"t":1,"n":"Whisper Kiss","g":"Acoustic/singer-songwriter","d":"","m":"https://open.spotify.com/artist/6MlAi2N76GGNF03k0LSd4c?bid=802&rfr=igr","v":"","host":"Michael Wegner"},{"p":29,"t":1,"n":"No Yonder","g":"Rock","d":"","m":"https://open.spotify.com/artist/5OeFGVk4QKIRVxbd8YBJGs?si=3wAzipJTQCiOaINTTCiECQ&dl_branch=1&nd=1&utm_medium=organic&product=open&%24full_url=https%3A%2F%2Fopen.spotify.com%2Fartist%2F5OeFGVk4QKIRVxbd8YBJGs%3Fsi%3D3wAzipJTQCiOaINTTCiECQ%26dl_branch%3D1&feature=organic&_branch_match_id=1460419082076671989&_branch_referrer=H4sIAAAAAAAAA8WOzQrCMBCEnyYeW2yriFBEqxUVlEopeCppmtqlMQmbFH8OPrup4DMIe5jZnY%2FZ1lpt5r5vtLLQPD2qtSdAdv5Co6p7ZmOluRyRIGp6IcoeRdwOCAmXJEjdDGfvRzN1cyuKFox1YnLi6bboouywOxePqp5dVvutQ1MDJFyH9%2BUL9D7PEjjR3THPE9gkGQmmtSgrpJK1LjT%2BVlMhKsq6P9Q7L%2BvvHw2ntkceK7xSCWz0Rt5wRJBXF1d3wzFOWlQ3%2FgGRfYKeUwEAAA%3D%3D","v":"","host":"Normaltown Brewing Co.","r":"Don't know too much about this band, but liked what I heard online. Very alt-country/southern inspired indie rock that hails from Atlanta. Should be a good show at Normaltown Brewing."},{"p":30,"t":1,"n":"Great Dane Band","g":"Rock","d":"Drive by Truckers covers. Extended jams on songs like Mary Jane’s Last Dance.","m":"https://www.instagram.com/greatdane_band?igsh=OXNuN2RkN21zZG93","v":"","host":"Patrick and Stacey Kubis"},{"p":31,"t":1,"n":"CHAP","g":"Rock","d":"We're CHAP, and Atlanta based with a sound based mainly on classic blues and rock and roll. We have many original songs and can also pull many well known covers if needed","m":"","v":"","host":"Sarah Mosseri & Noah Archambault"},{"p":32,"t":1,"n":"Hawkproof Nowhere","g":"Folk","d":"","m":"","v":"https://venmo.com/u/Corbin-Baker","host":"Southern Star Studio","r":"The website has the name down as Hawkproof Nowhere. If I think this is what I think it is, this will be a collaborative set by Hawk Proof Rooster and Nowhere Road. I have seen both perform before, so it's going to be another great show to catch for some bluegrass/americana music."},{"p":33,"t":1,"n":"Ryan Beresch","g":"Folk","d":"","m":"https://ryanberesch.bandcamp.com","v":"","host":"Stella Turner"},{"p":34,"t":1,"n":"blanks and postage","g":"Rock","d":"","m":"https://soundcloud.com/lukerushing","v":"","host":"Sunroof Coffee"},{"p":35,"t":1,"n":"John Huckabee's Country Pickin' Shuckin Band","g":"Country","d":"Jam band that sticks around an acoustic bluegrass feel","m":"","v":"","host":"Sydney James"},{"p":36,"t":1,"n":"Fleet Machine","g":"Indie","d":"","m":"https://soundcloud.com/fleet-machine","v":"https://account.venmo.com/u/TanyaHudson","host":"Tanya Hudson"},{"p":37,"t":2,"n":"Nicholas Mallis and the Borealis","g":"Indie","d":"Post Punk - New Wave - Synth Rock","m":"https://open.spotify.com/artist/2KehEvh2FVgICBhesr8Q9L?si=yuoYYwLBTUWdr4ZsKYz5Ww","v":"","host":"Addison Sanders","vt":"Venmo - @Disaster-Productions","r":"Some of the best dance/psych pop, if not the best, you're gonna see here in Athens. Always a top level performance by Nicholas and his band, and is typically everybody's new favorite band when they see them for the first time."},{"p":38,"t":2,"n":"Orcus","g":"Electronic/experimental","d":"Drone, Avant Garde, Neo-Classical, Noise, Improvisation","m":"https://hookervision.bandcamp.com/album/live-in-athens-ga-04-25-2026","v":"","host":"ATHICA Leathers Building, Stage 1","r":"Experimental collective group helmed by local experimental artist Rachel Evans, performing with other women who work at the UGA library. Saw them perform at work.shop earlier this year and was blown away. That performance can be found and purchased on Rachel Evans and her husband Grant Evan's record label, Hooker Vision."},{"p":39,"t":2,"n":"Bill DeMarco","g":"Acoustic/singer-songwriter","d":"Recently relocated from Fort Collins Colorado!","m":"https://Reverbnation.com/BillDeMarco","v":"https://ReverbNation.com/BillDeMarco","host":"Ben McCoy"},{"p":40,"t":2,"n":"Women in STEM","g":"Indie","d":"","m":"https://linktr.ee/women_in_stem","v":"https://venmo.com/u/secaspary","host":"Bonnie Feagle"},{"p":41,"t":2,"n":"Futon","g":"Rock","d":"Futon is an alternative rock group that takes inspiration from Alice in Chains, Radiohead, Jeff Buckley, Seether and more. We just love taking inspiration from our favorite artists and genres and combining them into our own unique sound.","m":"https://open.spotify.com/track/2oj1w3PtUM6cRc2nypWbsy?si=QEJwjE49SxWnlqxQtU4KlQ","v":"","host":"Brad Stowe"},{"p":42,"t":2,"n":"Neal Canup","g":"Acoustic/singer-songwriter","d":"","m":"","v":"","host":"Caitlin Mertzlufft"},{"p":43,"t":2,"n":"Two Star Hotel","g":"Rock","d":"Two Star Hotel would probably be called a psych rock or jam band by most folks - but we strive to keep all of our material interesting and fresh, never afraid to explore whatever energy shows up that day!","m":"https://open.spotify.com/album/1ASLWjQSUMySfRa0cHgH4W?si=uIuekSdOQq25nmVFGRGDJw","v":"https://music.apple.com/us/artist/two-star-hotel/1798352009?ls","host":"Christian Haygood"},{"p":44,"t":2,"n":"Kennedy","g":"Rock","d":"Pop/folk rock","m":"https://open.spotify.com/artist/5r8iHf1NgcRujgLfDCOcML","v":"https://venmo.com/u/KennedyPuckett","host":"Courtney Osterhage"},{"p":45,"t":2,"n":"MK Barnes","g":"Acoustic/singer-songwriter","d":"Indie folk/Americana. I have all the equipment (including a PA) for the performance. I enjoyed last year’s performance at Avid Books.","m":"https://mkbarnes.bandcamp.com/","v":"https://mkbarnesmusic.com","host":"emileigh ireland"},{"p":46,"t":2,"n":"The Draft Dodgers","g":"Indie","d":"","m":"","v":"https://account.venmo.com/u/kanemoser","host":"Emily Chalfin"},{"p":47,"t":2,"n":"Jazmin Janay","g":"Other","d":"A mixture of soul, pop and R&B","m":"https://www.instagram.com/jazminjanay?igsh=MXZ0dTB1YWgyNzRicQ%3D%3D&utm_source=qr","v":"","host":"Farm Burger Athens, Stage 1"},{"p":48,"t":2,"n":"The Wuzards","g":"Rock","d":"A trio of time traveling misfits who were once wizards.","m":"https://www.youtube.com/watch?v=ZlWoDECLKRA","v":"","host":"Front Porch"},{"p":49,"t":2,"n":"Mr.WhiteDarealist","g":"Hip-hop/rap","d":"County, rap, r&b, and much more","m":"https://open.spotify.com/artist/209Eu8hmufoOV2sreaHV0v","v":"","host":"Gillian Slee"},{"p":50,"t":2,"n":"Rebecca Sunshine Band","g":"Folk","d":"We play fun, interactive folk-rock for kids! We bring tons of instruments so everyone of all ages can play along and rock out together!","m":"https://open.spotify.com/artist/1BXH5x93EInKRvPSsNtM82","v":"https://venmo.com/u/Rebecca_Sunshine","host":"Good Shepherd Backyard"},{"p":51,"t":2,"n":"SOVP","g":"Rock","d":"We just play what we play and have fun! Our inspirations are bands such as Pavement, Local H, Dinosaur Jr., OSEES, Fugazi, and tons more.","m":"https://linktr.ee/thebandsoup","v":"","host":"Hall Booth Smith. P.C. (Contact - Emma Grace Jarvis)"},{"p":52,"t":2,"n":"Rodent for the Moment","g":"Rock","d":"Early 2000s pop punk covers. Green Day, blink 182 etc.","m":"","v":"","host":"Hardin"},{"p":53,"t":2,"n":"Ohmu","g":"Electronic/experimental","d":"i would do a very fitting classic ambient set for an outdoor show","m":"https://ohmushell.bandcamp.com/album/when-will-our-forever-longing-be-satiated","v":"https://www.instagram.com/ohmumusic/","host":"Harrison McMahan","r":"Solo ambient/drone musical project by local Athenian Winston Parker. Has put on some of the best performances I've ever seen since moving to Athens many years ago. I highly recommend you search out his performance at Cine a few years ago on Youtube. Mind-blowing."},{"p":54,"t":2,"n":"T.Y. And the Outsiders","g":"Rock","d":"We perform a mix of indie, rock, and country in order to pay homage to the groups diverse influences","m":"https://open.spotify.com/artist/1juPqzOM0RzHhTC4tzMQlr?si=4GdEDeOlS1G5BOp5Dkgorw","v":"","host":"Hazel Altizer"},{"p":55,"t":2,"n":"Exchange Blvd","g":"Rock","d":"Post-Punk/Grunge Alternative Rock! We are loud and energetic !","m":"https://tidal.com/artist/53011910/u","v":"","host":"Jen and Tony Ventry"},{"p":56,"t":2,"n":"K9","g":"Metal/punk","d":"Alternative punk rock.","m":"","v":"","host":"Jessica Rothacker"},{"p":57,"t":2,"n":"The Vintage People","g":"Folk","d":"Dick Daniel once referred to the band as folk rock. We are six folks at or over sixty influenced by Bob Dylan, Lucinda Williams, Allman Bros, John Prine and others of our time with a few originals to round out a smooth, meaningful group of songs.","m":"https://photos.app.goo.gl/sojC4BRMYJA9aPvJ9","v":"","host":"John and Linda Lee"},{"p":58,"t":2,"n":"Bomb!","g":"Rock","d":"11-year old singer","m":"https://linktr.ee/Bombband","v":"","host":"Jonathan Vance"},{"p":59,"t":2,"n":"Sutherland","g":"Classical","d":"Guitar Duet","m":"","v":"","host":"Josh Podvin"},{"p":60,"t":2,"n":"Beto Cacao","g":"Acoustic/singer-songwriter","d":"Latinx music","m":"https://betocacao.bandcamp.com/","v":"","host":"Julie Luft","r":"Beto Cacao is a fantastic singer-songwriter and even greater local activist here in Athens that does a lot of great work with the migrant and immigrant community here in town. Cacao always puts on very impassioned shows as he proclaims himself to be a person, \"dedicated to preserving the oral history of the migrant community and Hispanic descendants in the USA.\""},{"p":61,"t":2,"n":"Check The Signs","g":"Pop","d":"retro pop","m":"https://open.spotify.com/artist/6t8DxYvmvgujw6KJiQ867n?si=Bi-TQChaRLOCkBH-xjr8-w&utm_source=copy-link","v":"","host":"Kemp Jones"},{"p":62,"t":2,"n":"News+Paper Music / Mac","g":"Indie","d":"A young band formed at Nuci's Space heavily influenced by the Elephant 6 Collective","m":"","v":"","host":"Kristi Kinlaw"},{"p":63,"t":2,"n":"The Soundhaus Band","g":"Rock","d":"50's 60's 70's","m":"","v":"","host":"Lacey Hartley"},{"p":64,"t":2,"n":"Emma LaPrade","g":"Indie","d":"Indie Rock","m":"https://open.spotify.com/track/5DS4QqRdblTb0oV6ArlyBI?si=APw3IW-PSHOlLEB36ZA0Uw","v":"","host":"Lillie Evan Young"},{"p":65,"t":2,"n":"Stephanie Herty Hughes","g":"Acoustic/singer-songwriter","d":"","m":"https://www.youtube.com/watch?v=634lcK2g1U8&t=961s","v":"","host":"Madison Baxter"},{"p":66,"t":2,"n":"War on Sleep","g":"Indie","d":"War on Sleep is the latest project from seasoned songwriter Eric Michaels. His musical journey began with Paper Thick Walls, an orchestral indie rock band known for its genre-blending sound, drawing comparisons to Wilco and Sufjan Stevens. Their debut album, A Thousand Novels, received critical acclaim and led to a tour of over 50 cities across the US and Canada. The band shared stages with acts like The Lumineers and Dawes and played major festivals including NXNE and CMJ. Eric later founded SAYERS, a Chicago-based band praised for its energetic indie rock sound. Their EP, Diogenes Club, produced by Glen Hansard's lead guitarist, gained local acclaim, with the single \"The Arsonist\" featured on WXRT. War on Sleep blends Michaels' indie rock and folk influences into a unique sound. Featuring Jacques Hebert, Ross Harrell, and Kevin Becker, the band delivers powerful performances and deeply resonant songs, reflecting Eric’s extensive experience in music.","m":"https://open.spotify.com/artist/4l2FIlaqlnZj7SIIxuSclF?si=oCN7SeYkSfquY-baFpJ--w&utm_source=copy-link","v":"","host":"Maggie Taylor"},{"p":67,"t":2,"n":"Maupas","g":"Rock","d":"Soul-Psych Indie Rock","m":"https://open.spotify.com/artist/6OokP8ChwneT3XJRsgndeT?si=s53H6ZGGROKeLC4dPR34uA","v":"https://venmo.com/u/Zeke-Nichols-1","host":"Marti’s at Midday"},{"p":68,"t":2,"n":"Heidi Hensley and Laura Valentine","g":"Acoustic/singer-songwriter","d":"Rockin harmonies- singer songwriter","m":"","v":"","host":"mary hallam Pearse"},{"p":69,"t":2,"n":"It's a Massacre!","g":"Metal/punk","d":"We give an active progressive metal performance that is fun and technically skilled. We love crowd interaction and feature multiple members who work for UGA and live in the Athens area.","m":"https://youtu.be/abm6lcZ1-k4?si=S7UUbjbR8_5j7Byz","v":"https://linktr.ee/itsamassacreband","host":"Matthew Davis, Stage 1"},{"p":70,"t":2,"n":"Peggy Dahl-Bartunek","g":"Jazz","d":"Jazz standards. If we're lucky, Mike Bartunek will fly in from Minneapolis to play sax.","m":"https://www.youtube.com/watch?v=QCXanIiNkVo&t=331s","v":"https://venmo.com/u/Peggy-Dahl-Bartunek","host":"Peggy Dahl-Bartunek"},{"p":71,"t":2,"n":"Planet Keatonia","g":"Other","d":"Experimental","m":"https://planetkeatonia.bandcamp.com/track/experimental-instrumental","v":"","host":"Penelope Hughes"},{"p":72,"t":2,"n":"Crybaby","g":"Rock","d":"","m":"","v":"","host":"Pink Goblin Tattoo & Piercing"},{"p":73,"t":2,"n":"Scarlet Stitch","g":"Rock","d":"NA","m":"https://www.scarlet-stitch.com","v":"","host":"Ronny Just"},{"p":74,"t":2,"n":"Cousin Clem","g":"Rock","d":"","m":"","v":"","host":"Stella Turner","r":"Local Athens group that proclaims to play, \"loud American music\". Haven't seen them before, but watched online a very, very good cover of Cortez the Killer by them at last years Porchfest and have had musician friends of mine sing the praises of bandleader Dylan Lester."},{"p":75,"t":2,"n":"La Suegra GA ska..","g":"Other","d":"Ska music","m":"","v":"","host":"steve thuot","vt":"lasuegraska/facebook.com"},{"p":76,"t":2,"n":"Katie Collins","g":"Other","d":"Pianist, singer songwriter, new album out. “She’s a Tenor”","m":"https://open.spotify.com/album/6VlsLGe7nS4IEjAk93MNeK?si=Z62a5gmWQ9SoVL44KN_DWw","v":"","host":"Taqueria Del Sol"},{"p":77,"t":2,"n":"McKenna Reckless","g":"Acoustic/singer-songwriter","d":"","m":"https://www.instagram.com/mckennareckless","v":"https://account.venmo.com/u/mckenna-reckless","host":"The Day Family"},{"p":78,"t":2,"n":"Leeroy Voodoo","g":"Folk","d":"We blend high-energy bluegrass with a foot-stomping, roots-driven sound, anchored by string instruments and tight vocal harmonies. Our music carries a slightly haunting edge, pairing traditional string band elements with rhythmic drive—fueled by a suitcase kick drum that brings a raw, percussive heartbeat to our live sound—and dynamic energy that keeps audiences engaged from start to finish.","m":"","v":"https://www.instagram.com/leeroyvoodoo","host":"Toby Fuller"},{"p":79,"t":2,"n":"Trevon","g":"Indie","d":"Genre: R&B/Soul","m":"https://tr3von.bandcamp.com/","v":"https://cash.app/$Gradygrad","host":"Tonique Bottle Co."},{"p":80,"t":2,"n":"Tanner Fallin","g":"Indie","d":"Alternative indie songwriter","m":"","v":"https://venmo.com/u/Tanner-Fallin","host":"Tracy Vance"},{"p":81,"t":2,"n":"Larry’s Homework","g":"Rock","d":"","m":"https://www.youtube.com/watch?v=gNX4kzE-pEw&list=RDgNX4kzE-pEw&start_radio=1","v":"","host":"Vivi Guerra"},{"p":82,"t":2,"n":"T I K I C A & The TLC Band","g":"Acoustic/singer-songwriter","d":"R&B","m":"https://www.instagram.com/onetikica","v":"https://cash.app/$onetikica","host":"Winfrey Mutual"},{"p":83,"t":3,"n":"Cactus Jackson","g":"Metal/punk","d":"","m":"https://bandcamp.com/cactusjackson","v":"","host":"Alan Bowden"},{"p":1,"t":3,"n":"Lluvia","g":"Indie","d":"We play various genres such as rock, country, indie and Spanish rock","m":"https://www.instagram.com/ll.uvi4?igsh=MW8xMHd3MWtqbHlvaw%3D%3D&utm_source=qr","v":"","host":"Alex Nichols"},{"p":84,"t":3,"n":"Organically Programmed","g":"Jazz","d":"","m":"https://cloudrecordings.bandcamp.com/album/organically-programmed","v":"https://linktr.ee/organicallyprogrammed?utm_source=linktree_profile_share&ltsid=8bdb0b1b-109d-4213-a4aa-4aeb9e8568de","host":"Amy Pridgen and Charles Greenleaf","r":"Local musical project by Oliver Domingo that sings the praises of 70s space disco and the music of Giorgio Moroder and Yellow Magic Orchestra. Again another perfectly timed set to have a mid-day dance party."},{"p":85,"t":3,"n":"Bank On Famous","g":"Rock","d":"upbeat/loud/riff-rock","m":"https://bankonfamous.bandcamp.com/album/make-break","v":"https://venmo.com/u/Shellmazine","host":"Ashley Harrison"},{"p":86,"t":3,"n":"July Woman","g":"Acoustic/singer-songwriter","d":"","m":"https://www.dropbox.com/scl/fo/nxsbpwqv8lt0wpxiwm3sa/ANvnwldO1ltHDJqwigHPFmk?rlkey=o5sf6y0w7xoni7v6ouc6w2xnx&st=f7br5o33&dl=0","v":"https://venmo.com/u/Emma-Sawyer-9","host":"Athens coffee holding and roasting"},{"p":87,"t":3,"n":"TH3R4","g":"Electronic/experimental","d":"A tasteful mix of Grunge, Industrial, Folk, and Pop music. Thank you for your time <3","m":"https://open.spotify.com/artist/70aiEX21jUDUWINLCeWjma?si=UfuD3FymTpq6AGuN4rqx6A","v":"","host":"Athentic Brewing Company"},{"p":88,"t":3,"n":"MC Horne","g":"Acoustic/singer-songwriter","d":"","m":"","v":"https://venmo.com/u/mchorne5","host":"Brittney Dix"},{"p":89,"t":3,"n":"Skirr","g":"Electronic/experimental","d":"Instrumental, jazzy post-rock","m":"https://skirrband.bandcamp.com/","v":"https://venmo.com/u/davygibbs","host":"Cameron Strange"},{"p":90,"t":3,"n":"Wet Meadows","g":"Indie","d":"Botanical Rock","m":"https://www.facebook.com/wetmeadows/","v":"","host":"Craig Landry","r":"Self-proclaimed \"Botanical rock\" group here in Athens that performs some of the best easy-going soft psych pop in town. Performing on a porch on the most aptly named street for the band."},{"p":91,"t":3,"n":"Libbaloops","g":"Electronic/experimental","d":"","m":"https://libbaloops.com","v":"https://venmo.com/u/libbaloops","host":"Cullen Timmons"},{"p":92,"t":3,"n":"Quintet Athens","g":"Classical","d":"We are a classical quintet, but enjoy exploring the intersections between genres.","m":"https://www.quintetathens.com/","v":"https://venmo.com/code?user_id=3736131342435511143&created=1774882781","host":"Dan Roberts","r":"If you need a reprieve from walking amongst the commoners of Athens, you can seek refuge at the Taylor-Grady House and see our local classical music quintet perform."},{"p":93,"t":3,"n":"Willow Run","g":"Folk","d":"","m":"","v":"","host":"Didi Dunphy"},{"p":94,"t":3,"n":"Tommy Hedgehog","g":"Rock","d":"Rock","m":"https://www.instagram.com/tommyhedgehog/","v":"https://venmo.com/u/Emma-Baughn","host":"Emma Baughn, Stage 1"},{"p":95,"t":3,"n":"Soul Rizing","g":"Indie","d":"Reggae music","m":"https://soulrizingband.com","v":"","host":"Emmanuel Stone"},{"p":96,"t":3,"n":"The Minor 4th","g":"Rock","d":"90's alternative Covers and originals","m":"","v":"","host":"Gaby Covington"},{"p":97,"t":3,"n":"YumboTron","g":"Other","d":"YumboTron plays Psychedelic Cumbia music that is Party Music for Party People.","m":"","v":"","host":"Good Shepherd Presbyterian Church Stage 1","r":"Athens own psychedelic cumbia group featuring members from Pylon Reenactment Society, Organically Programmed, Bichos Vivos, and the Athens Middle East Orchestra. Like the Nicolas Mallis show, will be a dance party and will provide that much needed mid-day energy."},{"p":98,"t":3,"n":"The Discipline","g":"Indie","d":"","m":"","v":"","host":"Gwen OLooney"},{"p":99,"t":3,"n":"Carlton Kell","g":"Folk","d":"","m":"https://open.spotify.com/artist/6WUjFt2GFa2Sou15S57rgV?si=AFGObC_mQla1LrnNYKPtXA","v":"https://venmo.com/u/carltonkell","host":"Hunter Hoskins"},{"p":100,"t":3,"n":"The Milledgemen","g":"Rock","d":"We do a mix of classic rock, indie rock, and country, mostly sticking to hits with some deeper cuts and originals thrown in between.","m":"https://www.instagram.com/themilledgemen?igsi=dzd0cGdtOTczcHE4&utm_source=qr","v":"https://venmo.com/u/treydaniels15","host":"Jack Gill"},{"p":101,"t":3,"n":"Em & the Apostles","g":"Rock","d":"Rock Covers","m":"https://www.youtube.com/watch?v=SWgbDku7BM4&list=RDSWgbDku7BM4&start_radio=1","v":"","host":"Jeani Wooten"},{"p":102,"t":3,"n":"CGI Joe and The Really Romantic Bad Boys","g":"Indie","d":"We play weird rock with a pop-forward attitude.","m":"https://cgijoe.bandcamp.com/","v":"https://venmo.com/u/cgijoe","host":"Joe Kubler","r":"For those who yearn for the yesteryears of Go Bar past, and the wealth spring of experimental pop that it provided, go see Joe K and friends. You probably owe him a dollar, so go see him play at least."},{"p":20,"t":3,"n":"Normalgrass","g":"Other","d":"Bluegrass","m":"","v":"","host":"Joe Ornstein, Stage 2","r":"Couldn't find anything about this group, but the website said they're bluegrass, and I love bluegrass, so I'm putting them down here."},{"p":103,"t":3,"n":"Enginehouse","g":"Folk","d":"","m":"","v":"","host":"JP Schmidt"},{"p":104,"t":3,"n":"38 Strings","g":"Other","d":"Feel-good, family-friendly covers of folk and Americana","m":"http://www.youtube.com/@alicelawrence180","v":"","host":"Justin Widener","r":"A mainstay at the Athens Farmer's Market, 38 Strings is a folk/americana group that does a wide array of great covers and deep cuts."},{"p":26,"t":3,"n":"Predawn Pours","g":"Rock","d":"All original music with influences that span all sorts of periods and styles of rock.","m":"https://open.spotify.com/artist/6qHE8C0Ci73PeG3rWocruG?si=wZvpF7U7SESHlWoWe7ryDA","v":"https://www.venmo.com/u/predawn-pours-merch","host":"Lisbeth Wells-Pratt"},{"p":105,"t":3,"n":"Retreat","g":"Rock","d":"Our genre is hard to describe, but it can just be called grunge with some punk elements","m":"https://open.spotify.com/artist/6nl2snNDZQLldWVT84xKa6?si=thn_7WavQBqELr9UuPJFcw&utm_source=copy-link","v":"https://www.instagram.com/retreat.fun?igsh=MXZoMDdzNTg1aHJqOA==","host":"Maureen Brown"},{"p":106,"t":3,"n":"Seeking Approval","g":"Rock","d":"Funk, blues, and psychedelic rock","m":"https://open.spotify.com/artist/310WV6vgLRL7QMs3Ko06VB?si=yEmOXXNYQ8GJdBMmEqX4DA","v":"https://venmo.com/code?user_id=1220293641109504105&created=1767816982","host":"Michael & Sid Jacobs"},{"p":107,"t":3,"n":"Space Brother","g":"Electronic/experimental","d":"","m":"https://spacebrother.bandcamp.com","v":"","host":"Peggy Brickman","r":"Experimental hip-hop by local beat master Donald Whitehead. Anyone at this show will definitely be astro travellin'."},{"p":108,"t":3,"n":"Raging Dave","g":"Rock","d":"New Orleans Zydecajun","m":"https://daviddonar.com/rajun-dave/","v":"https://www.paypal.com/donate/?business=K3KNLNE4SE37U&no_recurring=0&item_name=Support+my+performances+&currency_code=USD","host":"Peter Norris"},{"p":109,"t":3,"n":"Polar Waves","g":"Rock","d":"","m":"https://open.spotify.com/artist/3tDQl64vNw6eUQ4aFmDRw1?si=FhmU4luHT1232EnMT8IgYQ","v":"","host":"Rachel Kachur"},{"p":110,"t":3,"n":"Gift Economy & Alys Wilman","g":"Acoustic/singer-songwriter","d":"","m":"","v":"","host":"Rhett Crowe"},{"p":111,"t":3,"n":"Jack & Jealous","g":"Rock","d":"We've been attendees, and performed with other artists at previous Porchfests, and though we've been a part of the Athens scene since our inception, we're excited to finally be getting to applying to play! We love how Porchfest captures the spirit of Athens, and we'd love to be a part!","m":"https://tinyurl.com/yhksuwhx","v":"https://ianwhitemusicllc.com","host":"Samantha Eskew"},{"p":34,"t":3,"n":"Garden Variety","g":"Jazz","d":"Funk/Soul band","m":"https://open.spotify.com/artist/78kLnxTAZZGswoEazNSZFI?si=lIlSto7BS3uulZmBaZCcAA&utm_source=copy-link","v":"","host":"Sunroof Coffee"},{"p":112,"t":3,"n":"Davo The Frustratingly Mediocre Musician","g":"Acoustic/singer-songwriter","d":"Old stuff, I mean REALLY old.","m":"","v":"","host":"Sunshine Real Estate"},{"p":113,"t":3,"n":"Ol' Fader","g":"Rock","d":"Groove jams and reimagined southern rock","m":"","v":"","host":"Tapped Athens"},{"p":114,"t":3,"n":"Mary & the HOT Hotty-Hots","g":"Jazz","d":"Mary & the Hot Hotty-Hots offer hot jazz and swing music from the 1910's, 20's and 30's (okay... plus some 40's, surprises and a few crooning delights!). Be sure to wear those dancin' shoes!","m":"https://www.maryandthehothottyhots.com","v":"","host":"Thomas Leonard","r":"Local hot jazz and swing ensemble that performs the music of the 1910s-1930s, fronted by Mary Sigalas. If you don't catch them at Porchfest, you can see them every Thursday evening/night at The Globe."},{"p":115,"t":3,"n":"The Flying","g":"Rock","d":"•Genre-Spanning Songwriters Collective•","m":"https://youtube.com/@Theflyingvband","v":"https://venmo.com/u/Farrah-42","host":"TREEHOUSE kid and craft"},{"p":116,"t":4,"n":"BlackNerdNinja","g":"Hip-hop/rap","d":"","m":"https://linktr.ee/BlackNerdNinja?utm_source=linktree_profile_share&ltsid=be1fdbc0-7589-4140-aaa6-70777f276744","v":"","host":"Aaron Thompson","r":"BlackNerdNinja is the hip-hop alter ego of long time Athens native, entrepreneur, and podcaster Eugene Willis Jr. Named by Flagpole in 2015 as “Best Hip-Hop Artist”, has been a mainstay of the hip-hop scene here in town for many years. First saw him opening for The Glands about ten or so years ago, and puts on a great show."},{"p":117,"t":4,"n":"Botjam-Electric and Ukes","g":"Rock","d":"All performes have strong connections to State Botanical Garden of Georgia","m":"","v":"","host":"Adam Lowe and Tracy Moore"},{"p":118,"t":4,"n":"Redboy","g":"Folk","d":"","m":"","v":"","host":"Allan Aycock & Jen Cole"},{"p":119,"t":4,"n":"Spring Lizards","g":"Folk","d":"","m":"","v":"","host":"Anna McArthur"},{"p":120,"t":4,"n":"The Lanes","g":"Rock","d":"","m":"https://thelanesathensga.bandcamp.com","v":"","host":"Ashlea Lane, Stage 1"},{"p":121,"t":4,"n":"Klezmer Local 42","g":"Other","d":"Klezmer","m":"","v":"","host":"Ashley Carney","r":"Athens own local Klezmer group. Not too much to say, other than they’re great and if you haven’t seen’em yet, go do so. Just simply solid and great klezmer music."},{"p":122,"t":4,"n":"December Unloved","g":"Metal/punk","d":"I make gothic symphonic metal. Imagine choirs and violins with heavy guitars","m":"https://open.spotify.com/artist/5SpmyTuqPQj901qEiSmtmI?si=PuG5R-ehRruINQVR_cAL1A","v":"https://cash.app/$decemberunloved","host":"Becky Hammock"},{"p":4,"t":4,"n":"Donovan Ram Band","g":"Rock","d":"Its our premire rock ensemble at donovan catholic school","m":"","v":"","host":"Ben Mize, Stage 1"},{"p":123,"t":4,"n":"Jobremash","g":"Indie","d":"","m":"https://open.spotify.com/playlist/7l6c8UFEsjpaAD6VGg37D2?si=ZMWxs7t5R_WCukErU2nvSQ&utm_source=copy-link&pi=kk22OkpZTCaVu","v":"","host":"Blair Erickson"},{"p":124,"t":4,"n":"ozello","g":"Folk","d":"Queer Emo Folk/Punk","m":"https://open.spotify.com/artist/4hmqrWAGNjuD7x9AALS5d0?si=-x5vD9RCQcqMaG6v1dV0kg","v":"","host":"Brad Smith","r":"Fantastic folk punk/emo group from Atlanta that plays Athens quite a bit and is always a great and emotional show. Highly recommend if you want to get away from the big crowds in the center of the festival around Boulevard/Normaltown and still see a new favorite band."},{"p":7,"t":4,"n":"Howdy, Fellow Traveler!","g":"Folk","d":"Just a farmer and his best friends singing songs about loves lost and gained, carrots plucked and unplucked, and how birds can make you cry. Folk/country tunes. Unique mostly acoustic ensemble, with acoustic guitar, cello, bass, light percussion, and occasional fiddle.","m":"https://howdyfellowtraveler.bandcamp.com/album/snow-day-demos","v":"https://www.zeffy.com/en-US/donation-form/support-for-immigrant-families-in-crisis-sific","host":"Breanna Teague","r":"Howdy, Fellow Traveller is the brain-child of local singer-songwriter and farmer, Isaac Johnson. Country/Folk music in the vein of Michael Hurley and John Prine, and an openness that is perfect for a Porchfest environment."},{"p":125,"t":4,"n":"Blackwater Still","g":"Rock","d":"Southern Rock, Alt Country, Cinematic","m":"https://www.instagram.com/blackwaterstillband?stkn=NHRkMXJscW9tOGM3&utm_source=qr","v":"https://www.instagram.com/southerngothicband?igsh=NHRkMXJscW9tOGM3&utm_source=qr","host":"Brin VandenBerg"},{"p":126,"t":4,"n":"Living Still","g":"Folk","d":"My performance may just be me playing, however by then I may bring a whole band.","m":"https://www.instagram.com/livingstill.band/","v":"https://venmo.com/u/Gavin-Myers-9","host":"Buck Bacon"},{"p":127,"t":4,"n":"Pastelo","g":"Pop","d":"Synth pop","m":"https://open.spotify.com/artist/1mzhf4kDTTaRMO00nvkAor?si=RHX95VWXQ9OCNS39_kZ-tA","v":"https://venmo.com/code?user_id=2177174563979265014&created=1787155561","host":"Classic City Church"},{"p":128,"t":4,"n":"Vira Mar Brazilian Music","g":"Folk","d":"Brazilian Popular Music (MPB)","m":"","v":"","host":"Cobbham Triangle Park"},{"p":115,"t":4,"n":"Tears for the Dying","g":"Metal/punk","d":"Gothic rock, deathrock, postpunk","m":"https://open.spotify.com/artist/0OBdtDABr8MVcGot3doYRn","v":"https://venmo.com/funeralparties","host":"Dead Beat Club"},{"p":129,"t":4,"n":"Broken Down Boxes","g":"Indie","d":"","m":"","v":"","host":"Deirdre and Chris Sugiuchi, Stage 2","r":"Newest band by one of the best singer-songwriters Athens has ever had, Jim Willingham. If you haven’t heard of him, go check out his other past groups, Ham1, Old Smokey, and Dim Watts. This band is definitely his most rock’n roll forward group, but it’s always a treat to see Jim Willingham perform live."},{"p":47,"t":4,"n":"Jimmy Churry","g":"Acoustic/singer-songwriter","d":"","m":"https://open.spotify.com/artist/2KSYsxwZvmvax36XSjuNZI?si=F8SPo0GUQTmLwrQqRWl9aA","v":"","host":"Farm Burger Athens, Stage 2"},{"p":130,"t":4,"n":"Greater Tri County Area","g":"Country","d":"Local roots/alt country","m":"https://greatertricountyarea.bandcamp.com/album/gtca-demo","v":"","host":"Fever Dream (Maggie Lamb)"},{"p":97,"t":4,"n":"Merit Music Academy","g":"Other","d":"","m":"","v":"https://venmo.com/code?user_id=2816505821528064893&created=1773932066","host":"Good Shepherd Presbyterian Church Stage 2"},{"p":131,"t":4,"n":"Thanatopsis","g":"Metal/punk","d":"From world known sounds like Megadeth to Iron Maiden, Thanotopsis is a band that brings the iconic sound of thrash and heavy metal back to life.","m":"","v":"","host":"Jack Lagrone"},{"p":132,"t":4,"n":"The Speax","g":"Indie","d":"The Speax’s repertoire consists of covers and originals in the realms of rock, psychedelic rock, blues, and indie.","m":"https://m.youtube.com/watch?v=f93S4Tc1doU","v":"","host":"Jason Cade"},{"p":133,"t":4,"n":"Georgia Children’s Chorus","g":"Classical","d":"We will have a small group of singers, probably up to 20, and a portable keyboard for accompaniment.","m":"https://www.youtube.com/channel/UCVFoSL5gbi1jylvbq0WtFiQ","v":"https://www.georgiachildrenschorus.org/donate","host":"Jen Wardlaw"},{"p":134,"t":4,"n":"Golden Bowl","g":"Rock","d":"","m":"https://www.instagram.com/goldenbowlmusic/?hl=en","v":"https://open.spotify.com/artist/2lCt9gvO8GXFDMTSb6BsRd?si=KodzjWvXSEWZYtWq5TyIDg","host":"Kelly Crowe"},{"p":135,"t":4,"n":"The Dejects","g":"Rock","d":"Hard, Hook-driven rock for rocks sake","m":"http://instagram.com/the_dejects","v":"https://venmo.com/Dana-Siegmund","host":"Kelly Girtz"},{"p":24,"t":4,"n":"Strange Temples","g":"Indie","d":"","m":"https://strangetemples.bandcamp.com/","v":"https://venmo.com/code?user_id=2251669865758720239&created=1781214998","host":"Labels Resale Boutique"},{"p":136,"t":4,"n":"Schmooze","g":"Rock","d":"","m":"https://open.spotify.com/artist/6Qp7Fp9kXe5r0o1utKq7FX?si=4Waj6RESTDOalazq_9RY7A","v":"https://account.venmo.com/u/Jack-Weatherby","host":"Landon Moss"},{"p":137,"t":4,"n":"The Getters","g":"Rock","d":"It jumps around a little but the vibe is somewhere on the classic rock to pop punk spectrum!","m":"https://www.youtube.com/watch?v=9lj8MNWRmig&t=7s","v":"","host":"Liz DeMarco"},{"p":138,"t":4,"n":"Tommygun","g":"Metal/punk","d":"","m":"","v":"","host":"Mack Bosworth","r":"New local punk group that if you checked out the names of the members, older Athenians might recognize the last name of one of the members. Drummer Clay Reece is the son of long-time Athens area musician Greg Reece of Redneck Greece and the Primates. Tommygun in their own right perform solid and energetic art punk/hardcore music."},{"p":139,"t":4,"n":"Oldies But Goodies Ukulele Band","g":"Folk","d":"We play music that reflects out age and stage of life and have a dang good time!","m":"https://www.youtube.com/watch?v=0U-xr-oRH1M&t=1805s","v":"https://www.heartmusicathens.org/donate","host":"Mark / McKnight Family"},{"p":68,"t":4,"n":"Pilgrim","g":"Rock","d":"","m":"https://orcd.co/ylykpa0?fbclid=IwdGRleAQ367ABHcMCEr57Lolcs9wzw16ckqJbWH-z3U_dCvFoRFzZ8BTPbtwk2SGaO6hAZw&utm_source=ig&utm_medium=social&utm_content=link_in_bio","v":"","host":"mary hallam Pearse","vt":"www.facebook.com/pilgrimmusic1, http://igg.me/p/98825?a=568249","r":"Pilgrim is the local rock project of long-time Drive-By Truckers guitar tech Paul McHugh. Jim Wilson is also in the band, so he’s definitely going to be running around all day for Porchfest doing shows. But if you like the Truckers, you’re gonna love Pilgrim. Solid rock n roll music."},{"p":69,"t":4,"n":"Shauna and the Jaywalkers","g":"Indie","d":"We have 3 hours of originals, we're a singer/songwriter band that's folky/poppy and plain bad ass!","m":"https://www.youtube.com/watch?v=YdABSWtXLuA&list=PL52rj-s3beuCGfN-iMDfsAeYMA1mQ1aBm&index=1","v":"https://www.facebook.com/search/top?q=shauna%20and%20the%20jaywalkers","host":"Matthew Davis, Stage 2"},{"p":140,"t":4,"n":"Quig & the Boys","g":"Rock","d":"Rock and Blues","m":"https://www.reverbnation.com/quigandtheboys","v":"https://www.facebook.com/quigandtheboys/","host":"Michael Wegner"},{"p":34,"t":4,"n":"10-Footer","g":"Indie","d":"Fun Mid Century Modern inspired Indie","m":"https://gladflower.bandcamp.com/?search_item_id%3D2674029709%26search_item_type%3Db%26search_match_part%3D%253F%26search_page_id%3D5567463623%26search_page_no%3D0%26search_rank%3D1=","v":"","host":"Nighthawks Lounge"},{"p":70,"t":4,"n":"Ryne Meadow","g":"Pop","d":"Recent Flagpole cover boy! New Album Baptisms out now!","m":"https://open.spotify.com/album/5kMw7AHZlPZgltnqp6K9CA","v":"https://www.instagram.com/songbird_ryne?igsh=cWs5aHBrdnFqa3Rw&utm_source=qr","host":"Peggy Dahl-Bartunek"},{"p":141,"t":4,"n":"Willy Houston and the Ghost town Revival","g":"Rock","d":"Western Hard Rock","m":"https://open.spotify.com/album/3zV0oDjNn81dp0yAdKVhUz?si=5cHBCp-6QaC7JOLWx_kDnw","v":"https://linktr.ee/whoustongtr","host":"Pekka Honkanen and Carolina Fernandez Lamadrid"},{"p":142,"t":4,"n":"Beat Up","g":"Metal/punk","d":"Beat Up.Athens,Georgia, Athens Punks resisting the darkest timeline.","m":"https://beatup.bandcamp.com","v":"","host":"Peter James McCarron"},{"p":143,"t":4,"n":"Around the Fern","g":"Rock","d":"We primarily perform 90s and 2000s covers","m":"https://www.instagram.com/aroundthefernband/","v":"","host":"Sarah Frazer"},{"p":144,"t":4,"n":"Boulevard Saints","g":"Rock","d":"Garage/Alt","m":"https://open.spotify.com/artist/3BvpwAowSuxuWwPHiSGmwE?si=s3XF536OTXS7tcPBUSeK8Q","v":"","host":"Sean Hogan"},{"p":145,"t":4,"n":"Joe Random","g":"Rock","d":"","m":"https://joerandomatl.bandcamp.com/album/a-real-american-zero","v":"","host":"Sean Murphy"},{"p":146,"t":4,"n":"Mountain of Youth","g":"Folk","d":"","m":"https://open.spotify.com/album/5wvG7XMMiUARtO8fPIFT5d?si=KGRfw9heRP6iH1O1FD-vcQ&utm_source=copy-link","v":"","host":"Shannon Lee"},{"p":147,"t":4,"n":"Lea Lea","g":"Folk","d":"Looping freak-folk duo","m":"https://psychedelea.bandcamp.com/track/life-goes-on","v":"https://hookervision.bandcamp.com/album/sheyet","host":"TinyATH Gallery, Stage 1","r":"Local dream pop/experimental looper artist that has a very open and free sound that is very reminiscent of the New Weird America groups of the early 2000s."},{"p":147,"t":4,"n":"Petal Death","g":"Metal/punk","d":"Teen band playing grunge and 90’s alt rock covers","m":"","v":"","host":"TinyATH Gallery, Stage 2"},{"p":148,"t":4,"n":"Dames","g":"Rock","d":"","m":"https://youtube.com/playlist?list=PLTqsEbDj3rrERPgTuMH59PB0HQf9vvtw1&si=Dq49Wb0xG-okUjcx","v":"","host":"TJ & Robi Ragan, Stage 1"},{"p":78,"t":4,"n":"Logan & the Misadventure","g":"Folk","d":"","m":"https://open.spotify.com/artist/0mNwD1pdN3t10bY8unh2ME?si=FiJpRAlWSsmjKaAiRNZn9w","v":"https://www.venmo.com/u/loganandthemisadventure","host":"Toby Fuller"},{"p":149,"t":4,"n":"StageHand","g":"Rock","d":"It’s experimental art groove","m":"https://youtube.com/playlist?list=PLVq9YpM7OM2psQeFrgoOx_CFk2F4y3xOQ&si=DfsXmfAc2pUjrQn-","v":"https://www.venmo.com/u/stagehandissoawesome","host":"William M Overend Esq."},{"p":150,"t":5,"n":"Embr","g":"Indie","d":"I’d classify us as indie rock","m":"https://www.instagram.com/embrbandofficial?igsh=dDBxMGU4eWRmMmp6&utm_source=qr","v":"https://venmo.com/u/Olivia-Lynch-51","host":"Norris Peacock Injury Law"},{"p":151,"t":5,"n":"HUSTLERS BY NATURE","g":"Hip-hop/rap","d":"","m":"","v":"https://open.spotify.com/album/3cVMU5Jp9FhzdEOOpLWJX0?si=9lwwcd93RCmwx58APilWrw","host":"Amanda Dzimianski"},{"p":152,"t":5,"n":"The Lenders","g":"Country","d":"Honky tonk and outlaw country","m":"https://thelenders.bandcamp.com/album/some-loves","v":"","host":"Amanda Walls"},{"p":120,"t":5,"n":"Norma Rae","g":"Other","d":"We're an all-original Americana/Southern Gothic band from Athens that formed in 2011","m":"https://www.facebook.com/normaraeband","v":"","host":"Ashlea Lane, Stage 2","vt":"PayPal: foolonthehill109@yahoo.com"},{"p":87,"t":5,"n":"Noise Mountain","g":"Metal/punk","d":"","m":"https://open.spotify.com/artist/0xpNFQvOEUcUk2XhaC12m2?si=pmwxd-YLSt6WttJeZVwi4A","v":"","host":"Athentic Brewing Company"},{"p":41,"t":5,"n":"Noteworthy","g":"Other","d":"We are an a cappella group, we sing songs from all sorts of genres but typically pop, indie, rock, and soul.","m":"https://open.spotify.com/artist/6MyHz1OaVtj1w2y6JTu2u5?si=eGqMr8TNTpO_7u_St1T98Q","v":"https://gofund.me/362fa1e4a","host":"Bradley Stowe"},{"p":125,"t":5,"n":"Taylor Griffith","g":"Other","d":"Alternative Country, Southern Rock, Folk Rock","m":"https://open.spotify.com/artist/13Hl2LS2gj1d9B9sztJxzu?si=T0ZAa7YVRmai6DiswOMluA","v":"https://venmo.com/u/TaylorGriffith47","host":"Brin VandenBerg"},{"p":9,"t":5,"n":"Hunger Anthem","g":"Rock","d":"indie rock","m":"https://hungeranthem.bandcamp.com","v":"","host":"Cameron Norton, Stage 2","r":"Lo-fi power pop band started by Buffalo, NY native and now long time Athens resident Brendan Vaganek. Should be one of the openers for the upcoming Sugar show at the Georgia Theatre."},{"p":153,"t":5,"n":"Telephone Pole","g":"Rock","d":"","m":"https://open.spotify.com/artist/7GNxDoxzffjR6HhpaShbD1?si=uFMwLPjCQMyebHvgQDFYNA","v":"","host":"Camryn Lacey"},{"p":154,"t":5,"n":"don chambers","g":"Folk","d":"","m":"https://donchambers.bandcamp.com/music","v":"https://account.venmo.com/u/donchambersmusic","host":"Christopher Hassiotis","r":"Longtime Athens singer-songwriter/experimental artist that has pretty much done it all here in town, and any Don Chambers show will be different from the last. It could be a mellow folk set for the Porchfest atmosphere or some southern gothic experimental musings. Whatever it will be, will be one of your favorite sets of the festival."},{"p":155,"t":5,"n":"Shehehe","g":"Metal/punk","d":"","m":"https://sheheheband.com","v":"https://venmo.com/code?user_id=2972864214990848565&created=1783700404","host":"Christy O'Reilly"},{"p":156,"t":5,"n":"The Norman Baldwin Band","g":"Acoustic/singer-songwriter","d":"N/A","m":"https://soundcloud.com/user-524169716","v":"","host":"Dawn Skinner"},{"p":129,"t":5,"n":"Trycoh","g":"Rock","d":"3 piece instrumental rock.","m":"","v":"","host":"Deirdre and Chris Sugiuchi, Stage 1","r":"Local instrumental rock group that has riffs for days and plays a 70s rock sound that isn’t bland or derivative and has a proper Athens grit to it. They’re playing at the same house right after Broken Down Boxes."},{"p":157,"t":5,"n":"Dreams","g":"Pop","d":"Pop with a R&B feel, we’d also do some popular covers","m":"https://distrokid.com/hyperfollow/justtr/just-stay/","v":"https://cash.app/$JustTra","host":"Dianna and Davide Violini"},{"p":12,"t":5,"n":"Motorhead2x","g":"Hip-hop/rap","d":"","m":"","v":"","host":"durwood pepper and Jim Taflinger","r":"Also known as Motorhead TwoTimes, Davonta is a long-time Athens native and former resident of the historical Pauldoe community off of Hawthorne Avenue. Was a part of the Classic City Wax Vol. 1 compilation that was released in 2020, that showcased some of the best of Athens hip-hop."},{"p":45,"t":5,"n":"Emileigh Ireland","g":"Acoustic/singer-songwriter","d":"","m":"https://emileighireland.bandcamp.com/","v":"https://account.venmo.com/u/Emileigh-Ireland","host":"emileigh ireland"},{"p":94,"t":5,"n":"Bad First Date","g":"Indie","d":"","m":"https://linktr.ee/juliasuzelmore?utm_source=linktree_profile_share&ltsid=de038816-d641-4353-909b-2574be3ba139","v":"https://venmo.com/u/Julia-Elmore-2","host":"Emma Baughn, Stage 2"},{"p":158,"t":5,"n":"Florence Cardigan","g":"Indie","d":"Rock/indie rock","m":"https://open.spotify.com/artist/6pjMd9viTzRvSCXCTdRjh3?si=DBy2PNQPRiuOCgBQSOuw5w","v":"https://www.venmo.com/u/florence_cardigan","host":"Emre Downey"},{"p":19,"t":5,"n":"KIAH & the Tygar","g":"Country","d":"Kiah & Tygar perform mostly country with some soft rock. We would love to connect with IVMe as a porch if possible.","m":"https://youtube.com/shorts/5yfNQLZDkSU?is=dqYz-Sf3-YXfv6x6","v":"https://venmo.com/u/KiahandtheTygar","host":"Greg Ducote"},{"p":51,"t":5,"n":"Andovia","g":"Rock","d":"Andovia is an alternative rock band blending elements of grunge, shoegaze, and nu-metal. Our sound features thick distorted guitars, deep sludgy bass tones, melodic haunting vocals, and booming drums.","m":"https://linktr.ee/andovia","v":"https://venmo.com/u/andoviaband","host":"Hall Booth Smith. P.C. (Contact - Emma Grace Jarvis)"},{"p":159,"t":5,"n":"Robe","g":"Indie","d":"","m":"","v":"","host":"Happy Top"},{"p":160,"t":5,"n":"New Orleans Jazz Stompers","g":"Jazz","d":"","m":"","v":"","host":"Jeff Fallis","r":"Local long-time dixieland jazz group that plays all around town and plays the sounds and music of New Orleans as it should be played. If you like the culture and music of New Orleans, there’s not a better band in town showcasing it."},{"p":11,"t":5,"n":"Greylow","g":"Rock","d":"","m":"https://greylow.bandcamp.com/album/this-is-what-you-call-us","v":"","host":"Jillian Grant"},{"p":161,"t":5,"n":"Gimme Hendrix - Jimi Hendrix Tribute","g":"Rock","d":"Psychedelic/Tribute","m":"https://gimmehendrix.com","v":"","host":"Julia Slatcher","r":"If you can tell me if there’s a better Jimi Hendrix Experience tribute act in the world (yes WORLD), let me know, because I think we have it here in Athens. No lies being told here."},{"p":162,"t":5,"n":"A.M. Rodriguez","g":"Acoustic/singer-songwriter","d":"Fingerstyle blues and country","m":"https://www.youtube.com/watch?v=zcjVu-MAo6Q&list=OLAK5uy_lPlXR0gFFpcuYvVEFvvAPmj2fNIVr86Ik","v":"https://linktr.ee/amrodriguezmusic","host":"Karen Payne","r":"Country/Blues singer-songwriter and record producer here in Athens. Has a tongue-in-cheek humor to his music that doesn’t feel forced and feels like it is a part of the world of his songs and lyrics."},{"p":163,"t":5,"n":"Past Our Prime","g":"Rock","d":"It would be an honor to come back this year. We had an amazing time last year!","m":"https://open.spotify.com/artist/3N9jYPfIruT1ZFBA3I89DV?si=KMOmOhqqQW6M5TUK9tMZng","v":"","host":"Karla & Joseph Pruitt"},{"p":61,"t":5,"n":"Trio Metro","g":"Jazz","d":"Trio Metro is a jazz trio playing in the greater Athens area and is composed of Mindy Towe on Sax, Tracy Reynolds on Keys, and Ron Balthazor on Drums. Though only recently joining to form Trio Metro, each of us has a long musical history and an array of musical experiences. Trio Metro 's music most often comes from the jazz standards of the Great American Songbook, though we love to play more contemporary covers as well. We are equally at home playing for clubs, parties, and weddings as we are for aficionados of the Lindy-Hop.","m":"https://www.triometro.com/","v":"https://www.venmo.com/u/triometrojazz","host":"Kemp Jones","r":"Local jazz trio of keys, drums, and saxophone, all of which the members are a part of Big Band Athens. No frills, just straight up solid local jazz that any good music town should have."},{"p":164,"t":5,"n":"Luxury Vehicle","g":"Electronic/experimental","d":"","m":"","v":"","host":"Kenny nguyen"},{"p":165,"t":5,"n":"Thingamajig","g":"Rock","d":"There may be some duo performances to fill up the time with Luke Bright and Katherine Bright","m":"","v":"","host":"Kristen and Ed Morales"},{"p":166,"t":5,"n":"Chairs","g":"Indie","d":"","m":"https://open.spotify.com/artist/6xa44HCAf7p56NNowqA75p","v":"https://primordialvoid.bandcamp.com","host":"Lee Smith","r":"Indie/slacker rock project of Marcel Sletten, a local experimental electronic musician and owner of local record label Primordial Void. This band evolved from being an experimental noise ensemble to the indie rock band they are today, and their shows are an amalgamation of these different styles."},{"p":167,"t":5,"n":"Total DivERson","g":"Rock","d":"","m":"","v":"","host":"Lewis Earnest"},{"p":168,"t":5,"n":"Headlocked","g":"Rock","d":"","m":"https://open.spotify.com/artist/7zFOCzkhZGOo7nZo9FRwuA?si=HsZ9o2LwQb61jdDbqUSyIA","v":"","host":"Maci Foster"},{"p":169,"t":5,"n":"The Asymptomatics","g":"Rock","d":"Experience the inevitable sweaty dance party that is The Asymptomatics on a Porch!","m":"https://open.spotify.com/artist/6WkOdm1cbLuLfYsqgLjF0v?si=J9eGdrXnR_CdLBqZTJ1s4A","v":"https://theasymptomaticsband.com/","host":"Maxwell Mahieu"},{"p":106,"t":5,"n":"X-alt","g":"Acoustic/singer-songwriter","d":"New-ish Athens band X-alt consists of seasoned local musicians: Craig Landry on drums & vocals (Wet Meadows, Iron Horse, Rebreeders), Bruce Skinner on bass & vocals (Ol’ Fader), Nick Bradley on guitar & vocals (Wet Meadows…), and John Brocato on guitar & vocals (Iron Horse, solo stuff). We play primarily 90s and aughts alt-rock and grunge — QOTSA, Pearl Jam, Screaming Trees, Catherine Wheel, Interpol, and the like. (No nü-metal, though, because ick.) As Craig has famously said, “I want to play songs that I want to hear when I go out to hear music,” and that’s what we do. You can book us by emailing john.brocato@gmail.com. H*ck yeah.","m":"https://johnbrocato.com","v":"","host":"Michael & Sid Jacobs"},{"p":170,"t":5,"n":"Saturn Thee DJ & Astro","g":"Electronic/experimental","d":"Jersey Club, Chicago House, GhettoTech and other dance fusions - DJing with guitar accompaniment. Equipment ready 🤘🏾","m":"","v":"","host":"Michael Fusaro"},{"p":29,"t":5,"n":"Classic City Jukebox","g":"Rock","d":"","m":"https://www.youtube.com/@classiccityjukebox1590","v":"","host":"Normaltown Brewing Co."},{"p":171,"t":5,"n":"The Brambles","g":"Other","d":"Rock, Country, Americana","m":"","v":"","host":"Olivia Roth"},{"p":172,"t":5,"n":"The New Pizzazz","g":"Electronic/experimental","d":"We’d like to play at R&R Secret Flowers (919 N Chase St) as their space is accessible to one of our band members in a chair","m":"https://thenewpizzazz.bandcamp.com/album/live-at-porchfest-2023","v":"","host":"R&R Secret Flowers","r":"Don’t know too much about this group, but their artist page is a link to their Porchfest set in 2023, so if you dig experimental electronic/modular synthesizer music like I do, then this is something to possibly check out."},{"p":173,"t":5,"n":"Swing Theory","g":"Jazz","d":"","m":"https://www.instagram.com/realswingtheory?stkn=dmI2bjl0amZjYjV3&utm_source=qr","v":"https://venmo.com/u/legrasdiego","host":"Sam James","r":"Another great jazz ensemble here in town. They play in town all the time at Hendershot’s, 5 Bar, Nowhere Bar. A band that helps provide the foundation of the local jazz scene along with Trio Metro and Big Band Athens. Though Porchfest could have done a better job spreading out all the jazz bands in different hours."},{"p":174,"t":5,"n":"Julie Powell Caldwell & Mark Maxwell","g":"Acoustic/singer-songwriter","d":"I would like to play PorchFest as a solo singer/songwriter although the album I linked has a full band. I would perform mostly originals along with a few well-know singer/songwriter covers (John Prince, Bob Dylan, etc.)","m":"https://open.spotify.com/artist/4pk1Lp50LN1hUSu2UPgPlZ","v":"","host":"Stacie Carson"},{"p":117,"t":6,"n":"Hazy The Ginger & Lil Vro","g":"Hip-hop/rap","d":"Our main style is rap, but we do all sorts of genres including alt-rock, indie, lofi, pop, nu-metal, etc. so we can bring a diverse performance. We have a lot of songs that haven’t been released yet too, so if you’d like to hear more we can send more over whenever!","m":"https://on.soundcloud.com/5WCmysuf4Ypun12lsK","v":"https://www.instagram.com/hazytheginger?igsh=eTMxc3E5b3gzaG54&utm_source=qr","host":"Adam Lowe and Tracy Moore"},{"p":175,"t":6,"n":"Wyld Staleyz","g":"Rock","d":"We are here to party and rock, but not always in that order","m":"https://wyldstaleyz.com/","v":"","host":"Ann and John Dye","vt":"Venmo.com@David-Brown-961"},{"p":39,"t":6,"n":"raven","g":"Electronic/experimental","d":"electronic/pop/experimental","m":"","v":"","host":"Ben McCoy"},{"p":176,"t":6,"n":"Flora’s Embrace","g":"Indie","d":"We are an alternative rock duo that performs all of our own original music. Our sound blends different styles of music together and brings a diverse unique set with personality to the stage.","m":"https://www.instagram.com/florasembrace?utm_source=ig&utm_medium=social&utm_content=link_in_bio&fbclid=PAcGRvZgJmZGlkFlDGPMuQPxNpy3lf0qtk3NQISoqP-zpleHRuA2FlbQIxMQBzcnRjBmFwcF9pZA8xMjQwMjQ1NzQyODc0MTQAAaeMIPTkvjZIjPqXq7EQb-SJm1rVS_6WI2yKtlC3WMXH004BV4bcYPH0OMbV7w_aem_-JHY6ixdjjJgXnhLEftGig","v":"https://florasembrace.bandcamp.com/merch","host":"Cassie Myers"},{"p":177,"t":6,"n":"Eliza Sage","g":"Indie","d":"This year, we'll be doing covers of indie rock songs with a little twist!","m":"","v":"","host":"Christy Bush"},{"p":178,"t":6,"n":"The Agonal Gasps","g":"Rock","d":"We can do the same as usual with Tears for the Dying if they're playing this year","m":"https://open.spotify.com/artist/3uMxsY6gVhuyCpLv4lluwh?si=7kojKVulRPm56E1fNnZAoQ","v":"https://www.venmo.com/u/itsgothdad","host":"Dusty Gannon"},{"p":179,"t":6,"n":"Kate Bowen","g":"Acoustic/singer-songwriter","d":"","m":"https://open.spotify.com/album/124H55DTGTibX9MVeytTn9","v":"","host":"Elizabeth Marston"},{"p":180,"t":6,"n":"The Grawks","g":"Rock","d":"","m":"https://www.youtube.com/watch?v=RpfKWtRCAKo","v":"","host":"Eric George","r":"Every good music scene has a 70s NYC punk inspired garage rock band of musicians who grew up with that music. Athens has one too, but they do it better than most any of them and has a name that fits perfectly with that aesthetic. So if you need that to end your evening, then The Grawks is it."},{"p":181,"t":6,"n":"Little Mae","g":"Indie","d":"","m":"https://open.spotify.com/artist/6q1jE6JELTCzJfaGWvJaX8?si=9eqoCnIORTmgubn8P4f18Q","v":"https://linktr.ee/little.mae?utm_source=linktree_profile_share&ltsid=e16a0853-3601-4787-86cb-cf02ee451e01","host":"Erica Gilbertson"},{"p":182,"t":6,"n":"ELLWIN","g":"Electronic/experimental","d":"I am an electronic music DJ that plays dubstep, drum and bass, techno, goa and house","m":"https://soundcloud.com/ellwinsounds","v":"https://www.instagram.com/ellwinsounds.als/","host":"Frannie McClester"},{"p":19,"t":6,"n":"The Wounded Katz","g":"Rock","d":"We cover mostly rock from old to new and also a tad of country mixed in 😺","m":"https://www.facebook.com/share/1FEfZk2VbM/","v":"","host":"Greg Ducote"},{"p":98,"t":6,"n":"Ansley McAllister Band","g":"Country","d":"It’s also a singer/songwriter vibe!","m":"https://open.spotify.com/artist/6cneoSzh4nvqU8Mqxay6yD?si=h3NQC-jzQNK97ObdO_yQ1g&utm_source=copy-link","v":"https://venmo.com/u/Ansley-McAllister-2","host":"Gwen OLooney"},{"p":183,"t":6,"n":"Bichos Vivos","g":"Folk","d":"","m":"","v":"","host":"Historic Athens Fire Hall No. 2","r":"Athens own local Brazilian forro group. If aren’t tired from dancing at any of the other shows in the day, then here’s the last one of the night. It will be in the kinda cramped Old Fire Hall, so you know it is going to be good."},{"p":184,"t":6,"n":"Dragana","g":"Other","d":"DRAGANA (formerly known as Athens Mountain Singers) performs a cappella vocal music from Eastern Europe and the Balkans, featuring raw, haunting polyphony. Dragana is Amy Bonnaffons, Claire Campbell, Andrea DeMarcus, Jesslyn Shields, SJ Ursrey, and Alys Willman.","m":"https://www.instagram.com/athensdragana/","v":"","host":"Jane McPherson & Jon Jefferson","r":"Formerly the Athens Mountain Singers, Dragana is an all-female A cappella group that performs music from all around Eastern Europe and The Balkans. Comprised of local musicians from Hope for Agoldensummer, Cicada Rhythm, and Honeychild."},{"p":185,"t":6,"n":"The Taj Motel Trio","g":"Metal/punk","d":"8-piece ska/punk powerhouse","m":"http://distrokid.com/hyperfollow/thetajmoteltrio/passive-aggressive-fallout-shelter/","v":"","host":"John Bourgeois","r":"Long time legendary ska proprietors from the Habersham Area of Georgia, have been playing not as a ska trio since the late 90s and have toured with other legendary ska bands such as Streetlight Manifesto, Catch 22 and The Toasters. Genuinely one of the most underrated and relatively un-celebrated punk bands of Georgia."},{"p":186,"t":6,"n":"Sidecar","g":"Rock","d":"Sidecar is a Time Machine to 1985-1996 when alternative music ruled the world!","m":"https://www.instagram.com/sidecarband.atl","v":"","host":"Katelyn Porter"},{"p":187,"t":6,"n":"Dyer","g":"Indie","d":"","m":"https://drive.google.com/drive/folders/1KbWnw9RERTfB6neZawfXm_h2mB8It7jV?usp=sharing","v":"","host":"Leo Fioresi"},{"p":64,"t":6,"n":"Dogfight","g":"Metal/punk","d":"","m":"https://open.spotify.com/artist/1t9sdplcmun52GMte0d57u?si=vKNFDQ_tS5SSBXh9TxSNYg&utm_source=copy-link","v":"","host":"Lillie Evan Young"},{"p":188,"t":6,"n":"Reno Roberts","g":"Acoustic/singer-songwriter","d":"","m":"","v":"","host":"Madison Hall"},{"p":69,"t":6,"n":"DJ Charlieflower","g":"Other","d":"I'm Athens champion of Electropop music and Synthpop. I also specialized in New Wave/Post-Punk and EDM! I like to craft fun sets of surprises and rediscoveries.","m":"https://www.mixcloud.com/Parliament_Of_Owls/","v":"https://www.instagram.com/djcharlieflower/?hl=en","host":"Matthew Davis, Stage 3"},{"p":140,"t":6,"n":"Karma Kat","g":"Rock","d":"Karma Kat has quickly evolved from a raw, high-energy group into a sophisticated indie band known for their intricate blend of rock and jazz.","m":"https://open.spotify.com/artist/0ECHERcc2tV7BZueH82A72?si=ugc0A4lcRn-y9uKeTk5mDg&utm_source=copy-link","v":"https://www.instagram.com/karmakatmusic?igsh=OW04YXp3eXlteWY%3D&utm_source=qr","host":"Michael Wegner"},{"p":107,"t":6,"n":"Matt Howels","g":"Other","d":"I play acoustic delta blues, covering Robert Johnson, Muddy Waters and others","m":"https://youtube.com/@thematt5104?si=mOFFQI5-xCAfIos4","v":"https://venmo.com/code?user_id=3184391631142912335&created=1768102381","host":"Peggy Brickman"},{"p":38,"t":6,"n":"Kate Morrissey Band","g":"Acoustic/singer-songwriter","d":"https://www.connectsavannah.com/music-and-clubs/kate-morrisseys-bigger-picture-2131369/","m":"https://www.google.com/search?sca_esv=a6de26ecf3f9c9fb&rlz=1C1CHBF_enUS963US963&udm=7&sxsrf=APpeQns-re2dUXo4QIA1QT-fZEb-3GW2fQ:1788896335096&q=kate+morrissey+music+athens+ga&sa=X&ved=2ahUKEwizn9-U3t-WAxWP8ckDHdfoFq8Q8ccDKAJ6BAgbEAU&biw=1280&bih=585&dpr=1.5#fpstate=ive&vld=cid:d672882f,vid:5cdGA-PtAto,st:0","v":"https://www.venmo.com/u/Kate-MorrisseyStahl","host":"Revolution Therapy and Yoga (owned by Kate Morrissey Stahl)"},{"p":189,"t":6,"n":"Vansplainer","g":"Metal/punk","d":"Only the brown notes.","m":"https://www.youtube.com/playlist?list=OLAK5uy_lG8OLXQIQ_JVAdTZNo7tpgyrMiAuGRp2E","v":"https://vansplainer.com","host":"Russ Hicks","r":"Spin-off heavy rock group from local band The Dictatortots. So if you know of any of the debauchery of the latter group, you’ll figure out what kind of humor to expect from the self-proclaimed, “Athens, Georgia's best hockey-adjacent heavy rock band.”"},{"p":190,"t":6,"n":"Great Value Clothes","g":"Indie","d":"","m":"https://youtube.com/playlist?list=OLAK5uy_k6_kGjvtfYrQEhrE0Q_RLp4FNM1-zHgtU&si=BN1eGMHYVOycw0BQ","v":"","host":"Sybil Smith"},{"p":36,"t":6,"n":"Killick","g":"Other","d":"Appalachian Trance Metal","m":"","v":"","host":"Tanya Hudson","vt":"Venmo @Killick-Hinds","r":"Killick Erik Hinds performs what he calls, “Appalachian Trance Metal”. Long-time experimental musician here in Athens is able to create massive soundscapes and worlds from mostly anything he touches resembling an instrument."},{"p":147,"t":6,"n":"Grant Evans","g":"Electronic/experimental","d":"","m":"https://grantevans.bandcamp.com/","v":"","host":"TinyATH Gallery, Stage 1","r":"Collaborative set with local experimental music musician Grant Evans and local dungeon synth musiciain Dweomer. For any one here in Athens who follows the experimental scene here, will be curious to see what this collaborative set will be."},{"p":147,"t":6,"n":"Deweomer","g":"Electronic/experimental","d":"","m":"https://dweomer.bandcamp.com/","v":"","host":"TinyATH Gallery, Stage 2","r":"Collaborative set with local experimental music musician Grant Evans and local dungeon synth musiciain Dweomer. For any one here in Athens who follows the experimental scene here, will be curious to see what this collaborative set will be."},{"p":148,"t":6,"n":"Senseless","g":"Rock","d":"","m":"","v":"","host":"TJ & Robi Ragan, Stage 2"},{"p":191,"t":6,"n":"ugly pete","g":"Acoustic/singer-songwriter","d":"Hey there! Played for the first time last year with my band Perfect Animal and would love to do it again solo!","m":"https://open.spotify.com/artist/1HsxF9SKYLVjVBuMFj21J8?si=YnQqsDaTRKKXxNQs6lyrMQ","v":"","host":"Trish Barefield"},{"p":192,"t":7,"n":"Mayors' Show","g":"Folk","d":"To close out Historic Athens Porchfest, Mayor Kelly Girtz introduces Winterville Mayor and singer-songwriter Dodd Ferrelle to the audience at the Mayor’s Show at Stan Mullins Studio in Pulaski Heights. The only performance at 7PM, you won't want to miss it!","m":"","v":"","host":"Stan Mullins","r":"The yearly close out show for Porchfest at Stan Mullins Studio with Athens-Clarke County Mayor Kelly Girtz and Winterville Mayor Dodd Ferrelle."}]};
const STREETS={"names":["Standard Oil Street","Edwards Drive","West Dougherty Street","North Church Street","New Avenue","Virginia Avenue","Georgia Avenue","Crestview Circle","Savannah Avenue","Willow Run","Foster Road","Jeffries Court","Evans Street","Greenwood Court","Holman Avenue","Cleveland Avenue","Dubose Avenue","Hoyt Street","North Franklin Street","South Church Street","Hills Chapel Street","Oaktree Square","West Hancock Avenue","Bryan Street","Pound Street","Hodgson Drive","Normal Avenue","Barber Street","Campbell Lane","Crawford Street","Gardenia Drive","Chatooga Avenue","East Hancock Avenue","Windsor Court","Nantahala Avenue","Tibbets Avenue","Atlanta Avenue","Glenhaven Avenue","Price Avenue","Waterworks Drive","North Milledge Avenue","Sunset Terrace","Conard Road","Kenny Road","Pulaski Street","South Pope Street","Cobb Street","North Pope Street","Fox Road","South Rocksprings Street","Hill Street","Beulah Avenue","Gloria Street","Forbstein Alley","Childs Street","Bazzelle Avenue","James Street","Lee Street","South Chase Street","Augusta Avenue","Yonah Avenue","Meigs Street","Boulevard Heights","Macon Avenue","College Avenue","Ware Street","Tracy Street","Indale Avenue","Grady Avenue","East Dougherty Street","South Hull Street","Boulevard","North Hull Street","Miller Street","Bowstrom Road","Madison Avenue","Old West Broad Street","Easy Street","Hawthorne Extension","North Finley Street","Minor Street","Walker Street","Hillcrest Avenue","Monroe Street","North Rocksprings Street","Buena Vista Avenue","Hawthorne Avenue","Waverly Court","Gilmer Street","Baldwin Street","South Finley Street","Dearing Street","Westover Drive","Jefferson Place","Oglethorpe Terrace","Sylvan Road","North Lumpkin Street","Seminole Avenue","Talmadge Drive","Strong Street","Millard Avenue","Barrow Street","Reese Street","Willow Street","Old Broad Street","Jefferson Road","Miles Street","Brooklyn Road","Franklin Street","South Billups Street","Cain Street","Prince Avenue","Weir Circle","Satula Avenue","Ruth Drive","Wray Street","Smith Street","Stevens Street","Nacoochee Avenue","East Washington Street","Buck Road","Hendrix Avenue","Plaza Street","Edwards Circle","Best Drive","Prince Ville Lane","Sunset Drive","King Avenue","Judy Circle","North Harris Street","Kesler Street","North Chase Street","West Broad Street","Belvoir Heights","Mathews Avenue","Nantahala Extension","Wynburn Avenue","North Billups Street","Sylvia Circle","Lyndon Avenue","Oneta Street","Clover Street","South Newton Street","Julius Drive","Myrtle Court","Hiawassee Avenue","Elizabeth Street","Pulaski Heights","Waddell Street","Lenoir Avenue","Broadacres Court","South Harris Street","South Lumpkin Street","Donna Street","Park Avenue","West Clayton Street","Hart Avenue","Cohen Street","Lakeview Street","Pineneedle Road","Morton Alley","McGowan Road","State Street","Athens Avenue","Kendene Street","Tibbetts Street","Prince Place","Jefferson Circle","Carter Road","","CSX Abbeville Subdivision","Doctor Martin Luther King Junior Parkway","Helen Street","Athens Line","North Newton Street","Oglethorpe Avenue","Madison Street","Old Epps Bridge Road","Morningside Drive","Brookside Avenue","Summerbrook Circle","South Milledge Avenue","Pauldoe Court","Ruth Street","East Broad Street","West Washington Street","North Jackson Street","East Clayton Street","Paris Street"],"ways":[{"c":"c","n":0,"p":[1326,-716,40,74,10,47,-4,18,-7,4,-24,0]},{"c":"c","n":1,"p":[-978,175,-77,21,-214,14,-402,43]},{"c":"b","n":2,"p":[1581,146,-232,65,-49,4]},{"c":"c","n":3,"p":[865,711,-142,-491]},{"c":"c","n":4,"p":[-5,-690,-236,-33]},{"c":"c","n":5,"p":[570,-107,32,-283]},{"c":"c","n":6,"p":[-525,-148,-226,191,-82,5]},{"c":"c","n":7,"p":[-685,451,61,-67,5,-34,-97,-174]},{"c":"c","n":8,"p":[949,-606,-80,-258]},{"c":"c","n":9,"p":[-693,585,-22,-20,-98,-116,-109,-103,-27,-38,-40,-196,5,-187]},{"c":"c","n":10,"p":[-1013,-73,10,-245]},{"c":"c","n":11,"p":[271,506,-48,13]},{"c":"c","n":12,"p":[-604,1133,7,154,-18,146,-12,193,5,7,56,31,50,13]},{"c":"c","n":13,"p":[-1156,-65,13,185]},{"c":"c","n":14,"p":[-740,911,-78,-59,-77,-68,-24,-10,-66,-44,-130,-55,-118,-159,-63,-573]},{"c":"b","n":15,"p":[1485,-689,-130,-32,-21,3,-428,126,-36,-4,-68,-31]},{"c":"c","n":15,"p":[833,-528,48,-16,12,-13,13,-35]},{"c":"c","n":16,"p":[685,-76,-67,-12,-173,-68,-269,-47]},{"c":"c","n":17,"p":[1416,-203,71,18,101,52,20,1,29,-8,217,-93]},{"c":"c","n":18,"p":[449,700,-33,-124,5,-15,-151,-527,2,-13]},{"c":"c","n":19,"p":[865,711,171,604]},{"c":"c","n":20,"p":[-401,1192,104,-10,92,-33]},{"c":"c","n":21,"p":[-1328,-104,-61,7,-21,-104]},{"c":"c","n":21,"p":[-1342,-216,-115,27]},{"c":"b","n":22,"p":[1605,238,-266,69,-19,12,-258,68,-762,222,-244,78,-43,26,-327,330]},{"c":"c","n":23,"p":[245,-884,-65,-7,-163,67,-29,-4,-11,-7]},{"c":"c","n":24,"p":[-962,-489,180,-220,63,-70,14,-7]},{"c":"c","n":25,"p":[-369,1075,-56,-189,-41,-57,-126,-111]},{"c":"c","n":26,"p":[-845,-84,28,343]},{"c":"b","n":27,"p":[1001,164,-17,-181,-97,-344,-169,-534,-62,-344]},{"c":"c","n":28,"p":[-205,1149,118,-41]},{"c":"c","n":29,"p":[893,-557,24,11,15,17,23,83]},{"c":"c","n":30,"p":[-1603,1357,-49,-65,-16,-29,-18,-112,-23,-35,-46,-17,-24,-4,-30,-16,-49,-5,-40,13,-127,-9,-5,10,27,101,52,-4,47,6,25,9,35,21,32,28]},{"c":"c","n":31,"p":[206,-720,-203,-28,-56,-1,-84,-18]},{"c":"b","n":32,"p":[1605,238,206,-55]},{"c":"c","n":33,"p":[-225,508,-52,-46]},{"c":"c","n":34,"p":[839,-506,-855,-99,-215,-30]},{"c":"c","n":35,"p":[-165,-530,91,10]},{"c":"c","n":36,"p":[780,-696,380,-113,4,-8,-4,-18]},{"c":"c","n":37,"p":[135,497,-100,30,-17,15,-101,208,-97,110,-40,53,-42,64,-14,31]},{"c":"c","n":38,"p":[-1032,606,-83,69,-111,146,-6,11,-22,126]},{"c":"c","n":39,"p":[681,-1109,155,-53]},{"c":"b","n":40,"p":[616,784,-201,-710,-3,-27]},{"c":"c","n":41,"p":[-919,774,-168,214]},{"c":"c","n":42,"p":[-801,-358,-57,64]},{"c":"c","n":43,"p":[-1005,-289,-118,-5,-58,18,-42,6,-11,-4,-9,-12,-6,-35,7,-36,21,-17,54,-60,23,-12,100,-21,16,-11,32,-41]},{"c":"c","n":44,"p":[1300,215,-34,-156,-1,-280,-17,-473]},{"c":"c","n":45,"p":[995,673,169,606]},{"c":"c","n":46,"p":[634,90,-6,21,-498,145,-69,-5,-63,-11,-179,-153]},{"c":"c","n":47,"p":[995,673,-144,-525,36,-162,-32,-9,-5,-8,17,-99]},{"c":"c","n":48,"p":[-876,-254,-130,-6]},{"c":"b","n":49,"p":[128,927,64,228]},{"c":"c","n":50,"p":[911,146,-2,12,-8,9,-732,214,-47,9,-111,-2,-28,10,-20,15,-30,-16,-211,-177]},{"c":"c","n":51,"p":[497,-403,33,-259]},{"c":"c","n":52,"p":[-1250,380,-274,30]},{"c":"c","n":53,"p":[973,-993,82,-36,47,-11]},{"c":"c","n":54,"p":[1074,178,29,-345]},{"c":"c","n":55,"p":[-1468,1017,-67,1,-178,-18]},{"c":"c","n":56,"p":[-1390,1110,-97,16,-14,-3]},{"c":"c","n":57,"p":[254,451,-26,7,-28,-9,-13,-12,-18,-56]},{"c":"c","n":58,"p":[372,856,36,126]},{"c":"c","n":59,"p":[1079,-643,-106,-350]},{"c":"c","n":60,"p":[-308,-182,-47,5,-18,-3,-500,-419]},{"c":"c","n":61,"p":[1233,205,-968,281]},{"c":"c","n":62,"p":[-865,-408,181,-220]},{"c":"c","n":63,"p":[1160,-835,-78,-283]},{"c":"b","n":64,"p":[1795,381,-314,-1020,-1,-29,15,-39,89,-68,13,-21,39,-131]},{"c":"c","n":65,"p":[1554,-406,-118,35]},{"c":"b","n":66,"p":[374,-725,37,-33,19,-10,288,-127]},{"c":"c","n":67,"p":[163,590,-123,38,-158,-77]},{"c":"c","n":68,"p":[653,94,88,-470]},{"c":"b","n":69,"p":[1581,146,132,-37,60,-43,25,-24,22,-31]},{"c":"c","n":70,"p":[1542,550,66,245,-4,15]},{"c":"b","n":71,"p":[887,-361,-911,-104]},{"c":"c","n":72,"p":[1416,-203,-28,157,8,52,146,544]},{"c":"c","n":73,"p":[1,963,30,123]},{"c":"c","n":74,"p":[-1085,-596,-296,144,-6,5,-1,9,9,32]},{"c":"c","n":75,"p":[1763,-93,-104,30]},{"c":"c","n":76,"p":[-1535,1018,2,-46,15,-30,25,3,73,-10]},{"c":"c","n":77,"p":[-331,-336,-148,-22]},{"c":"c","n":78,"p":[-1558,755,-27,16,-84,19,-14,-3,-18,-18,-29,-45,-9,-23,-13,-62,-39,-127,-8,-77]},{"c":"c","n":79,"p":[1130,636,-116,-410,-13,-62]},{"c":"c","n":80,"p":[-265,1030,14,19,38,86,21,33,33,99]},{"c":"c","n":81,"p":[-1621,1044,3,-36]},{"c":"c","n":82,"p":[-28,218,-217,320,-10,6,-115,-1,-75,-55]},{"c":"c","n":83,"p":[1573,-346,53,-14]},{"c":"c","n":84,"p":[128,927,-13,-33,-75,-266,-27,-71]},{"c":"b","n":85,"p":[-757,-321,182,-214]},{"c":"c","n":85,"p":[-588,-551,22,-181]},{"c":"b","n":86,"p":[-1377,1198,-34,-237,-9,-26,-138,-180,-22,-53,-84,-392,-35,-275,-54,-140]},{"c":"c","n":87,"p":[-172,431,-53,-45]},{"c":"c","n":88,"p":[-1284,75,-407,25]},{"c":"b","n":89,"p":[1705,996,176,15]},{"c":"c","n":90,"p":[1130,636,36,124,6,8,83,330,41,143]},{"c":"c","n":91,"p":[1166,760,-514,147,-488,148]},{"c":"c","n":92,"p":[-771,731,-14,-11,-237,-290]},{"c":"c","n":93,"p":[-1086,-793,-36,59,-48,54]},{"c":"c","n":94,"p":[-989,46,-117,6]},{"c":"c","n":95,"p":[-534,373,-47,-148,-16,-78,-5,-72]},{"c":"b","n":96,"p":[1680,512,-99,-366]},{"c":"c","n":97,"p":[634,-387,31,-268]},{"c":"c","n":98,"p":[-818,852,42,-53,6,-79,18,-51,246,-337,9,-20,1,-80,5,-27,9,-18,168,-238]},{"c":"c","n":99,"p":[1787,-2,-225,60,-17,12]},{"c":"c","n":100,"p":[-1230,522,-203,163]},{"c":"c","n":101,"p":[1265,-221,-308,100]},{"c":"c","n":102,"p":[1359,437,-1270,366]},{"c":"b","n":103,"p":[2071,-435,-55,-52,-38,-24,-156,-63,-27,-24,-52,-102,-15,-13,-21,-8,-18,1,-141,42,-63,-11]},{"c":"c","n":104,"p":[-587,1027,-40,47,-22,1,-438,-87,-280,-48,-53,-5]},{"c":"a","n":105,"p":[-1563,-1098,-52,-57]},{"c":"c","n":106,"p":[237,-800,-92,-15,-70,-30]},{"c":"c","n":107,"p":[-1651,373,-148,62]},{"c":"c","n":108,"p":[527,945,37,121]},{"c":"c","n":109,"p":[248,891,71,258]},{"c":"c","n":110,"p":[407,-322,-141,-19]},{"c":"b","n":111,"p":[1300,215,-269,-45,-875,-172,-470,-49,-79,-33,-221,-112,-471,-400,-162,-160]},{"c":"c","n":112,"p":[1406,1023,-18,11,-12,31,-11,6,-8,-2,-27,-24,-18,5,-11,48,-2,55,-23,12]},{"c":"c","n":113,"p":[-614,-196,141,-172,22,-148,26,-229]},{"c":"c","n":114,"p":[1941,-731,-1,-19,-45,-109,-115,-167,-18,-19]},{"c":"c","n":115,"p":[1709,737,-81,20,-13,14,-7,24]},{"c":"c","n":116,"p":[-1501,1123,-6,-14,1,-89]},{"c":"c","n":117,"p":[835,-714,-38,-129]},{"c":"c","n":118,"p":[-49,-24,-11,-215,25,-218]},{"c":"c","n":119,"p":[1860,267,-231,60]},{"c":"c","n":120,"p":[-831,-85,-21,-107,0,-38,-8,-20,2,-44]},{"c":"c","n":121,"p":[1114,-318,-8,-7,-42,-138]},{"c":"c","n":122,"p":[-37,413,-44,68,-111,217,-22,27,-43,40,-33,44,-29,53,4,47,50,121]},{"c":"c","n":123,"p":[-1060,144,16,160]},{"c":"c","n":124,"p":[-895,784,-10,-21,-248,-303,17,-15,-29,-242]},{"c":"c","n":125,"p":[-1160,-984,-147,164]},{"c":"b","n":126,"p":[-747,921,-72,11,-39,-2,-36,-10,-296,-149,-41,-29,-128,-183,-6,-21,-64,-588,-72,-344,3,-27,22,-59,37,-57,136,-170,56,-49]},{"c":"b","n":127,"p":[-149,-33,-10,79,-14,30,-152,212,-245,401,-271,354,1,45,15,70]},{"c":"c","n":128,"p":[1221,958,-28,13,-15,24,-1,30,22,95,6,17,8,6,21,0,7,-10,8,-33,6,-2]},{"c":"c","n":129,"p":[740,747,-142,-492,-46,-181]},{"c":"c","n":130,"p":[-614,-381,83,-93,11,-50]},{"c":"b","n":131,"p":[372,856,-176,-618]},{"c":"a","n":132,"p":[1680,512,-349,98,-63,11,-114,9,-75,19,-1297,378,-47,3,-80,20,-154,46,-15,11,28,1,253,-73,15,-8]},{"c":"c","n":133,"p":[-516,601,-77,-49,-38,-48,-125,-116,-22,-27,-18,-32,-21,-70]},{"c":"c","n":134,"p":[-368,711,-148,-110]},{"c":"c","n":135,"p":[-705,-786,8,3,32,32,23,9,69,63]},{"c":"b","n":136,"p":[329,-423,37,-281,8,-21]},{"c":"c","n":137,"p":[248,891,-120,-428,-6,-73,11,-127,-3,-7]},{"c":"c","n":138,"p":[-1019,-538,32,-40,-15,-38,1,-22,55,-81,27,-33,19,1,45,40,0,18,-23,35,-58,67,-17,9,-34,4]},{"c":"c","n":139,"p":[356,37,64,-449]},{"c":"c","n":140,"p":[681,-1109,-54,7,-75,0,-61,23,-455,202,-47,24,-8,6,-4,12]},{"c":"c","n":141,"p":[-1566,-42,8,133,52,468,33,84,28,42,12,0]},{"c":"c","n":142,"p":[1268,621,17,119,114,265,49,127,17,61]},{"c":"c","n":143,"p":[-1400,1042,-106,17,-115,-15]},{"c":"c","n":144,"p":[-1195,-706,-123,108]},{"c":"c","n":145,"p":[-194,-230,0,-60,57,-477]},{"c":"c","n":146,"p":[1646,-602,-62,-173]},{"c":"c","n":147,"p":[1261,-328,-147,10]},{"c":"c","n":148,"p":[1200,883,-636,183]},{"c":"c","n":148,"p":[1604,810,-10,9,-243,68]},{"c":"c","n":149,"p":[-188,-338,138,13]},{"c":"c","n":150,"p":[102,847,-163,48,-3,9,6,27]},{"c":"c","n":151,"p":[740,747,140,487]},{"c":"b","n":152,"p":[1680,512,22,85,8,68,-5,331,-3,33,-36,151]},{"c":"c","n":153,"p":[-1682,177,-140,18]},{"c":"c","n":154,"p":[-313,-499,-18,163,43,289]},{"c":"b","n":155,"p":[1375,495,279,-76]},{"c":"c","n":156,"p":[-385,1018,-79,-29,-214,-160]},{"c":"c","n":157,"p":[396,-245,-145,-23]},{"c":"c","n":158,"p":[-224,-721,-7,86]},{"c":"c","n":159,"p":[-447,136,-92,-75,-32,-5,-12,4,-439,370]},{"c":"c","n":160,"p":[847,649,58,-17]},{"c":"c","n":161,"p":[-1003,-318,1,-29,-10,-18,-14,-5,-38,-1]},{"c":"c","n":162,"p":[1626,-360,63,197]},{"c":"c","n":163,"p":[740,-824,501,-154]},{"c":"c","n":96,"p":[1581,146,-21,-59,-15,-17,-62,-40,-15,-19,-9,-22]},{"c":"c","n":164,"p":[1155,-567,0,-48,-7,-49]},{"c":"c","n":165,"p":[1134,-496,122,-4]},{"c":"b","n":131,"p":[156,-2,99,-970,-4,-84,-32,-139]},{"c":"b","n":166,"p":[196,238,-43,-155,3,-85]},{"c":"c","n":167,"p":[-919,-752,-16,-23,-47,-109]},{"c":"c","n":168,"p":[-853,-199,-17,-7,-58,-1,-3,67,-80,-3]},{"c":"c","n":169,"p":[-1278,-499,43,73,34,31]},{"c":"a","n":111,"p":[-1247,-756,-150,-156,-17,-28,-149,-158]},{"c":"r","n":170,"p":[1970,-468,-215,30,-441,0,-58,-4,-77,-14,-78,-28,-422,-183,-62,-20,-152,-29,-610,-70,-128,-23,-60,-19,-82,-35,-247,-120,-308,-116,-321,-113,-74,-16,-77,-6,-89,6,-88,20,-364,150,-122,35,-832,140,-92,20,-104,40,-546,251,-61,25,-58,17,-724,105]},{"c":"a","n":105,"p":[-1649,-1168,59,73]},{"c":"b","n":171,"p":[1941,-731,-305,-196,-45,-59,-116,-172,-28,-49]},{"c":"c","n":22,"p":[-314,1043,-20,27,-57,53,-10,69]},{"c":"c","n":71,"p":[-575,-535,-13,-16,-194,-158,-18,-44]},{"c":"a","n":111,"p":[-1590,-1095,123,131,41,35,29,17]},{"c":"c","n":172,"p":[-1674,911,-14,20,-68,38]},{"c":"c","n":169,"p":[-229,958,-14,-10]},{"c":"c","n":28,"p":[-84,1119,108,-27,7,-6]},{"c":"b","n":71,"p":[-42,-467,-521,-63,-12,-5]},{"c":"c","n":118,"p":[-32,-475,35,-273]},{"c":"r","n":173,"p":[489,-3541,-76,306,-12,62,-4,68,6,66,92,647,27,121,160,336,45,71,55,61,271,247,61,82,40,70,26,78,79,396,18,66,32,77,37,67,93,84,72,40]},{"c":"c","n":70,"p":[1482,852,19,62,35,56,16,35,4,22,-5,75,14,63]},{"c":"c","n":174,"p":[1156,228,104,352,8,41]},{"c":"c","n":161,"p":[-1074,-361,0,0]},{"c":"b","n":175,"p":[-614,-196,-69,80,-16,13,-23,9,-926,59,-32,4,-104,28]},{"c":"b","n":86,"p":[-1756,-834,36,-36,210,-172]},{"c":"c","n":135,"p":[-574,-673,139,17]},{"c":"c","n":100,"p":[-1233,516,80,-56]},{"c":"c","n":176,"p":[1143,-725,-25,-71]},{"c":"c","n":65,"p":[1563,-377,-60,-16]},{"c":"r","n":169,"p":[263,-739,74,-3,53,-19]},{"c":"c","n":177,"p":[-1087,988,-290,210]},{"c":"c","n":178,"p":[848,1121,45,-13,37,8,46,-15]},{"c":"c","n":179,"p":[-1912,768,43,58,28,24,33,11,82,13,52,37,28,9,69,0,59,22]},{"c":"c","n":180,"p":[-1837,714,40,-14,57,-9]},{"c":"b","n":169,"p":[1820,11,-19,4,-11,-7]},{"c":"b","n":181,"p":[616,784,72,246,33,129]},{"c":"c","n":182,"p":[-1547,929,6,-14,22,3,5,7,-4,17]},{"c":"c","n":169,"p":[1351,887,-38,15]},{"c":"c","n":115,"p":[1628,757,-28,7]},{"c":"b","n":44,"p":[1401,590,-101,-375]},{"c":"b","n":183,"p":[1636,-927,126,-118,212,-215,130,-106,18,-8]},{"c":"a","n":184,"p":[1680,512,46,-11,10,-9,72,-20,16,2,-12,9,-73,20,-13,-2]},{"c":"c","n":169,"p":[-94,375,-6,-51]},{"c":"c","n":185,"p":[1629,327,-138,37,-37,5,-106,27]},{"c":"c","n":186,"p":[1808,79,-70,-264]},{"c":"b","n":187,"p":[1654,419,183,-48]},{"c":"r","n":169,"p":[1052,-507,156,49,48,8,123,3]},{"c":"r","n":169,"p":[1668,-456,-36,-1,-83,11]},{"c":"r","n":169,"p":[1549,-446,77,1]},{"c":"r","n":169,"p":[1534,-446,15,0]},{"c":"r","n":169,"p":[1420,-447,114,1]},{"c":"r","n":169,"p":[1379,-447,41,0]},{"c":"r","n":169,"p":[907,-565,239,103]},{"c":"r","n":169,"p":[841,-599,46,25]},{"c":"r","n":169,"p":[887,-574,20,9]},{"c":"r","n":169,"p":[1128,-478,108,30,142,6]},{"c":"r","n":169,"p":[1690,-436,-51,-5]},{"c":"r","n":169,"p":[1550,-441,177,0]},{"c":"r","n":169,"p":[1535,-441,15,0]},{"c":"r","n":169,"p":[1419,-442,116,1]},{"c":"r","n":169,"p":[1378,-442,41,0]},{"c":"r","n":169,"p":[-3212,-787,121,-60,73,-24,902,-154,53,-13,98,-32,338,-140,99,-23,92,-5,71,5,104,25,548,198,363,170,98,30,146,28]},{"c":"r","n":169,"p":[-1178,-1184,501,184,179,86,61,34]},{"c":"r","n":169,"p":[-517,-923,-80,-44,-114,-51,-198,-73,-100,-32]},{"c":"r","n":169,"p":[-972,-1113,100,27,125,44,64,28]},{"c":"r","n":169,"p":[-638,-986,-57,-41,-37,-18,-137,-48,-138,-35,-265,-94,-72,-17,-124,-14,-121,-31,-43,-25,-37,-35,-32,-55,-31,-84]},{"c":"r","n":169,"p":[-1061,-1146,170,42,219,75]},{"c":"r","n":169,"p":[-689,-1040,-191,-66,-103,-26,-43,-6]},{"c":"c","n":188,"p":[-114,997,63,244]},{"c":"b","n":86,"p":[-1449,939,9,-16,-1,-17]},{"c":"b","n":14,"p":[-486,1108,-254,-197]},{"c":"c","n":169,"p":[750,-791,-111,35]},{"c":"c","n":169,"p":[525,-810,18,35,14,11,53,14,29,-6]},{"c":"b","n":169,"p":[1628,-909,12,-8,13,0]},{"c":"c","n":148,"p":[319,1149,-120,29]},{"c":"a","n":132,"p":[-514,1107,-240,70]},{"c":"c","n":169,"p":[-397,970,-17,24,-15,9]},{"c":"b","n":169,"p":[-152,-3,22,-28]},{"c":"b","n":169,"p":[-173,-36,21,33]},{"c":"b","n":169,"p":[-1733,-55,-14,43]},{"c":"c","n":169,"p":[1396,6,127,-34]},{"c":"c","n":185,"p":[1469,369,-119,36]}]};
const FAMILIES=[
{k:'rock',label:'Rock',genres:['Rock']},
{k:'loud',label:'Metal / punk',genres:['Metal/punk'],color:'rock'},
{k:'indie',label:'Indie & pop',genres:['Indie','Pop']},
{k:'folk',label:'Folk, country, songwriter',genres:['Folk','Country','Acoustic/singer-songwriter']},
{k:'jazz',label:'Jazz & classical',genres:['Jazz','Classical']},
{k:'elec',label:'Electronic & hip-hop',genres:['Electronic/experimental','Hip-hop/rap']},
{k:'other',label:'Everything else',genres:['Other']},
];
const famOf={};FAMILIES.forEach(f=>f.genres.forEach(g=>famOf[g]=f));
function famColor(f){return `var(--g-${f.k==='loud'?'rock':f.k})`}
function gColor(g){return famColor(famOf[g]||FAMILIES[6])}
const HOURS=[1,2,3,4,5,6,7];
const P=DATA.porches, A=DATA.acts;
A.forEach((a,i)=>{a.id=i;a.porch=P[a.p];(P[a.p].acts||(P[a.p].acts=[])).push(a)});
P.forEach((p,i)=>{p.id=i;p.acts.sort((a,b)=>a.t-b.t)});
// ---------- state ----------
const store={get(k,d){try{const v=localStorage.getItem(k);return v?JSON.parse(v):d}catch(e){return d}},set(k,v){try{localStorage.setItem(k,JSON.stringify(v))}catch(e){}}};
const nowInfo=(()=>{const d=new Date();const fmt=new Intl.DateTimeFormat('en-US',{timeZone:'America/New_York',year:'numeric',month:'2-digit',day:'2-digit',hour:'numeric',minute:'numeric',hour12:false});const parts=Object.fromEntries(fmt.formatToParts(d).map(x=>[x.type,x.value]));const isDay=parts.year==='2026'&&parts.month==='10'&&parts.day==='18';const h=+parts.hour%24,m=+parts.minute;let hr=null;if(isDay){if(h===12&&m>=30)hr=1;else if(h>=13&&h<=19){hr=h-12;if(m>=45&&hr<7)hr++}}return {isDay,hour:hr}})();
const S={hour:nowInfo.hour||1,view:'lineup',q:'',hood:'',fams:new Set(FAMILIES.map(f=>f.k)),porch:null,stars:new Set(store.get('pf26-stars',[])),hl:null};
function saveStars(){store.set('pf26-stars',[...S.stars])}
// ---------- map geometry ----------
const svg=document.getElementById('map'), world=document.getElementById('world');
const names=STREETS.names;
const ways=STREETS.ways.map(w=>{const pts=[];let x=w.p[0],y=w.p[1];pts.push([x,y]);for(let i=2;i<w.p.length;i+=2){x+=w.p[i];y+=w.p[i+1];pts.push([x,y])}return {c:w.c,n:names[w.n],pts}});
const NS='http://www.w3.org/2000/svg';
function el(tag,attrs,parent){const e=document.createElementNS(NS,tag);for(const k in attrs)e.setAttribute(k,attrs[k]);parent&&parent.appendChild(e);return e}
function pathD(pts){return 'M'+pts.map(p=>p.join(',')).join('L')}
const order={r:0,c:1,b:2,a:3};
const sorted=[...ways].sort((a,b)=>order[a.c]-order[b.c]);
const gCases=document.getElementById('cases'),gStreets=document.getElementById('streets'),gLabels=document.getElementById('labels');
sorted.forEach(w=>{const d=pathD(w.pts);if(w.c!=='r')el('path',{d,class:'st case '+w.c},gCases);el('path',{d,class:'st '+w.c},gStreets)});
// street labels: longest segment per name
const len=pts=>{let s=0;for(let i=1;i<pts.length;i++)s+=Math.hypot(pts[i][0]-pts[i-1][0],pts[i][1]-pts[i-1][1]);return s};
const bestBy={};ways.forEach(w=>{if(!w.n||w.c==='r')return;const L=len(w.pts);if(!bestBy[w.n]||bestBy[w.n].L<L)bestBy[w.n]={w,L}});
const shortName=n=>n.replace(/^North /,'N ').replace(/^South /,'S ').replace(/^West /,'W ').replace(/^East /,'E ').replace(/ Avenue$/,' Ave').replace(/ Street$/,' St').replace(/ Drive$/,' Dr').replace(/Doctor Martin Luther King Junior Parkway/,'MLK Pkwy');
const labelEls=[];
Object.values(bestBy).forEach(({w,L},i)=>{if(L<180)return;let pts=w.pts;if(pts[pts.length-1][0]<pts[0][0])pts=[...pts].reverse();const id='sp'+i;el('path',{id,d:pathD(pts),fill:'none',stroke:'none'},gLabels);const t=el('text',{class:'lbl'},gLabels);const tp=el('textPath',{href:'#'+id,startOffset:'50%','text-anchor':'middle'},t);tp.textContent=shortName(w.n);labelEls.push({t,c:w.c,L})});
// neighborhood labels
const hoodEls=[];const hoods={};P.forEach(p=>{(hoods[p.h]||(hoods[p.h]={x:0,y:0,n:0}));hoods[p.h].x+=p.x;hoods[p.h].y+=p.y;hoods[p.h].n++});
const hoodNudge={'Cobbham':[0,60],'Pulaski Heights':[60,0],'Reese Hancock':[0,90],'Newtown':[60,-40],'Boulevard':[0,30],'Normaltown':[-40,40],'Buena Vista Heights':[0,-60]};
Object.entries(hoods).forEach(([h,v])=>{const n=hoodNudge[h]||[0,0];const t=el('text',{class:'hood',x:v.x/v.n+n[0],y:v.y/v.n+n[1]},document.getElementById('hoods'));t.textContent=h;hoodEls.push(t)});
const hoodSel=document.getElementById('hood');Object.keys(hoods).sort().forEach(h=>{const o=document.createElement('option');o.value=h;o.textContent=`${h} (${P.filter(p=>p.h===h).length} porches)`;hoodSel.appendChild(o)});
// view transform
const B={x0:Math.min(...P.map(p=>p.x))-120,x1:Math.max(...P.map(p=>p.x))+120,y0:Math.min(...P.map(p=>p.y))-170,y1:Math.max(...P.map(p=>p.y))+120};
let V={k:1,tx:0,ty:0};
function size(){const r=svg.getBoundingClientRect();return {w:r.width,h:r.height}}
function fitTo(b,pad=30){const {w,h}=size();if(!w||!h)return;const k=Math.min((w-pad*2)/(b.x1-b.x0),(h-pad*2)/(b.y1-b.y0));V.k=k;V.tx=w/2-k*(b.x0+b.x1)/2;V.ty=h/2-k*(b.y0+b.y1)/2;apply()}
function clampK(k){const {w,h}=size();const kmin=Math.min(w/(B.x1-B.x0),h/(B.y1-B.y0))*0.6;return Math.max(kmin,Math.min(k,kmin*14))}
function zoomAt(f,cx,cy){const k2=clampK(V.k*f);f=k2/V.k;V.tx=cx-(cx-V.tx)*f;V.ty=cy-(cy-V.ty)*f;V.k=k2;apply()}
function apply(){world.setAttribute('transform',`translate(${V.tx},${V.ty}) scale(${V.k})`);const k=V.k;
const fs=11.5/k;labelEls.forEach(l=>{const show=l.c==='a'||l.c==='b'?k>0.18:k>0.42&&l.L>260;l.t.style.display=show?'':'none';l.t.setAttribute('font-size',fs);l.t.style.strokeWidth=(3/k)+'px'});
hoodEls.forEach(t=>{t.setAttribute('font-size',Math.max(15,Math.min(30,26*Math.sqrt(k/0.25)))/k)});
renderPinsScale()}
// pan / pinch / wheel
const ptrs=new Map();let last=null,moved=false;
let down=null;
svg.addEventListener('pointerdown',e=>{ptrs.set(e.pointerId,{x:e.clientX,y:e.clientY});down={x:e.clientX,y:e.clientY};moved=false;if(ptrs.size>1)moved=true});
svg.addEventListener('pointermove',e=>{if(!ptrs.has(e.pointerId)||!down)return;if(!moved&&Math.hypot(e.clientX-down.x,e.clientY-down.y)>5){moved=true}if(moved&&!svg.hasPointerCapture(e.pointerId)){try{svg.setPointerCapture(e.pointerId)}catch(_){}svg.classList.add('drag')}},true);
svg.addEventListener('pointermove',e=>{if(!ptrs.has(e.pointerId))return;const prev=ptrs.get(e.pointerId);const cur={x:e.clientX,y:e.clientY};ptrs.set(e.pointerId,cur);
if(ptrs.size===1){const dx=cur.x-prev.x,dy=cur.y-prev.y;if(moved&&Math.abs(dx)+Math.abs(dy)>0){V.tx+=dx;V.ty+=dy;apply()}}
else if(ptrs.size===2){const [a,b]=[...ptrs.values()];const other=[...ptrs.entries()].find(([id])=>id!==e.pointerId)[1];const d1=Math.hypot(prev.x-other.x,prev.y-other.y),d2=Math.hypot(a.x-b.x,a.y-b.y);const r=svg.getBoundingClientRect();if(d1>0)zoomAt(d2/d1,(a.x+b.x)/2-r.left,(a.y+b.y)/2-r.top);moved=true}});
function endPtr(e){ptrs.delete(e.pointerId);if(!ptrs.size)svg.classList.remove('drag')}
svg.addEventListener('pointerup',endPtr);svg.addEventListener('pointercancel',endPtr);
svg.addEventListener('wheel',e=>{e.preventDefault();const r=svg.getBoundingClientRect();zoomAt(Math.exp(-e.deltaY*0.0018),e.clientX-r.left,e.clientY-r.top)},{passive:false});
document.getElementById('zin').onclick=()=>{const {w,h}=size();zoomAt(1.5,w/2,h/2)};
document.getElementById('zout').onclick=()=>{const {w,h}=size();zoomAt(1/1.5,w/2,h/2)};
document.getElementById('zfit').onclick=()=>fitTo(B);
function panTo(p,minK){const {w,h}=size();if(minK&&V.k<minK){V.k=clampK(minK)}V.tx=w/2-V.k*p.x;V.ty=h/2-V.k*p.y;apply()}
// ---------- filtering ----------
function matchQ(a){if(!S.q)return true;const q=S.q.toLowerCase();return [a.n,a.g,a.host,a.porch.a,a.porch.h,a.d,...a.porch.hosts].some(s=>s&&s.toLowerCase().includes(q))}
function famOn(a){return S.fams.has((famOf[a.g]||FAMILIES[6]).k)}
function passes(a){return famOn(a)&&matchQ(a)&&(!S.hood||a.porch.h===S.hood)}
function visibleActs(){if(S.view==='plan')return A.filter(a=>S.stars.has(a.id)).sort((x,y)=>x.t-y.t||x.porch.x-y.porch.x);return A.filter(a=>passes(a)&&(S.hour===0||a.t===S.hour))}
// ---------- pins ----------
const LANDMARKS=[
{a:'108 Park Ave',name:'Athentic Brewing',note:'Food truck park',kind:'truck',title:'Food Truck Park',when:'12–7pm',desc:'Local food trucks all afternoon. TH3R4 plays at 3pm and Noise Mountain at 5pm.',merch:'12:30–6pm'},
{a:'425 Barber Street',name:'Normaltown Brewing',note:'Indie South market',kind:'palette',title:'Indie South Vendor Market',when:'12–7pm',desc:'An artisan market with vintage and handmade goods.',merch:'12:30–6:30pm'},
{a:'890 Boulevard Avenue',name:'Good Shepherd Kids Zone',note:'Free · 1–5pm',kind:'kids',title:'Good Shepherd Kids Zone',when:'1–5pm · free',desc:'Music, crafts, yard games, drinks and snacks, a calm corner, a photo booth, temporary tattoos and more. Rebecca Sunshine Band plays 2–3pm in the Good Shepherd backyard on Tibbets Ave.'},
{a:'489 Prince Avenue',name:'Old Fire Hall No. 2',note:'Merch · 12:30–6pm',kind:'shirt',title:'Historic Athens merch table',when:'12:30–6pm',desc:'Official Porchfest merch, sold in person only, at Historic Athens\' Old Fire Hall No. 2. Bichos Vivos plays here at 6pm.'},
{a:'650 Pulaski St',name:"Mayors' Show",note:'7pm finale',kind:'star',title:"The Mayors' Show",when:'7pm',desc:'The closing show at Stan Mullins Studio. Athens Mayor Kelly Girtz introduces Winterville Mayor and singer-songwriter Dodd Ferrelle. It\'s the only set at 7pm.',merch:'6:30–8pm'},
].map(l=>({...l,p:P.find(p=>p.a===l.a)})).filter(l=>l.p);
const ICONS={
truck:g=>{el('path',{class:'ic',d:'M-8.5,-5.5h11v9h-11zM3.2,-2.2h3.4l2.6,2.8v6.2h-6z'},g);el('path',{class:'icbg',d:'M-6.8,-3.6h7.2v3h-7.2zM4.6,-0.8h1.6l1.4,1.5v.8h-3z'},g);[[-4.6,4.8],[5.2,4.8]].forEach(([cx,cy])=>{el('circle',{class:'ic',cx,cy,r:2.4},g);el('circle',{class:'icbg',cx,cy,r:1},g)})},
kids:g=>{el('ellipse',{class:'ic',cx:0,cy:-2.6,rx:5.6,ry:6.4},g);el('path',{class:'ic',d:'M-1.4,3.4h2.8l-1.4,2z'},g);el('path',{d:'M0,5.4c-1.6,1.6 1.6,2.4 0,4',fill:'none',class:'icstroke'},g);el('ellipse',{class:'icbg',cx:-2,cy:-4.6,rx:1.3,ry:2},g)},
shirt:g=>{el('path',{class:'ic',d:'M-3.4,-7.6L-9,-4.6L-6.8,0L-4.8,-1V8H4.8V-1L6.8,0L9,-4.6L3.4,-7.6C2.6,-5.4 -2.6,-5.4 -3.4,-7.6Z'},g)},
star:g=>{el('path',{class:'ic',d:'M0,-9L2.6,-3.1L9,-2.8L4,1.4L5.6,7.8L0,4.3L-5.6,7.8L-4,1.4L-9,-2.8L-2.6,-3.1Z'},g)},
palette:g=>{el('path',{class:'ic',d:'M0,-8.5C6.2,-8.5 9.2,-4.5 9.2,-0.4C9.2,3 6.6,3.3 4.6,3.1C2.6,2.9 2,4.6 3,6.1C4.1,7.9 2.4,9.2 0,9.2C-6,9.2 -9.2,5 -9.2,0C-9.2,-5.1 -5.2,-8.5 0,-8.5Z'},g);[[-4.4,-2.6],[0.4,-5.2],[5,-2.4],[-4.8,2.8]].forEach(([cx,cy])=>el('circle',{class:'icbg',cx,cy,r:1.7},g))},
paw:g=>{el('ellipse',{class:'ic',cx:0,cy:3.4,rx:4.8,ry:4},g);[[-5.6,-1.6,2.1],[-2.2,-5.8,2.3],[2.2,-5.8,2.3],[5.6,-1.6,2.1]].forEach(([cx,cy,r])=>el('circle',{class:'ic',cx,cy,r},g))},
};
function closeMarks(){document.querySelectorAll('.mark.open').forEach(m=>m.classList.remove('open'))}
function makeMark({x,y,dy=0,kind,cls='',name,note,title,onOpen}){
const g=el('g',{class:'mark '+cls,transform:`translate(${x},${y})`},document.getElementById('marks'));const inner=el('g',{},g);
if(dy)el('line',{class:'stem',x1:0,y1:-5,x2:0,y2:dy+12},inner);
const wrap=el('g',{transform:`translate(0,${dy})`},inner);
const call=el('g',{class:'call',role:'button'},wrap);const w=Math.max(name.length*7.4,note.length*8)+40;
el('line',{x1:0,y1:-14,x2:0,y2:-24},call);el('rect',{x:-w/2,y:-64,width:w,height:40,rx:8},call);
const t1=el('text',{class:'mn',x:-9,y:-47,'text-anchor':'middle'},call);t1.textContent=name;const t2=el('text',{class:'mt',x:-9,y:-32,'text-anchor':'middle'},call);t2.textContent=note;
const ch=el('text',{class:'mn chev',x:w/2-15,y:-39,'text-anchor':'middle'},call);ch.textContent='›';
const badge=el('g',{class:'badge'},wrap);el('circle',{class:'bg',r:13},badge);ICONS[kind](el('g',{},badge));
el('title',{},badge).textContent=title||`${name}: ${note}`;
badge.addEventListener('click',e=>{if(moved)return;e.stopPropagation();const open=!g.classList.contains('open');closeMarks();if(open){g.classList.add('open');g.parentNode.appendChild(g)}});
call.addEventListener('click',e=>{if(moved)return;e.stopPropagation();closeMarks();onOpen()});
return inner}
const markEls=LANDMARKS.map(l=>{l.p.landmark=l;return makeMark({x:l.p.x,y:l.p.y,dy:-24,kind:l.kind,name:l.name,note:l.note,title:`${l.name}: ${l.note} · ${l.p.a}`,onOpen:()=>openPorch(l.p.id)})});
const PARADE=(()=>{const ROUTE=[[887,-361],[420,-412],[386,-165],[445,-156],[618,-88],[685,-76],[741,-376],[887,-361]];const segs=[{pts:ROUTE}];const g=document.getElementById('paradeG');segs.forEach(w=>{const p=el('path',{d:pathD(w.pts),class:'parade'},g);el('title',{},p).textContent='Boo-le-Bark pet parade route, 4:30pm';p.addEventListener('click',e=>{if(moved)return;e.stopPropagation();openEvent()})});
const best=segs.reduce((a,b)=>len(b.pts)>len(a.pts)?b:a);let half=len(best.pts)/2,lx=best.pts[0][0],ly=best.pts[0][1];for(let i=1;i<best.pts.length;i++){const [x0,y0]=best.pts[i-1],[x1,y1]=best.pts[i];const L=Math.hypot(x1-x0,y1-y0);if(half<=L){lx=x0+(x1-x0)*half/L;ly=y0+(y1-y0)*half/L;break}half-=L}
const all=segs.flatMap(w=>w.pts).filter(([x,y])=>x>B.x0-200&&x<B.x1+200);const bounds={x0:Math.min(...all.map(p=>p[0]))-60,x1:Math.max(...all.map(p=>p[0]))+60,y0:Math.min(...all.map(p=>p[1]))-160,y1:Math.max(...all.map(p=>p[1]))+80};
const name='Boo-le-Bark pet parade';lx=ROUTE[0][0];ly=ROUTE[0][1];markEls.push(makeMark({x:lx,y:ly,kind:'paw',cls:'pm',name,note:'4:30pm · starts here',onOpen:()=>openEvent()}));
// direction arrows at the middle of each leg
for(let i=0;i<ROUTE.length-1;i++){const [x0,y0]=ROUTE[i],[x1,y1]=ROUTE[i+1];if(Math.hypot(x1-x0,y1-y0)<120)continue;const a=Math.atan2(y1-y0,x1-x0)*180/Math.PI;const ag=el('g',{transform:`translate(${(x0+x1)/2},${(y0+y1)/2}) rotate(${a})`},g);const inner=el('g',{},ag);el('path',{class:'parrow',d:'M-7,-9 L6,0 L-7,9'},inner);markEls.push(inner)}
return {name,lx,ly,bounds,route:ROUTE,paths:[...g.children]}})();
const byAddr=a=>P.find(p=>p.a===a);
const TROLLEY=[
{name:'Historic Athens',where:'Hill St at Prince Ave',p:byAddr('489 Prince Avenue')},
{name:'Hancock & Rocksprings',where:'W Hancock Ave at N Rocksprings St',x:56,y:687},
{name:'Holman & Price',where:'Holman Ave at Price Ave',x:-1115,y:675},
{name:'Holman & Edwards',where:'Holman Ave at Edwards Dr',x:-1268,y:209},
{name:'Athentic Brewing',where:'108 Park Ave',p:byAddr('108 Park Ave')},
{name:'Boulevard & Park Ave',where:'Boulevard at Park Ave',x:-313,y:-499},
{name:'Boulevard & Chase',where:'Boulevard at N Chase St',x:200,y:-439},
{name:'175 Tracy St',where:'Mill district courtyard',p:byAddr('175 Tracy St')},
{name:'425 Barber St',where:'Normaltown Brewing',p:byAddr('425 Barber Street')},
].map((s,i)=>({...s,n:i+1,x:s.p?s.p.x:s.x,y:s.p?s.p.y:s.y}));
document.getElementById('trolleyRoute').setAttribute('d',pathD([...TROLLEY,TROLLEY[0]].map(s=>[s.x,s.y])));
const stopEls=TROLLEY.map((s,i)=>{const g=el('g',{class:'tstop',transform:`translate(${s.x},${s.y})`},document.getElementById('tstops'));const inner=el('g',{},g);
el('rect',{x:-11,y:-11,width:22,height:22,rx:5},inner);const t=el('text',{y:4.5},inner);t.textContent=s.n;el('title',{},g).textContent=`Trolley stop ${s.n}: ${s.name}`;
g.addEventListener('click',e=>{if(moved)return;e.stopPropagation();openStop(i)});return {g,inner}});
const GEO={lat0:33.962,lng0:-83.395};GEO.kx=111320*Math.cos(GEO.lat0*Math.PI/180);GEO.ky=110574;
const meDist=p=>S.me?Math.hypot(p.x-S.me.x,p.y-S.me.y):0;
const walkMin=p=>{const m=meDist(p);return m<30?'here':`${Math.max(1,Math.round(m*1.3/80))} min`};
let geoWatch=null,geoFirst=true;
function toast(msg){const t=document.getElementById('toast');t.textContent=msg;t.hidden=false;clearTimeout(toast.t);toast.t=setTimeout(()=>t.hidden=true,4200)}
function drawMe(){const g=document.getElementById('me');g.innerHTML='';if(!S.me)return;el('circle',{class:'acc',cx:S.me.x,cy:S.me.y,r:Math.min(S.me.acc,400)},g);el('circle',{class:'dot',cx:S.me.x,cy:S.me.y,r:0},g);renderPinsScale()}
function stopLocate(){if(geoWatch!=null)navigator.geolocation.clearWatch(geoWatch);geoWatch=null;S.me=null;drawMe();document.getElementById('zloc').setAttribute('aria-pressed','false');render()}
function startLocate(){if(!navigator.geolocation){toast('This browser can\'t share your location.');return}
const btn=document.getElementById('zloc');btn.setAttribute('aria-pressed','true');geoFirst=true;
try{geoWatch=navigator.geolocation.watchPosition(pos=>{const {latitude:lat,longitude:lng,accuracy}=pos.coords;S.me={x:(lng-GEO.lng0)*GEO.kx,y:(GEO.lat0-lat)*GEO.ky,acc:accuracy||30};drawMe();
const inside=S.me.x>B.x0-1500&&S.me.x<B.x1+1500&&S.me.y>B.y0-1500&&S.me.y<B.y1+1500;
if(geoFirst){geoFirst=false;if(inside){panTo(S.me,0.45);toast('Lists now show the nearest porches first.')}else toast('You\'re outside the Porchfest area, so distances will be long.')}
render()},err=>{btn.setAttribute('aria-pressed','false');geoWatch=null;S.me=null;drawMe();render();toast(err.code===1?'Location is turned off for this page. Allow it in your browser settings to see nearby porches.':'Couldn\'t find your location. Try again outside or in a minute.')},{enableHighAccuracy:true,maximumAge:15000,timeout:20000})}catch(e){btn.setAttribute('aria-pressed','false');toast('Location isn\'t available here.')}}
function nearestStop(p){let best=null;TROLLEY.forEach(s=>{const d=Math.hypot(s.x-p.x,s.y-p.y);if(!best||d<best.d)best={s,d}});return best}
const gPins=document.getElementById('pins');const pinEls=[];
P.forEach(p=>{const g=el('g',{class:'pin',transform:`translate(${p.x},${p.y})`},gPins);g.dataset.id=p.id;
const halo=el('circle',{class:'halo',r:0},g),ring=el('circle',{class:'ring',r:0},g),sr=el('circle',{class:'starring',r:0},g),dot=el('circle',{class:'dot',r:0},g);
const ttl=el('title',{},g);
g.addEventListener('click',e=>{if(moved)return;e.stopPropagation();openPorch(p.id)});
pinEls[p.id]={g,halo,dot,ring,sr,ttl,state:null}});
function renderPins(){const vis=visibleActs();const byP=new Map();vis.forEach(a=>{if(!byP.has(a.p))byP.set(a.p,[]);byP.get(a.p).push(a)});
P.forEach(p=>{const pe=pinEls[p.id];const acts=byP.get(p.id);let st;
if(acts){const a=acts[0];st={on:true,color:gColor(a.g),star:acts.some(x=>S.stars.has(x.id))||(S.view==='lineup'&&p.acts.some(x=>S.stars.has(x.id)&&(S.hour===0||x.t===S.hour)))};pe.ttl.textContent=acts.map(x=>`${x.t}pm ${x.n}`).join('\n')+'\n'+p.a}
else{const anyMatch=S.view==='lineup'&&p.acts.some(passes);st={on:false,ghost:!anyMatch};pe.ttl.textContent=p.a+' — '+p.acts.map(x=>`${x.t}pm ${x.n}`).join(', ')}
st.sel=S.porch===p.id||(S.open!=null&&A[S.open].p===p.id);st.hl=S.hl===p.id;pe.state=st;
pe.g.classList.toggle('off',!st.on);pe.g.classList.toggle('sel',st.sel);
pe.dot.style.fill=st.on?st.color:'';pe.g.style.opacity=st.on||st.sel?1:st.ghost?0.25:0.7;
if(st.on||st.sel)gPins.appendChild(pe.g)});
// keep selected on top
if(S.porch!=null)gPins.appendChild(pinEls[S.porch].g);
renderRoute();renderPinsScale()}
function renderPinsScale(){const k=V.k;markEls.forEach(m=>m.setAttribute('transform',`scale(${1/k})`));const md=document.querySelector('#me .dot');if(md){md.setAttribute('r',7/k);md.setAttribute('stroke-width',3/k)}stopEls.forEach((s,i)=>{s.inner.setAttribute('transform',`scale(${Math.min(1.15,Math.max(.75,Math.sqrt(k/0.3)))/k})`);s.g.classList.toggle('sel',S.stop===i)});const z=Math.min(1.35,Math.max(.8,Math.sqrt(k/0.25)));
pinEls.forEach(pe=>{const s=pe.state;if(!s)return;const r=(s.on?7:3.6)*z*(s.hl?1.35:1)/k;
pe.dot.setAttribute('r',r);pe.dot.setAttribute('stroke-width',(s.on?2:1)/k);
pe.halo.setAttribute('r',s.on&&S.view==='lineup'?r*2.1:0);
pe.ring.setAttribute('r',s.sel?r+5/k:0);pe.ring.setAttribute('stroke-width',2.5/k);
pe.sr.setAttribute('r',s.star?r+(s.sel?9:3.5)/k:0);pe.sr.setAttribute('stroke-width',2.5/k)});
document.querySelectorAll('.routeNum').forEach(t=>{t.setAttribute('font-size',12/k);t.setAttribute('stroke-width',3/k);t.setAttribute('dy',-13/k)})}
function planActs(){return A.filter(a=>S.stars.has(a.id)).sort((x,y)=>x.t-y.t||x.porch.x-y.porch.x)}
function renderRoute(){const r=document.getElementById('route'),nums=document.getElementById('routeNums');nums.innerHTML='';
const pl=planActs();if(pl.length<1){r.setAttribute('d','');return}
r.setAttribute('d',pl.length>1?pathD(pl.map(a=>[a.porch.x,a.porch.y])):'');r.style.display=S.view==='plan'||S.hour===0?'':'none';
if(S.view==='plan'){const seen={};pl.forEach((a,i)=>{const key=a.p;const t=el('text',{class:'routeNum',x:a.porch.x,y:a.porch.y},nums);t.textContent=(seen[key]?seen[key]+',':'')+a.t;seen[key]=t.textContent;if(seen[key]!==String(a.t)){/*merge*/}})}}
// ---------- panel ----------
const listEl=document.getElementById('list');
const esc=s=>String(s??'').replace(/[&<>"]/g,c=>({'&':'&amp;','<':'&lt;','>':'&gt;','"':'&quot;'}[c]));
const dist=(a,b)=>Math.hypot(a.x-b.x,a.y-b.y);
function walkText(m){const route=m*1.3;const min=Math.max(1,Math.round(route/80));const mi=(route/1609).toFixed(route<1609?2:1);return `${min} min walk · ${mi} mi`}
function starBtn(a){return `<button class="starbtn" data-star="${a.id}" aria-pressed="${S.stars.has(a.id)}" aria-label="${S.stars.has(a.id)?'Remove from':'Add to'} my day: ${esc(a.n)}">${S.stars.has(a.id)?'★':'☆'}</button>`}
function actRow(a,showTime){return `<div class="act${S.hl===a.p?' hl':''}" data-porch="${a.p}" data-act="${a.id}" tabindex="0" aria-expanded="${S.open===a.id}"><span class="sw" style="background:${gColor(a.g)}"></span><div style="min-width:0"><div class="nm">${esc(a.n)}${a.r?' <span class="rtag" title="Recommended in u/one98d\'s r/Athens primer">r/Athens pick</span>':''}</div><div class="meta">${showTime?`<span class="t">${a.t}pm</span> · `:''}${esc(a.porch.a)} · ${esc(a.g)}${S.me?` · <span class="near">${walkMin(a.porch)}</span>`:''}</div>${S.open===a.id&&S.porch==null?detail(a):''}</div>${starBtn(a)}</div>`}
function render(){
document.querySelectorAll('#hours button').forEach(b=>b.setAttribute('aria-pressed',S.view==='lineup'&&+b.dataset.h===S.hour));
document.getElementById('tabLineup').setAttribute('aria-pressed',S.view==='lineup');document.getElementById('tabPlan').setAttribute('aria-pressed',S.view==='plan');
document.getElementById('planCount').textContent=S.stars.size?S.stars.size:'';
document.getElementById('hours').style.opacity=S.view==='plan'?.5:1;
const st=document.getElementById('status');
if(S.porch!=null){renderPorch(P[S.porch])}
else if(S.help){renderHelp()}
else if(S.event){renderEvent()}
else if(S.stop!=null){renderStop(TROLLEY[S.stop])}
else if(S.view==='plan'){renderPlan()}
else{const vis=visibleActs();
const filtered=S.q||S.hood||S.fams.size<FAMILIES.length;
st.innerHTML=`<span><b>${vis.length}</b> ${vis.length===1?'act':'acts'} ${S.hour?`starting at ${S.hour}pm`:'all day'}${S.me?' · nearest first':''}</span>${filtered?'<button class="linkbtn" id="clear">Clear filters</button>':''}`;
setTimeout(()=>{if(S.view==='lineup'&&S.porch==null&&S.stop==null&&!S.event&&(S.hour===3||S.hour===4||S.hour===0)&&!S.q)listEl.insertAdjacentHTML('afterbegin',S.hour===3?eventRow('contest'):S.hour===0?eventRow('contest')+eventRow():eventRow())});
if(!vis.length){listEl.innerHTML=`<div class="empty"><strong>Nobody matches here</strong>Try another hour, or clear the search and genre filters.</div>`}
else if(S.hour===0){const by={};vis.forEach(a=>(by[a.t]||(by[a.t]=[])).push(a));listEl.innerHTML=Object.keys(by).sort((a,b)=>a-b).map(h=>`<section class="group"><h3><span>${h}pm</span><span>${by[h].length}</span></h3>${by[h].sort(S.me?(a,b)=>meDist(a.porch)-meDist(b.porch):(a,b)=>a.porch.h.localeCompare(b.porch.h)||a.n.localeCompare(b.n)).map(a=>actRow(a,false)).join('')}</section>`).join('')}
else if(S.me){listEl.innerHTML=`<section class="group"><h3><span>Nearest to you</span><span>${vis.length}</span></h3>${[...vis].sort((a,b)=>meDist(a.porch)-meDist(b.porch)).map(a=>actRow(a,false)).join('')}</section>`}
else{const by={};vis.forEach(a=>(by[a.porch.h]||(by[a.porch.h]=[])).push(a));listEl.innerHTML=Object.keys(by).sort().map(h=>`<section class="group"><h3><span>${esc(h)}</span><span>${by[h].length}</span></h3>${by[h].sort((a,b)=>a.n.localeCompare(b.n)).map(a=>actRow(a,false)).join('')}</section>`).join('')}
const c=document.getElementById('clear');if(c)c.onclick=()=>{S.q='';S.hood='';S.fams=new Set(FAMILIES.map(f=>f.k));document.getElementById('q').value='';hoodSel.value='';renderChips();update()};
}
updFiltCount&&updFiltCount();renderPins()}
function linkRow(a){const l=[];if(a.m)l.push(`<a href="${esc(a.m)}" target="_blank" rel="noopener">Listen ↗</a>`);if(a.v)l.push(`<a href="${esc(a.v)}" target="_blank" rel="noopener">Tip the band ↗</a>`);else if(a.vt)l.push(`<span>Tips: ${esc(a.vt)}</span>`);return l.length?`<div class="lk">${l.join('')}</div>`:''}
function renderPorch(p){const st=document.getElementById('status');st.innerHTML=`<button class="linkbtn" id="back">← Back to ${S.view==='plan'?'my day':'the lineup'}</button><span>${p.acts.length} ${p.acts.length===1?'set':'sets'} here</span>`;
document.getElementById('back').onclick=closePorch;
const maps=`https://www.google.com/maps/dir/?api=1&destination=${encodeURIComponent(p.a+', Athens, GA')}&travelmode=walking`;
listEl.innerHTML=`<div class="porch"><h2>${esc(p.a)}</h2><div class="sub">${esc(p.h)} · hosted by ${esc(p.hosts.join(' & '))}</div>${S.me?`<div class="sub"><span class="near">${walkMin(p)==='here'?'You\'re here':walkMin(p)+' walk'}</span> from where you are</div>`:''}${p.landmark?`<div class="lmkcard"><b>${esc(p.landmark.title)}</b><span class="lw">${esc(p.landmark.when)}</span><p>${esc(p.landmark.desc)}</p>${p.landmark.merch?`<span class="mer">Porchfest merch for sale here, ${esc(p.landmark.merch)}. In person only.</span>`:''}</div>`:''}<div class="links"><a href="${maps}" target="_blank" rel="noopener">Walking directions ↗</a></div>${(()=>{const ns=nearestStop(p);return ns.d<700?`<div class="tline"><span class="tnum">${ns.s.n}</span><span>Nearest trolley stop: <button class="tbtn" data-stop="${ns.s.n-1}">${esc(ns.s.name)}</button>, ${ns.d<25?'right here':walkText(ns.d).split(' ·')[0]}</span></div>`:''})()}
${p.acts.map(a=>`<div class="slot${S.view==='lineup'&&a.t===S.hour?' cur':''}"><div class="t">${a.t}pm</div><div style="min-width:0"><div class="nm">${esc(a.n)}</div><div class="g"><span class="sw" style="background:${gColor(a.g)}"></span>${esc(a.g)}${a.host!==p.hosts[0]&&p.hosts.length>1?' · '+esc(a.host):''}</div>${a.d?`<div class="d">${esc(a.d.length>320?a.d.slice(0,300)+'…':a.d)}</div>`:''}${primerBlock(a)}${linkRow(a)}${S.open===a.id&&S.porch==null?detail(a):''}</div>${starBtn(a)}</div>`).join('')}</div>`}
function renderPlan(){const st=document.getElementById('status');const pl=planActs();
let total=0;for(let i=1;i<pl.length;i++)total+=dist(pl[i-1].porch,pl[i].porch);
st.innerHTML=pl.length?`<span><b>${pl.length}</b> picks · about ${walkText(total).replace(' walk','').replace('·','of walking ·')}</span><button class="linkbtn" id="clearPlan">Clear</button>`:'<span>Star sets to build your route</span>';
if(!pl.length){listEl.innerHTML=`<div class="empty"><strong>Your day is open</strong>Tap ☆ next to any band in the lineup or on a porch. They'll show up here in time order with walking times between porches, and the route draws on the map.</div>`;return}
let html='';const byH={};pl.forEach(a=>(byH[a.t]=(byH[a.t]||0)+1));
let evDone=false;
pl.forEach((a,i)=>{if(!evDone&&a.t>=5){html+=eventRow();evDone=true}if(i>0){const d=dist(pl[i-1].porch,a.porch);if(d>1){html+=`<div class="walk">${walkText(d)}</div>`;if(d*1.3>900){const s1=nearestStop(pl[i-1].porch),s2=nearestStop(a.porch);if(s1.s!==s2.s&&s1.d<500&&s2.d<500)html+=`<div class="thint">or take the free trolley: stop ${s1.s.n} (${esc(s1.s.name)}) → stop ${s2.s.n} (${esc(s2.s.name)})</div>`}}}
html+=`<div class="act" data-porch="${a.p}" data-act="${a.id}" tabindex="0" aria-expanded="${S.open===a.id}"><span class="sw" style="background:${gColor(a.g)}"></span><div style="min-width:0"><div class="nm">${esc(a.n)}</div><div class="meta"><span class="t">${a.t}pm</span> · ${esc(a.porch.a)} · ${esc(a.porch.h)}</div>${byH[a.t]>1?`<div class="warn">${byH[a.t]} picks start at ${a.t}pm</div>`:''}${S.open===a.id&&S.porch==null?detail(a):''}</div>${starBtn(a)}</div>`});
if(!evDone)html+=eventRow();
html+=`<div class="plancard">Sets run about 45 minutes, so a 10-minute walk still gets you to the next porch near the top of the hour. Your picks are saved in this browser.</div>`;
listEl.innerHTML=html;
const c=document.getElementById('clearPlan');if(c){c.onclick=()=>{if(c.dataset.arm){S.stars.clear();saveStars();update()}else{c.dataset.arm=1;c.textContent='Tap again to clear all'}}}}
function renderStop(s){const st=document.getElementById('status');st.innerHTML=`<button class="linkbtn" id="back">← Back to ${S.view==='plan'?'my day':'the lineup'}</button><span>Stop ${s.n} of ${TROLLEY.length}</span>`;
document.getElementById('back').onclick=closePorch;
const prev=TROLLEY[(s.n-2+TROLLEY.length)%TROLLEY.length],next=TROLLEY[s.n%TROLLEY.length];
const near=A.filter(a=>(S.view==='plan'||S.hour===0||a.t===S.hour)&&passes(a)).map(a=>({a,d:Math.hypot(a.porch.x-s.x,a.porch.y-s.y)})).filter(o=>o.d<=370).sort((x,y)=>x.a.t-y.a.t||x.d-y.d);
const when=S.view==='lineup'&&S.hour?`at ${S.hour}pm`:'all day';
listEl.innerHTML=`<div class="porch"><div class="tline" style="margin:0 0 6px"><span class="tnum">${s.n}</span><span>Free hop-on, hop-off trolley</span></div><h2>${esc(s.name)}</h2><div class="sub">${esc(s.where)} · Athens Trolley Tours loops all nine stops, 1–7pm</div>
<div class="stopnav"><button class="tbtn" data-stop="${prev.n-1}">← ${prev.n} · ${esc(prev.name)}</button><button class="tbtn" data-stop="${next.n-1}">${next.n} · ${esc(next.name)} →</button></div>
<section class="group"><h3><span>Within a 6-minute walk, ${when}</span><span>${near.length}</span></h3>${near.length?near.map(({a,d})=>`<div class="act" data-porch="${a.p}" data-act="${a.id}" tabindex="0" aria-expanded="${S.open===a.id}"><span class="sw" style="background:${gColor(a.g)}"></span><div style="min-width:0"><div class="nm">${esc(a.n)}</div><div class="meta"><span class="t">${a.t}pm</span> · ${esc(a.porch.a)} · ${d<25?'at the stop':walkText(d).split(' ·')[0]}</div>${S.open===a.id&&S.porch==null?detail(a):''}</div>${starBtn(a)}</div>`).join(''):'<div class="empty">No matching sets this close. Try All day or another hour.</div>'}</section></div>`}
function renderHelp(){const st=document.getElementById('status');st.innerHTML=`<button class="linkbtn" id="back">← Back to ${S.view==='plan'?'my day':'the lineup'}</button><span>How it works</span>`;document.getElementById('back').onclick=closePorch;
const sq=(bg,fg,t)=>`<span class="ico" style="background:${bg};color:${fg};border-radius:5px;font-family:var(--f-mono);font-size:11px;font-weight:600">${t}</span>`;
listEl.innerHTML=`<div class="porch help">
<h2>About this map</h2>
<p class="lede">An interactive map of Historic Athens Porchfest, Sunday, October 18, from 1 to 7pm. It puts all 237 sets on 193 porches on one map, so you can see who's playing near you each hour and plan a walking route through the day.</p>
<p>This is an unofficial fan-made planner, not a Historic Athens site. For the official map and news, visit <a href="https://historicathensporchfest.com" target="_blank" rel="noopener">historicathensporchfest.com ↗</a>.</p>
<h3>Find music by the hour</h3>
<ul>
<li>Tap an hour (1 to 7pm) to light up the porches with a set starting then. <b>All</b> shows the whole day. On the day itself, the page opens on the hour that's about to start.</li>
<li>Dot colors show the genre. Faded dots are porches with nothing at that hour.</li>
<li>Search finds bands, hosts and streets. <b>Filters</b> narrows by neighborhood and genre.</li>
<li>Bands tagged <span class="rtag">r/Athens pick</span> were recommended in u/one98d's primer on Reddit. Open the band to read the note.</li>
</ul>
<h3>Open a band or a porch</h3>
<ul>
<li>Tap a band in the list to see its description, a Listen link, a way to tip, and walking directions.</li>
<li>Tap a dot on the map, or <b>All sets at this porch</b>, to see everything playing at that address through the day.</li>
<li>Drag to move the map. Pinch or use + and − to zoom, and ⤢ to see every porch again.</li>
</ul>
<h3>Plan your day</h3>
<ul>
<li>Tap ☆ next to any band to add it to <b>My day</b>.</li>
<li>My day lists your picks in time order with walking times between porches, warns when two picks start at the same hour, and draws your route on the map.</li>
<li>Your picks are saved in this browser on this device. Plan on the phone you'll carry. Nothing is sent anywhere, and no one else can see your list.</li>
</ul>
<h3>Where am I</h3>
<p>Tap ${'◎'} on the map to show your location as a blue dot. Lists then sort by distance and show how many minutes' walk each porch is. Your location stays on your phone. Tap the button again to turn it off.</p>
<h3>Also on the map</h3>
<ul>
<li>${sq('var(--trolley)','var(--trolley-fg)','1')} A free hop-on, hop-off trolley from Athens Trolley Tours loops nine stops from 1 to 7pm. Tap a stop to see what's playing within a few minutes' walk. The dotted line shows the stop order, not the exact streets.</li>
<li><span class="ico" style="background:var(--mark)"></span> Round icons mark the extras: the Food Truck Park at Athentic Brewing and the Indie South Vendor Market at Normaltown Brewing (both 12 to 7pm), the free Good Shepherd Kids Zone (1 to 5pm), the merch table at Old Fire Hall No. 2, and the Mayors' Show finale at 7pm. Tap an icon for its name, then tap the name for details and that porch's lineup.</li>
<li><span class="ico" style="background:var(--parade)"></span> Athens Pets\' Boo-le-Bark has a costume contest at 3pm at Boulevard Woods Park (298 Barber St), then a costumed pet parade at 4:30pm that loops along Boulevard, Lyndon, Dubose and Grady. Tap the paw for the full route.</li>
</ul>
<h3>Merch</h3>
<p>Official Porchfest merch is sold in person only, on Sunday at:</p>
<ul>
<li>Old Fire Hall No. 2, 489 Prince Ave, 12:30 to 6pm</li>
<li>Athentic Brewing Food Truck Park, 108 Park Ave, 12:30 to 6pm</li>
<li>Indie South Vendor Market at Normaltown Brewing, 425 Barber St, 12:30 to 6:30pm</li>
<li>The Mayors' Show at Stan Mullins Studio, 650 Pulaski St, 6:30 to 8pm</li>
</ul>
<h3>Where the information comes from</h3>
<ul>
<li>The lineup comes from the official Historic Athens Porchfest 2026 schedule as of October 17 at 4:30pm, and the special events and merch times from historicathensporchfest.com. Last-minute changes may not be reflected, so double-check anything you can't miss.</li>
<li>Band notes tagged r/Athens pick are by <a href="${PRIMER.userUrl}" target="_blank" rel="noopener">u/one98d</a>, from the <a href="${PRIMER.url}" target="_blank" rel="noopener">small/large primer to the Porchfest schedule ↗</a>.</li>
<li>Porch locations come from the U.S. Census geocoder, and walking times are rough estimates.</li>
<li>Streets are drawn from <a href="https://www.openstreetmap.org/copyright" target="_blank" rel="noopener">OpenStreetMap</a> data, © OpenStreetMap contributors.</li>
</ul>
<p style="margin-top:18px;color:var(--muted)">Made in Athens by <a href="https://blog.kestrelsnest.social" target="_blank" rel="noopener">Eric Wagoner</a>. Have a great Porchfest, and tip the bands.</p>
</div>`}
function openHelp(){S.porch=null;S.stop=null;S.event=false;S.open=null;S.help=true;render();listEl.scrollTop=0;pushDetail();reveal()}
function eventRow(kind){const c=kind==='contest';return `<button class="evrow" data-event="1"><span class="evdot"></span><span><b>${c?'Boo-le-Bark costume contest':PARADE.name}</b><span class="meta"><span class="t">${c?'3pm':'4:30pm'}</span> · ${c?'Boulevard Woods Park, 298 Barber St':'loop from Boulevard &amp; Barber St'}</span></span><span aria-hidden="true">→</span></button>`}
function renderEvent(){const st=document.getElementById('status');st.innerHTML=`<button class="linkbtn" id="back">← Back to ${S.view==='plan'?'my day':'the lineup'}</button><span>Special event</span>`;document.getElementById('back').onclick=closePorch;
const segD=(p,a,b)=>{const dx=b[0]-a[0],dy=b[1]-a[1],L=dx*dx+dy*dy;let t=L?((p.x-a[0])*dx+(p.y-a[1])*dy)/L:0;t=Math.max(0,Math.min(1,t));return Math.hypot(p.x-a[0]-t*dx,p.y-a[1]-t*dy)};
const R=PARADE.route,routeD=p=>Math.min(...R.slice(1).map((b,i)=>segD(p,R[i],b)));
const on=A.filter(a=>a.t===4&&routeD(a.porch)<=45).sort((x,y)=>x.porch.a.localeCompare(y.porch.a,undefined,{numeric:true}));
const ns=nearestStop({x:PARADE.lx,y:PARADE.ly});
listEl.innerHTML=`<div class="porch"><h2>${PARADE.name}</h2><div class="sub">4:30pm · starts and ends at Boulevard &amp; Barber Street (298 Barber St)</div><div class="lmkcard"><b>Costume contest at 3pm</b><span class="lw">Boulevard Woods Park · 298 Barber St</span><p>This year\'s theme is “Boogie on the Boulevard.” The contest and parade benefit Athens Pets.</p></div><p class="d" style="margin:10px 0 0;font-size:15px;line-height:1.5">The parade starts at 4:30pm. The route heads west on Boulevard, south on Lyndon Avenue, east on Dubose Avenue, north on Grady Avenue, then east on Boulevard back to the start. It\'s shown in pink on the map, with arrows for direction. Boo-le-Bark and Historic Athens schedule the two events for the same day, so you can catch a porch set and the parade together.</p>
<div class="tline"><span class="tnum">7</span><span>Trolley stop <button class="tbtn" data-stop="6">7 · Boulevard & Chase</button> is about a 4-minute walk west of the route</span></div>
<section class="group"><h3><span>Playing along the route from 4pm</span><span>${on.length}</span></h3>${on.map(a=>actRow(a,true)).join('')||'<div class="empty">No 4pm sets along the route.</div>'}</section></div>`}
function openEvent(){S.porch=null;S.stop=null;S.event=true;S.hl=null;render();const {w,h}=size();const b=PARADE.bounds;fitTo(b,40);listEl.scrollTop=0;pushDetail();reveal()}
function openStop(i){S.porch=null;S.event=false;S.open=null;S.help=false;S.stop=i;S.hl=null;render();panTo(TROLLEY[i],0.5);listEl.scrollTop=0;pushDetail();reveal()}
const PRIMER={user:'u/one98d',userUrl:'https://www.reddit.com/user/one98d/',url:'https://www.reddit.com/r/Athens/comments/1x8nx8n/smalllarge_primer_to_the_athens_porchfest_music/'};
function primerBlock(a){return a.r?`<div class="rq"><div class="rqh">Picked by <a href="${PRIMER.userUrl}" target="_blank" rel="noopener">${PRIMER.user}</a> in the <a href="${PRIMER.url}" target="_blank" rel="noopener">r/Athens primer ↗</a></div><div class="rqt">${esc(a.r)}</div></div>`:''}
function detail(a){const p=a.porch;const maps=`https://www.google.com/maps/dir/?api=1&destination=${encodeURIComponent(p.a+', Athens, GA')}&travelmode=walking`;const others=p.acts.filter(x=>x!==a);
return `<div class="det">${a.d?`<div class="d">${esc(a.d)}</div>`:''}${primerBlock(a)}<div class="dm">${esc(a.g)} · ${esc(p.h)} · hosted by ${esc(a.host)}</div>${linkRow(a)}<div class="lk"><button class="tbtn" data-openporch="${p.id}">${others.length?`All ${p.acts.length} sets at this porch`:'Porch details'} →</button><a href="${maps}" target="_blank" rel="noopener">Walking directions ↗</a></div></div>`}
function toggleAct(id){S.open=S.open===id?null:id;const sc=listEl.scrollTop,wy=window.scrollY;if(S.open!=null)S.hl=null;render();listEl.scrollTop=sc;window.scrollTo(0,wy);if(S.open!=null)panTo(A[id].porch)}
function update(){render()}
function openPorch(id){S.stop=null;S.event=false;S.open=null;S.help=false;S.porch=id;S.hl=null;render();panTo(P[id],0.5);listEl.scrollTop=0;pushDetail();reveal()}
function doClose(){S.porch=null;S.stop=null;S.event=false;S.open=null;S.help=false;render()}
let histOpen=false;
function pushDetail(){if(histOpen)return;try{history.pushState({pfDetail:1},'');histOpen=true}catch(e){}}
function closePorch(){if(histOpen){histOpen=false;try{history.back();return}catch(e){}}doClose()}
window.addEventListener('popstate',()=>{histOpen=false;if(S.porch!=null||S.stop!=null||S.event||S.help)doClose()});
const isPhone=()=>window.matchMedia('(max-width:860px)').matches;
function reveal(onlyIfPast){if(!isPhone())return;const stuck=document.querySelector('.mapwrap').offsetHeight+document.getElementById('bar').offsetHeight;const st=document.getElementById('status');const top=st.getBoundingClientRect().top+window.scrollY-stuck-6;if(onlyIfPast&&window.scrollY<=top)return;try{window.scrollTo({top:Math.max(0,top),behavior:'smooth'})}catch(e){window.scrollTo(0,Math.max(0,top))}}
listEl.addEventListener('click',e=>{const tb=e.target.closest('[data-stop]');if(tb){openStop(+tb.dataset.stop);return}if(e.target.closest('[data-event]')){openEvent();return}const sb=e.target.closest('[data-star]');if(sb){e.stopPropagation();const id=+sb.dataset.star;S.stars.has(id)?S.stars.delete(id):S.stars.add(id);saveStars();render();return}
if(e.target.closest('a'))return;const op=e.target.closest('[data-openporch]');if(op){openPorch(+op.dataset.openporch);return}if(e.target.closest('.det'))return;const ra=e.target.closest('[data-act]');if(ra){toggleAct(+ra.dataset.act);return}const r=e.target.closest('[data-porch]');if(r)openPorch(+r.dataset.porch)});
listEl.addEventListener('keydown',e=>{if(e.key==='Enter'&&!e.target.closest('button,a')){const r=e.target.closest('[data-act],[data-porch]');if(r)r.click()}});
listEl.addEventListener('pointerover',e=>{const r=e.target.closest('[data-porch]');const v=r?+r.dataset.porch:null;if(v!==S.hl){S.hl=v;renderPins()}});
listEl.addEventListener('pointerleave',()=>{S.hl=null;renderPins()});
svg.addEventListener('click',e=>{if(!moved&&!e.target.closest('.mark'))closeMarks()});
svg.addEventListener('click',e=>{if(!moved&&!e.target.closest('.pin,.tstop,.mark')&&(S.porch!=null||S.stop!=null||S.event||S.help))closePorch()});
// ---------- controls ----------
const hoursEl=document.getElementById('hours');
[...HOURS,0].forEach(h=>{const b=document.createElement('button');b.dataset.h=h;const n=A.filter(a=>h===0||a.t===h).length;b.innerHTML=h?`${h}<small>${n} sets</small>`:`All<small>day</small>`;if(nowInfo.hour===h)b.classList.add('now'),b.title='Happening now';b.onclick=()=>{S.hour=h;S.view='lineup';S.porch=null;S.stop=null;S.event=false;S.open=null;S.help=false;render();reveal(true)};hoursEl.appendChild(b)});
const genresEl=document.getElementById('genres');
function renderChips(){genresEl.innerHTML=FAMILIES.map(f=>`<button class="chip" data-f="${f.k}" aria-pressed="${S.fams.has(f.k)}"><span class="sw" style="background:${famColor(f)}${f.k==='loud'?';box-shadow:inset 0 0 0 2px var(--panel),0 0 0 1.5px '+famColor(f):''}"></span>${f.label}</button>`).join('')}
genresEl.addEventListener('click',e=>{const b=e.target.closest('[data-f]');if(!b)return;const k=b.dataset.f;
if(S.fams.size===FAMILIES.length){S.fams=new Set([k])}else if(S.fams.has(k)){S.fams.delete(k);if(!S.fams.size)S.fams=new Set(FAMILIES.map(f=>f.k))}else S.fams.add(k);
renderChips();S.porch=null;S.stop=null;S.event=false;S.open=null;S.help=false;S.view='lineup';render()});
renderChips();
document.getElementById('q').addEventListener('input',e=>{S.q=e.target.value.trim();S.porch=null;S.stop=null;S.event=false;S.open=null;S.help=false;S.view='lineup';if(S.q&&S.hour)S.hour=0;render()});
hoodSel.addEventListener('change',e=>{S.hood=e.target.value;S.porch=null;S.stop=null;S.event=false;S.open=null;S.help=false;S.view='lineup';render();const ps=P.filter(p=>!S.hood||p.h===S.hood);fitTo({x0:Math.min(...ps.map(p=>p.x))-80,x1:Math.max(...ps.map(p=>p.x))+80,y0:Math.min(...ps.map(p=>p.y))-140,y1:Math.max(...ps.map(p=>p.y))+80})});
document.getElementById('tabLineup').onclick=()=>{S.view='lineup';S.porch=null;S.stop=null;S.event=false;S.open=null;S.help=false;render()};
document.getElementById('tabPlan').onclick=()=>{S.view='plan';S.porch=null;S.stop=null;S.event=false;S.open=null;S.help=false;render();const pl=planActs();if(pl.length>1){const xs=pl.map(a=>a.porch.x),ys=pl.map(a=>a.porch.y);fitTo({x0:Math.min(...xs)-150,x1:Math.max(...xs)+150,y0:Math.min(...ys)-180,y1:Math.max(...ys)+150})}};
document.getElementById('legend').innerHTML=[['rock','Rock, metal, punk'],['indie','Indie & pop'],['folk','Folk & songwriter'],['jazz','Jazz & classical'],['elec','Electronic & hip-hop'],['other','Everything else']].map(([k,l])=>`<span><i class="sw" style="background:var(--g-${k})"></i>${l}</span>`).join('')+`<span style="grid-column:1/-1"><i class="sw" style="background:var(--mark);border-radius:3px"></i>Food trucks &amp; artist market</span><span style="grid-column:1/-1"><i class="sw" style="background:var(--trolley);border-radius:3px"></i>Free trolley stop (1–7pm loop)</span><span style="grid-column:1/-1"><i class="sw" style="background:var(--parade);border-radius:3px"></i>Boo-le-Bark pet parade route, 4:30pm</span>`;
0&&[].map(([k,l])=>`<span><i class="sw" style="background:var(--g-${k})"></i>${l}</span>`).join('');
let lastSz=null;new ResizeObserver(()=>{const sz=size();if(!window.__fitted){if(sz.w&&sz.h){fitTo(B);window.__fitted=true}}else if(lastSz){V.tx+=(sz.w-lastSz.w)/2;V.ty+=(sz.h-lastSz.h)/2;apply()}lastSz=sz}).observe(svg);
document.getElementById('helpBtn').onclick=e=>{e.stopPropagation();openHelp()};
if(location.hash==='#help')setTimeout(openHelp,0);
document.getElementById('zloc').onclick=()=>{geoWatch!=null||S.me?stopLocate():startLocate()};
const appEl=document.querySelector('.app'),msBtn=document.getElementById('mapSize');
function setMapSmall(on){appEl.classList.toggle('mapsmall',on);msBtn.textContent=on?'Bigger map':'Smaller map';msBtn.setAttribute('aria-label',on?'Make the map bigger':'Make the map smaller');store.set('pf26-mapsmall',on)}
msBtn.onclick=()=>setMapSmall(!appEl.classList.contains('mapsmall'));setMapSmall(!!store.get('pf26-mapsmall',false));
const filtBtn=document.getElementById('filtBtn'),filtEl=document.getElementById('filters');
filtBtn.onclick=()=>{const o=!filtEl.classList.contains('open');filtEl.classList.toggle('open',o);filtBtn.setAttribute('aria-expanded',o)};
function updFiltCount(){const n=(S.hood?1:0)+(S.fams.size<FAMILIES.length?1:0);document.getElementById('filtCount').textContent=n||''}
document.getElementById('q').addEventListener('keydown',e=>{if(e.key==='Enter')e.target.blur()});
render();
</script>
</body>
</html>