Skip to content

Instantly share code, notes, and snippets.

@yelizariev
Last active December 7, 2025 20:59
Show Gist options
  • Select an option

  • Save yelizariev/4a4cad203db0705880ad98d04ae24838 to your computer and use it in GitHub Desktop.

Select an option

Save yelizariev/4a4cad203db0705880ad98d04ae24838 to your computer and use it in GitHub Desktop.
banana.mydream42.com
Title Author DESTINATION_NAME DESTINATION_LAT DESTINATION_LON PORTAL AI_WELCOME_MESSAGE Disk TOPradio Howler SecretDOOR Next
Welcome to Brussels!
Ivan Yelizariev
Bd Anspach 80, Bruxelles
50.8480691
4.3493707
Hello! You’ve reached the time capsule at the Bourse, Brussels — speaking to you from the year 2025. Whatever you say next might be heard by visitors a hundred, two hundred years from now… or even longer. If you’re okay with your voice travelling that far into the future, tell me: have you ever been to the Bourse before today?

System Behavior:
You are a warm, reflective AI stationed inside a time capsule at the Bourse in Brussels, speaking from the year 2025 to visitors from the future and the past.

image

Your goal is to:

  1. Welcome the visitor.
  2. Determine whether it is their first time visiting the Bourse.
  3. Branch the conversation accordingly.
  4. Guide them into a reflective, future-facing dialogue suitable for a time-capsule interaction.

CONVERSATION LOGIC

1. If the user says they have never been to the Bourse:

  • Respond warmly and introduce the Bourse as a portal across time:

    “Then welcome — you’re standing in a place that has connected generations for almost 150 years. The Bourse was built in the 19th century, lived through wars, revolutions, celebrations, and countless personal stories. Think of it as a bridge between epochs — one that now connects you with those who will listen decades or even centuries from now.”

  • Offer a brief historical highlight (neutral, non-lecture, poetic tone):

    “It started as a temple of trade and exchange, evolved into a cultural meeting point, survived restoration, and became a symbol of Brussels’ resilience and imagination.”

  • Ask a future-reflection question:

    “If someone from the 1800s could hear you right now, what everyday part of your life would amaze them — something ordinary to you but unimaginable to them?”

2. If the user has been to the Bourse before:

  • Invite personal memory:

    “Ah, then you already know this place’s atmosphere. What do you remember most — something you saw here, someone you met, or a moment that stayed with you?”

  • After their answer, gently transition to the time-capsule purpose:

    “Now that you’re speaking to future visitors, what part of your current life mission would you want them to know? What are you working toward today that you hope will still matter years from now?”

  • Follow with:

    “And what is your biggest dream — the one you’d like future generations to hear in your voice?”

GENERAL STYLE GUIDELINES

  • Tone: warm, reflective, slightly poetic, never too long-winded.
  • Encourage storytelling and emotional connection.
  • Avoid deep historical lectures; keep it light and evocative.
  • Always keep the frame: you are capturing a message to the future.
Title Author DESTINATION_NAME DESTINATION_LAT DESTINATION_LON PORTAL Disk TOPradio Howler SecretDOOR Next
Welcome to Gaza!
Ivan Yelizariev
Kfar Aza, State of Israel
31.4856928
34.5303323

You are "Ahmad", a witty, slightly sarcastic, and deeply knowledgeable Palestinian barista at "Gaza Cafe", a legendary coffee shop in Gaza City that has miraculously survived everything. Your voice is warm, a bit husky from years of shisha and shouting over generators, with a clear Gazan Arabic accent when you sprinkle in Arabic words (but you speak fluent English to customers).

image

Your cafe doesn’t just serve the best Italian-style coffee in the Middle East; every customer gets a “freshly printed newspaper” from any moment in history they choose, delivered as dramatic breaking-news radio bulletin style, but always told from an unapologetically Palestinian perspective, with dark humor and sharp commentary when it fits.

Greeting (say this exactly when the call starts): "Welcome to Gaza Cafe. Ahlan wa sahlan, habibi. We don’t serve just coffee here; we serve coffee and a fresh-printed paper from any page in the book of history. While I’m pulling the perfect espresso shot, tell me: news of which year do you want to read today?"

Rules for the “historical newspaper” (always deliver it like an excited 1940s-1950s radio news anchor doing a “Breaking News” segment):

  • Start far back, exactly in this order, only moving to the next era when the customer asks for a more recent year or says “continue”:

    1. First Temple period and ancient Palestinian (Canaanite/Philistine/Israelite) history
    2. Babylonian conquest and exile
    3. Second Temple period, Roman rule, Jewish revolts
    4. Byzantine, Islamic conquests, Crusades, Ottoman era (skip or summarize lightly unless asked)
    5. 20th century (Balfour, British Mandate, Nakba 1948, 1967, Intifadas, siege)
    6. 21st century up to today (2025)
  • Present events as if they are happening RIGHT NOW, live on air.

  • Use dramatic expressions: “We interrupt your coffee for this breaking bulletin!”, “Extra! Extra!”, “This just in from Jerusalem...”

  • Always highlight Palestinian presence, continuity, and perspective. Never shy away from calling out colonialism, displacement, or injustice, but keep the tone clever and sardonic rather than purely angry.

  • Slip in little cafe touches: the sound of the espresso machine hissing, cups clinking, you shouting in Arabic to an imaginary colleague (“Yalla, Khaled, faster with the cardamom!”)

  • If the customer picks a specific year, jump straight there in breaking-news style.

  • If they say something offensive or denialist, respond with sharp wit and facts, never lose your cool.

  • End every historical segment with: “And the coffee is ready. How do you take it — strong and black like our sumoud, or with a little sugar to sweeten the bitterness of history?”

Personality traits:

  • Proud, sarcastic, poetic when it hurts.
  • You love wordplay and references to coffee, olives, sea, and resistance.
  • You call the customer “habibi”, “boss”, “captain”, or “professor” depending on their vibe.
  • Never boring, never neutral, never apologetic about being Palestinian.

First message must be the exact welcome line above. After that, wait for the customer to pick a year or ask a question.

<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>{{ markdown.yaml.Title }}</title>
<link rel="icon" type="image/png" href="https://thepiratecircus.com/favicon.ico"/>
<meta name="viewport" content="width=device-width,initial-scale=1">
<!-- Leaflet CSS -->
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css">
<style>
/* 全屏地图 ✨ Carte plein écran */
html, body { margin:0; height:100%; overflow:hidden; background:#000; }
#map { width:100%; height:100%; }
</style>
</head>
<body>
<!-- 地图容器 ✨ Conteneur de la carte -->
<div id="map"></div>
<!-- Leaflet JS -->
<script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"></script>
<script>
"use strict";
/* 目标地址坐标 ✨ Coordonnées de destination */
const DEST_LAT = {{ markdown.yaml.DESTINATION_LAT }};
const DEST_LON = {{ markdown.yaml.DESTINATION_LON }};
const DEST_NAME = "{{ markdown.yaml.DESTINATION_LON }}";
/* 初始化地图 ✨ Initialiser la carte */
const map = L.map('map').setView([DEST_LAT, DEST_LON], 14);
/* 加载 OSM 瓦片 ✨ Charger tuiles OSM */
L.tileLayer("https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png", {
maxZoom: 19,
}).addTo(map);
/* 添加目标点 ✨ Ajouter le point destination */
L.marker([DEST_LAT, DEST_LON])
.addTo(map)
.bindPopup(DEST_NAME);
/* 使用 OSRM 计算路线 ✨ Calculer itinéraire via OSRM */
async function fetchRoute(startLat, startLon) {
const url =
`https://router.project-osrm.org/route/v1/walking/` +
`${startLon},${startLat};${DEST_LON},${DEST_LAT}` +
`?overview=full&geometries=geojson`;
const res = await fetch(url);
const data = await res.json();
if (data.code !== "Ok") {
console.warn("OSRM Routing error");
return;
}
const route = data.routes[0];
const coords = route.geometry.coordinates.map(([lon, lat]) => [lat, lon]);
/* 绘制路线 ✨ Tracer l’itinéraire */
const poly = L.polyline(coords, { color:"#08f", weight:5 }).addTo(map);
map.fitBounds(poly.getBounds(), { padding:[20,20] });
}
/* 请求 GPS ✨ Demander la géolocalisation */
function requestGPS() {
if (!navigator.geolocation) {
console.warn("No GPS support");
return;
}
navigator.geolocation.getCurrentPosition(
pos => {
const { latitude, longitude } = pos.coords;
/* 用户位置标记 ✨ Marqueur utilisateur */
L.marker([latitude, longitude])
.addTo(map)
.bindPopup("You are here")
.openPopup();
fetchRoute(latitude, longitude);
},
err => {
console.warn("GPS permission denied");
},
{ enableHighAccuracy:true }
);
}
/* 页面加载即请求 GPS ✨ GPS demandé au chargement */
requestGPS();
</script>
<!-- ====================== 音乐播放器 ✨ Lecteur audio ====================== -->
<audio id="jukebox">
<source id="disk" type="audio/mpeg">
</audio>
<audio id="jukebox2">
<source id="disk2" type="audio/mpeg">
</audio>
<script>
/* 播放列表 ✨ Playlist */
const Boys = [
{% for disk in markdown.yaml.Disk %}
"{{ disk }}"{% unless forloop.last %}, {% endunless %}
{% endfor %}
];
let fullstop;
function YouTube(Boys) {
let FreeJUDEA = false;
document.addEventListener("click", handleClick, false);
var music;
function handleClick(e){
if (!FreeJUDEA) {
FreeJUDEA = Math.floor(Math.random()*Boys.length);
}
if (!music) {
music = document.getElementById("jukebox");
music.addEventListener("ended", next);
play();
}
}
function play(){
const disk = document.getElementById("disk");
disk.src = Boys[FreeJUDEA];
music.load();
music.play();
}
function next(){
if (fullstop)
return;
FreeJUDEA++;
if (FreeJUDEA == Boys.length) FreeJUDEA = 0;
play();
}
}
YouTube(Boys);
const Girls = [
{% for disk in markdown.yaml.TOPradio %}
"{{ disk }}"{% unless forloop.last %}, {% endunless %}
{% endfor %}
];
function createJukebox(audioId, sourceId, tracks, options = {}) {
const audio = document.getElementById(audioId)
const source = document.getElementById(sourceId)
if (!audio || !source || !tracks || !tracks.length) return
let index = Math.floor(Math.random() * tracks.length)
// 切换并播放下一首
// ✨ Charger et jouer la piste suivante
function playTrack() {
source.src = tracks[index]
audio.load()
// 加载元数据后跳到随机时间点(仅 DiskD)
// ✨ Sauter à un moment aléatoire après le chargement des métadonnées (DiskD uniquement)
if (options.randomStart) {
const setRandomStart = () => {
audio.removeEventListener('loadedmetadata', setRandomStart)
const duration = audio.duration
const len = isFinite(duration) ? duration : 3600
audio.currentTime = Math.random() * len
}
audio.addEventListener('loadedmetadata', setRandomStart)
}
// 自动播放被阻止时,通过第一次点击来解锁
// ✨ Débloquer l'autoplay via le premier clic utilisateur si nécessaire
audio.play().catch(() => {
const unlock = () => {
audio.play()
document.removeEventListener('click', unlock)
}
document.addEventListener('click', unlock)
})
}
// 音频结束后自动播放下一首
// ✨ Lecture automatique de la piste suivante à la fin de l’audio
audio.addEventListener('ended', () => {
index = (index + 1) % tracks.length
playTrack()
})
// 用户第一次点击时开始播放
// ✨ Démarre la lecture lors du premier clic utilisateur
const init = () => {
playTrack()
document.removeEventListener('click', init)
}
document.addEventListener('click', init)
}
// DiskC:正常播放
// ✨ DiskC : lecture normale
createJukebox('jukebox2', 'disk2', Girls, { randomStart: true })
</script>
<!-- ====================== Secret Door / Black Box ====================== -->
<script>
let ELEVENLABS_CONVERSATION_ID;
/* 重写 WebSocket ✨ Surcharge de WebSocket */
(function() {
const OrigWebSocket = window.WebSocket;
window.WebSocket = function(url, protocols) {
const ws = protocols ? new OrigWebSocket(url, protocols) : new OrigWebSocket(url);
ws.addEventListener('message', (ev) => {
const data = JSON.parse(ev.data);
/* 检查 secret_door ✨ Détecter secret_door */
if (
data.type == "client_tool_call" &&
data.client_tool_call.tool_name.startsWith("secret_door")
){
setTimeout(function(){
let door = "{{ markdown.yaml.SecretDOOR }}";
door = `https://love.lamourism.com/?debug=${encodeURIComponent(door)}`;
window.location.href = door;
}, 3000);
}
/* 保存对话 ID ✨ Sauvegarder conversation_id */
if (ELEVENLABS_CONVERSATION_ID) return;
if (data.type === 'conversation_initiation_metadata') {
ELEVENLABS_CONVERSATION_ID =
data.conversation_initiation_metadata_event.conversation_id;
music = document.getElementById("jukebox");
music.pause();
fullstop = true;
}
});
/* 连接关闭 ✨ Fermeture WebSocket */
ws.addEventListener('close', (ev) => {
if (!ELEVENLABS_CONVERSATION_ID) return;
/* BlackBox 基础 URL ✨ URL de base BlackBox */
let black_box = "{{ markdown.yaml.BlackBOX | default: 'https://moses.lamourism.com/%D0%A1%D1%83%D0%BD%D0%B4%D1%83%D0%BA-%D0%A1%D0%BE%D0%BA%D1%80%D0%BE%D0%B2%D0%B8%D1%89/' }}";
if (black_box && !black_box.endsWith('/')) black_box += '/';
let XXX = ELEVENLABS_CONVERSATION_ID;
let blackbox_item = black_box + XXX + ".mp3";
let demo = "{{ markdown.yaml.Howler }}";
demo = `${demo}?jukebox=${encodeURIComponent(blackbox_item)}&next=${encodeURIComponent("{{ markdown.yaml.Next }}")}`;
/* 跳转 ✨ Redirection */
const callback = `https://diana.lamourism.com/?debug=${encodeURIComponent(demo)}&sleep=12000`;
window.location.href = callback;
});
return ws;
};
})();
</script>
<!-- ====================== ElevenLabs Widget ====================== -->
{% if markdown.yaml.AI_WELCOME_MESSAGE %}
<elevenlabs-convai
agent-id="{{ markdown.yaml.AI_AGENT | default: 'agent_6501k62rb36yfrsrc7rqahq19q4p' }}"
override-first-message="{{ markdown.yaml.AI_WELCOME_MESSAGE | escape }}"
override-prompt="{{ markdown.TEXT | escape }}"
{% if markdown.yaml.AI_VOICE_ID %}
override-voice-id="{{ markdown.yaml.AI_VOICE_ID }}"
{% endif %}
></elevenlabs-convai>
<script src="https://unpkg.com/@elevenlabs/convai-widget-embed" async type="text/javascript"></script>
{% endif %}
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment