From 3a67a1d3844a77030fb9b47ac95288997868db89 Mon Sep 17 00:00:00 2001 From: shanjiaming Date: Tue, 12 May 2026 15:22:15 -0700 Subject: [PATCH] feat(ted): add TED mirror site --- .gitignore | 4 +- Dockerfile | 4 +- control_server.py | 2 +- sites/ted/_health.py | 3 + sites/ted/app.py | 439 +++++++++++++++++++++++ sites/ted/requirements.txt | 2 + sites/ted/scraped_data/.gitkeep | 0 sites/ted/seed_data.py | 7 + sites/ted/static/css/.gitkeep | 0 sites/ted/static/css/main.css | 99 +++++ sites/ted/static/icons/.gitkeep | 0 sites/ted/static/js/.gitkeep | 0 sites/ted/tasks.jsonl | 18 + sites/ted/templates/.gitkeep | 0 sites/ted/templates/_talk_card.html | 13 + sites/ted/templates/account.html | 38 ++ sites/ted/templates/base.html | 57 +++ sites/ted/templates/events.html | 20 ++ sites/ted/templates/index.html | 58 +++ sites/ted/templates/login.html | 11 + sites/ted/templates/playlist_detail.html | 16 + sites/ted/templates/playlists.html | 12 + sites/ted/templates/register.html | 13 + sites/ted/templates/search.html | 17 + sites/ted/templates/talk_detail.html | 42 +++ sites/ted/templates/talks.html | 28 ++ sites/ted/templates/topics.html | 12 + websyn_start.sh | 12 +- 28 files changed, 916 insertions(+), 11 deletions(-) create mode 100644 sites/ted/_health.py create mode 100644 sites/ted/app.py create mode 100644 sites/ted/requirements.txt create mode 100644 sites/ted/scraped_data/.gitkeep create mode 100644 sites/ted/seed_data.py create mode 100644 sites/ted/static/css/.gitkeep create mode 100644 sites/ted/static/css/main.css create mode 100644 sites/ted/static/icons/.gitkeep create mode 100644 sites/ted/static/js/.gitkeep create mode 100644 sites/ted/tasks.jsonl create mode 100644 sites/ted/templates/.gitkeep create mode 100644 sites/ted/templates/_talk_card.html create mode 100644 sites/ted/templates/account.html create mode 100644 sites/ted/templates/base.html create mode 100644 sites/ted/templates/events.html create mode 100644 sites/ted/templates/index.html create mode 100644 sites/ted/templates/login.html create mode 100644 sites/ted/templates/playlist_detail.html create mode 100644 sites/ted/templates/playlists.html create mode 100644 sites/ted/templates/register.html create mode 100644 sites/ted/templates/search.html create mode 100644 sites/ted/templates/talk_detail.html create mode 100644 sites/ted/templates/talks.html create mode 100644 sites/ted/templates/topics.html diff --git a/.gitignore b/.gitignore index c2efc04..ae7bd9b 100644 --- a/.gitignore +++ b/.gitignore @@ -10,7 +10,7 @@ sites/*/static/external_cache/ # Intermediate / volatile — never committed anywhere. # ============================================================= sites/*/scraped_data/ # scrape pipeline intermediate; runtime data lives in instance_seed/*.db -sites/*/instance/ # rebuilt at every container boot from instance_seed/ +sites/*/instance/ sites/*/venv/ # HF download metadata produced by `hf download`. @@ -92,4 +92,4 @@ secrets.json # ============================================================ # Agent demo results # ============================================================= -agent_demo/runs/ \ No newline at end of file +agent_demo/runs/ diff --git a/Dockerfile b/Dockerfile index 991e5ab..1e86b1d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ # WebHarbor — slim, self-contained image. -# 15 Flask mirror sites + control plane on :8101. +# 16 Flask mirror sites + control plane on :8101. FROM python:3.12-slim-bookworm @@ -33,6 +33,6 @@ COPY control_server.py /opt/control_server.py COPY site_runner.py /opt/site_runner.py RUN chmod +x /opt/websyn_start.sh -EXPOSE 8101 40000-40014 +EXPOSE 8101 40000-40015 CMD ["/opt/websyn_start.sh"] diff --git a/control_server.py b/control_server.py index c255253..512757b 100644 --- a/control_server.py +++ b/control_server.py @@ -26,7 +26,7 @@ 'allrecipes', 'amazon', 'apple', 'arxiv', 'bbc_news', 'booking', 'github', 'google_flights', 'google_map', 'google_search', 'huggingface', 'wolfram_alpha', 'cambridge_dictionary', - 'coursera', 'espn', + 'coursera', 'espn', 'ted', ] BASE_PORT = 40000 WEBSYN_DIR = '/opt/WebSyn' diff --git a/sites/ted/_health.py b/sites/ted/_health.py new file mode 100644 index 0000000..409695c --- /dev/null +++ b/sites/ted/_health.py @@ -0,0 +1,3 @@ +"""Per-site health probe (optional, called by control_server).""" +def health(): + return {"ok": True, "site": "ted", "paths": ["/", "/talks", "/search", "/events"]} diff --git a/sites/ted/app.py b/sites/ted/app.py new file mode 100644 index 0000000..10cf72f --- /dev/null +++ b/sites/ted/app.py @@ -0,0 +1,439 @@ +"""TED mirror for WebHarbor.""" +import json +import os +import re +import shutil +from datetime import datetime +from pathlib import Path + +from flask import Flask, abort, flash, redirect, render_template, request, session, url_for +from flask_sqlalchemy import SQLAlchemy +from werkzeug.security import check_password_hash, generate_password_hash + +from seed_data import EVENTS, PLAYLISTS, TALKS + +BASE_DIR = Path(__file__).resolve().parent +DB_PATH = BASE_DIR / "instance" / "ted.db" +SEED_DB_PATH = BASE_DIR / "instance_seed" / "ted.db" + +app = Flask(__name__) +app.config["SECRET_KEY"] = "webharbor-ted-dev-key" +app.config["SQLALCHEMY_DATABASE_URI"] = f"sqlite:///{DB_PATH}" +app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False +BASE_DIR.joinpath("instance").mkdir(exist_ok=True) + +db = SQLAlchemy(app) + + +class User(db.Model): + id = db.Column(db.Integer, primary_key=True) + username = db.Column(db.String(80), unique=True, nullable=False) + email = db.Column(db.String(160), unique=True, nullable=False) + display_name = db.Column(db.String(120), nullable=False) + password_hash = db.Column(db.String(255), nullable=False) + role = db.Column(db.String(120), default="Curious learner") + city = db.Column(db.String(120), default="") + newsletter_topic = db.Column(db.String(80), default="technology") + + +class Talk(db.Model): + id = db.Column(db.Integer, primary_key=True) + source_id = db.Column(db.String(40), unique=True, nullable=False) + slug = db.Column(db.String(220), unique=True, nullable=False, index=True) + title = db.Column(db.String(260), nullable=False) + speaker = db.Column(db.String(180), nullable=False) + event = db.Column(db.String(120), default="") + talk_type = db.Column(db.String(80), default="TED Talk") + duration_seconds = db.Column(db.Integer, default=0) + published_at = db.Column(db.String(20), default="") + recorded_on = db.Column(db.String(20), default="") + views = db.Column(db.Integer, default=0) + image = db.Column(db.String(260), default="") + canonical_url = db.Column(db.String(300), default="") + description = db.Column(db.Text, default="") + transcript = db.Column(db.Text, default="") + topics_json = db.Column(db.Text, default="[]") + recommended_json = db.Column(db.Text, default="[]") + + @property + def topics(self): + return json.loads(self.topics_json or "[]") + + @property + def recommended_for(self): + return json.loads(self.recommended_json or "[]") + + @property + def minutes(self): + return max(1, round((self.duration_seconds or 0) / 60)) + + @property + def views_label(self): + if self.views >= 1_000_000: + return f"{self.views / 1_000_000:.1f}M" + if self.views >= 1000: + return f"{self.views // 1000}K" + return str(self.views) + + +class SavedTalk(db.Model): + id = db.Column(db.Integer, primary_key=True) + user_id = db.Column(db.Integer, db.ForeignKey("user.id"), nullable=False) + talk_id = db.Column(db.Integer, db.ForeignKey("talk.id"), nullable=False) + saved_at = db.Column(db.DateTime, default=datetime.utcnow) + note = db.Column(db.String(240), default="") + talk = db.relationship("Talk") + + +class Playlist(db.Model): + id = db.Column(db.Integer, primary_key=True) + slug = db.Column(db.String(120), unique=True, nullable=False) + title = db.Column(db.String(180), nullable=False) + description = db.Column(db.Text, default="") + topic = db.Column(db.String(80), default="") + + +class PlaylistTalk(db.Model): + id = db.Column(db.Integer, primary_key=True) + playlist_id = db.Column(db.Integer, db.ForeignKey("playlist.id"), nullable=False) + talk_id = db.Column(db.Integer, db.ForeignKey("talk.id"), nullable=False) + position = db.Column(db.Integer, default=0) + talk = db.relationship("Talk") + + +class Event(db.Model): + id = db.Column(db.Integer, primary_key=True) + slug = db.Column(db.String(120), unique=True, nullable=False) + name = db.Column(db.String(180), nullable=False) + city = db.Column(db.String(120), default="") + month = db.Column(db.String(40), default="") + track = db.Column(db.String(80), default="") + capacity = db.Column(db.Integer, default=0) + + +class Registration(db.Model): + id = db.Column(db.Integer, primary_key=True) + user_id = db.Column(db.Integer, db.ForeignKey("user.id"), nullable=False) + event_id = db.Column(db.Integer, db.ForeignKey("event.id"), nullable=False) + status = db.Column(db.String(40), default="waitlisted") + event = db.relationship("Event") + + +STOP_WORDS = {"the", "a", "an", "and", "or", "of", "to", "for", "in", "on", "with", "by", "my", "is"} + + +def current_user(): + uid = session.get("user_id") + return db.session.get(User, uid) if uid else None + + +def require_login(): + if not current_user(): + flash("Please sign in to continue.", "info") + return redirect(url_for("login", next=request.path)) + return None + + +@app.context_processor +def inject_globals(): + topics = sorted({topic for talk in Talk.query.all() for topic in talk.topics}) + return {"current_user": current_user(), "nav_topics": topics[:10]} + + +@app.template_filter("date_label") +def date_label(value): + try: + return datetime.strptime(value, "%Y-%m-%d").strftime("%b %d, %Y") + except Exception: + return value + + +def tokenize(text): + return [t for t in re.split(r"[^a-z0-9]+", (text or "").lower()) if len(t) > 1 and t not in STOP_WORDS] + + +def scored_talks(query, talks): + tokens = tokenize(query) + if not tokens: + return list(talks) + ranked = [] + for talk in talks: + text = " ".join([talk.title, talk.speaker, talk.event, talk.description, talk.transcript, " ".join(talk.topics)]).lower() + score = sum(1 for token in tokens if token in text) + if score: + ranked.append((score, talk.views, talk)) + return [talk for _, _, talk in sorted(ranked, key=lambda item: (-item[0], -item[1]))] + + +def seed_database(): + if Talk.query.count() > 0: + return + talks_by_topic = {} + for row in TALKS: + talk = Talk( + source_id=row["source_id"], + slug=row["slug"], + title=row["title"], + speaker=row["speaker"], + event=row["event"], + talk_type=row["talk_type"], + duration_seconds=row["duration_seconds"], + published_at=row["published_at"], + recorded_on=row["recorded_on"], + views=row["views"], + image=row["image"], + canonical_url=row["canonical_url"], + description=row["description"], + transcript=row["transcript"], + topics_json=json.dumps(row["topics"]), + recommended_json=json.dumps(row["recommended_for"]), + ) + db.session.add(talk) + db.session.flush() + for topic in row["topics"]: + talks_by_topic.setdefault(topic.lower(), []).append(talk.id) + + for row in PLAYLISTS: + playlist = Playlist(**row) + db.session.add(playlist) + db.session.flush() + topic_terms = [term.strip().lower() for term in row["topic"].split("|") if term.strip()] + ids = [] + for term in topic_terms: + for talk_id in talks_by_topic.get(term, []): + if talk_id not in ids: + ids.append(talk_id) + ids = ids[:8] + if len(ids) < 4: + ids = [talk.id for talk in Talk.query.order_by(Talk.views.desc()).limit(8)] + for position, talk_id in enumerate(ids, start=1): + db.session.add(PlaylistTalk(playlist_id=playlist.id, talk_id=talk_id, position=position)) + + for row in EVENTS: + db.session.add(Event(**row)) + db.session.commit() + + +def seed_users(): + if User.query.filter_by(email="alice.j@test.com").first(): + return + users = [ + ("alice_j", "alice.j@test.com", "Alice Johnson", "Product manager", "Seattle", "AI"), + ("bob_c", "bob.c@test.com", "Bob Chen", "Graduate student", "Boston", "science"), + ("carol_d", "carol.d@test.com", "Carol Davis", "Workshop facilitator", "Austin", "design"), + ("david_k", "david.k@test.com", "David Kim", "Climate researcher", "San Francisco", "climate change"), + ] + talks = Talk.query.order_by(Talk.views.desc()).limit(12).all() + events = Event.query.all() + for index, (username, email, name, role, city, topic) in enumerate(users): + user = User( + username=username, + email=email, + display_name=name, + role=role, + city=city, + newsletter_topic=topic.lower(), + password_hash=generate_password_hash("TestPass123!"), + ) + db.session.add(user) + db.session.flush() + for talk in talks[index:index + 4]: + db.session.add(SavedTalk(user_id=user.id, talk_id=talk.id, note=f"Review for {topic} discussion")) + db.session.add(Registration(user_id=user.id, event_id=events[index % len(events)].id, status="confirmed")) + db.session.commit() + + +@app.route("/") +def index(): + featured = Talk.query.order_by(Talk.published_at.desc()).limit(5).all() + popular = Talk.query.order_by(Talk.views.desc()).limit(8).all() + playlists = Playlist.query.all() + return render_template("index.html", featured=featured, popular=popular, playlists=playlists) + + +@app.route("/talks") +def talks(): + topic = request.args.get("topic", "").lower() + event = request.args.get("event", "") + max_minutes = request.args.get("max_minutes", type=int) + query = Talk.query + if event: + query = query.filter(Talk.event == event) + items = query.order_by(Talk.published_at.desc()).all() + if topic: + items = [talk for talk in items if topic in talk.topics] + if max_minutes: + items = [talk for talk in items if talk.minutes <= max_minutes] + events = [row[0] for row in db.session.query(Talk.event).distinct().order_by(Talk.event).all()] + return render_template("talks.html", talks=items, topic=topic, event=event, max_minutes=max_minutes, events=events) + + +@app.route("/search") +def search(): + q = request.args.get("q", "").strip() + talks = scored_talks(q, Talk.query.all()) if q else [] + return render_template("search.html", q=q, talks=talks) + + +@app.route("/talks/") +def talk_detail(slug): + talk = Talk.query.filter_by(slug=slug).first_or_404() + related = [item for item in scored_talks(" ".join(talk.topics[:2]), Talk.query.all()) if item.id != talk.id][:4] + saved = False + user = current_user() + if user: + saved = SavedTalk.query.filter_by(user_id=user.id, talk_id=talk.id).first() is not None + return render_template("talk_detail.html", talk=talk, related=related, saved=saved) + + +@app.route("/topics") +def topics(): + counts = {} + for talk in Talk.query.all(): + for topic in talk.topics: + counts[topic] = counts.get(topic, 0) + 1 + return render_template("topics.html", counts=sorted(counts.items(), key=lambda item: (-item[1], item[0]))) + + +@app.route("/topics/") +def topic_detail(topic): + talks = [talk for talk in Talk.query.order_by(Talk.views.desc()).all() if topic.lower() in talk.topics] + return render_template("talks.html", talks=talks, topic=topic.lower(), event="", max_minutes=None, events=[]) + + +@app.route("/playlists") +def playlists(): + items = Playlist.query.order_by(Playlist.title).all() + return render_template("playlists.html", playlists=items) + + +@app.route("/playlists/") +def playlist_detail(slug): + playlist = Playlist.query.filter_by(slug=slug).first_or_404() + links = PlaylistTalk.query.filter_by(playlist_id=playlist.id).order_by(PlaylistTalk.position).all() + return render_template("playlist_detail.html", playlist=playlist, links=links) + + +@app.route("/events", methods=["GET", "POST"]) +def events(): + if request.method == "POST": + login_redirect = require_login() + if login_redirect: + return login_redirect + event = Event.query.filter_by(slug=request.form.get("event_slug")).first_or_404() + user = current_user() + existing = Registration.query.filter_by(user_id=user.id, event_id=event.id).first() + if not existing: + db.session.add(Registration(user_id=user.id, event_id=event.id, status="waitlisted")) + db.session.commit() + flash(f"Registration saved for {event.name}.", "success") + return redirect(url_for("account")) + return render_template("events.html", events=Event.query.order_by(Event.month.desc()).all()) + + +@app.route("/save/", methods=["POST"]) +def save_talk(slug): + login_redirect = require_login() + if login_redirect: + return login_redirect + talk = Talk.query.filter_by(slug=slug).first_or_404() + user = current_user() + if not SavedTalk.query.filter_by(user_id=user.id, talk_id=talk.id).first(): + db.session.add(SavedTalk(user_id=user.id, talk_id=talk.id, note=request.form.get("note", ""))) + db.session.commit() + flash("Talk saved.", "success") + return redirect(request.referrer or url_for("talk_detail", slug=slug)) + + +@app.route("/unsave/", methods=["POST"]) +def unsave_talk(saved_id): + login_redirect = require_login() + if login_redirect: + return login_redirect + saved = SavedTalk.query.get_or_404(saved_id) + if saved.user_id != current_user().id: + abort(403) + db.session.delete(saved) + db.session.commit() + flash("Saved talk removed.", "success") + return redirect(url_for("account")) + + +@app.route("/account", methods=["GET", "POST"]) +def account(): + login_redirect = require_login() + if login_redirect: + return login_redirect + user = current_user() + if request.method == "POST": + user.display_name = request.form.get("display_name", user.display_name).strip() or user.display_name + user.role = request.form.get("role", user.role).strip() or user.role + user.city = request.form.get("city", user.city).strip() + user.newsletter_topic = request.form.get("newsletter_topic", user.newsletter_topic).strip().lower() + db.session.commit() + flash("Profile updated.", "success") + return redirect(url_for("account")) + saved = SavedTalk.query.filter_by(user_id=user.id).order_by(SavedTalk.saved_at.desc()).all() + registrations = Registration.query.filter_by(user_id=user.id).all() + return render_template("account.html", user=user, saved=saved, registrations=registrations) + + +@app.route("/login", methods=["GET", "POST"]) +def login(): + if request.method == "POST": + email = request.form.get("email", "").lower().strip() + user = User.query.filter_by(email=email).first() + if user and check_password_hash(user.password_hash, request.form.get("password", "")): + session["user_id"] = user.id + flash("Signed in.", "success") + return redirect(request.args.get("next") or url_for("account")) + flash("Invalid email or password.", "error") + return render_template("login.html") + + +@app.route("/register", methods=["GET", "POST"]) +def register(): + if request.method == "POST": + email = request.form.get("email", "").lower().strip() + username = re.sub(r"[^a-z0-9_]+", "", request.form.get("username", "").lower())[:40] + if User.query.filter((User.email == email) | (User.username == username)).first(): + flash("That email or username already exists.", "error") + else: + user = User( + email=email, + username=username, + display_name=request.form.get("display_name", username).strip() or username, + password_hash=generate_password_hash(request.form.get("password", "TestPass123!")), + ) + db.session.add(user) + db.session.commit() + session["user_id"] = user.id + flash("Account created.", "success") + return redirect(url_for("account")) + return render_template("register.html") + + +@app.route("/logout") +def logout(): + session.clear() + flash("Signed out.", "success") + return redirect(url_for("index")) + + +@app.route("/_health") +def health(): + return {"ok": True, "site": "ted", "talks": Talk.query.count()} + + +with app.app_context(): + db.create_all() + seed_database() + seed_users() + if not SEED_DB_PATH.exists() and DB_PATH.exists(): + SEED_DB_PATH.parent.mkdir(exist_ok=True) + shutil.copy2(DB_PATH, SEED_DB_PATH) + + +if __name__ == "__main__": + port = int(os.environ.get("PORT", 5000)) + app.run(host="0.0.0.0", port=port, debug=False) diff --git a/sites/ted/requirements.txt b/sites/ted/requirements.txt new file mode 100644 index 0000000..fb675a9 --- /dev/null +++ b/sites/ted/requirements.txt @@ -0,0 +1,2 @@ +Flask +Flask-SQLAlchemy diff --git a/sites/ted/scraped_data/.gitkeep b/sites/ted/scraped_data/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/sites/ted/seed_data.py b/sites/ted/seed_data.py new file mode 100644 index 0000000..53b0e29 --- /dev/null +++ b/sites/ted/seed_data.py @@ -0,0 +1,7 @@ +"""Seed data for the TED WebHarbor mirror.""" + +TALKS = [{'source_id': '178768', 'title': 'The wildlife sanctuary you can visit from anywhere', 'slug': 'maya-higa-the-wildlife-sanctuary-you-can-visit-from-anywhere', 'speaker': 'Maya Higa', 'event': 'TED2026', 'talk_type': 'TED Stage Talk', 'duration_seconds': 568, 'duration_minutes': 9, 'published_at': '2026-05-12', 'recorded_on': '2026-04-14', 'views': 150000, 'topics': ['media', 'social change', 'animals', 'nature', 'social media', 'internet', 'conservation', 'wildlife'], 'image': 'images/talk_001_maya-higa-the-wildlife-sanctuary-you-can-visit-f.jpg', 'canonical_url': 'https://www.ted.com/talks/maya_higa_the_wildlife_sanctuary_you_can_visit_from_anywhere', 'description': 'Creator Maya Higa is on a mission to use the internet to build the next generation of conservationists. Her virtual education center, Alveus Sanctuary, is one of the most-watched sanctuaries on Earth, with dozens of rescued animals and cameras livestreaming to a community of millions inspired to help protect the wildlife. Visit with Bean the Hawk, Winnie the Moo and more - and see what the future of conservation looks like.', 'transcript': 'Maya Higa opens by framing the central tension behind The wildlife sanctuary you can visit from anywhere. The talk then connects evidence, lived experience, and examples from TED2026. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '178681', 'title': "Waymo's case for a driverless future", 'slug': 'tekedra-mawakana-sal-khan-waymo-s-case-for-a-driverless-future', 'speaker': 'Tekedra Mawakana, Sal Khan', 'event': 'TED2026', 'talk_type': 'TED Stage Talk', 'duration_seconds': 1154, 'duration_minutes': 19, 'published_at': '2026-05-11', 'recorded_on': '2026-04-15', 'views': 157919, 'topics': ['technology', 'future', 'society', 'driverless cars'], 'image': 'images/talk_002_tekedra-mawakana-sal-khan-waymo-s-case-for-a-dri.jpg', 'canonical_url': 'https://www.ted.com/talks/tekedra_mawakana_sal_khan_waymo_s_case_for_a_driverless_future', 'description': "What if we could solve the problem of fatal car accidents? Waymo co-CEO Tekedra Mawakana joins TED's Sal Khan to explore why fully autonomous vehicles (where you never have to touch the wheel) could end the dangerous status quo of traffic deaths. She makes the case for why self-driving cars are more than a tech novelty - they're an urgently needed upgrade that could make the world safer for everyone.", 'transcript': "Tekedra Mawakana, Sal Khan opens by framing the central tension behind Waymo's case for a driverless future. The talk then connects evidence, lived experience, and examples from TED2026. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.", 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '177895', 'title': 'Why I love my bad days', 'slug': 'alexi-pappas-why-i-love-my-bad-days', 'speaker': 'Alexi Pappas', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 310, 'duration_minutes': 5, 'published_at': '2026-05-08', 'recorded_on': '2025-11-11', 'views': 6052, 'topics': ['psychology', 'philosophy', 'happiness', 'sports', 'motivation', 'personal growth', 'goals'], 'image': 'images/talk_003_alexi-pappas-why-i-love-my-bad-days.jpg', 'canonical_url': 'https://www.ted.com/talks/alexi_pappas_why_i_love_my_bad_days', 'description': "One month before the Rio Olympics, runner Alexi Pappas couldn't hit her splits in practice. She was begging her watch to change its mind. Then her coach told her to take it off - and shared the best advice she's ever received. That single piece of wisdom led her to break a national record and changed how she chases her goals, carrying her through ultramarathons, a memoir and three films. Bad days aren't a detour, she says - they mean you're right on track.", 'transcript': 'Alexi Pappas opens by framing the central tension behind Why I love my bad days. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '178367', 'title': 'What really won the trillion-dollar Supreme Court case', 'slug': 'neal-kumar-katyal-what-really-won-the-trillion-dollar-supreme-court-case', 'speaker': 'Neal Kumar Katyal', 'event': 'TED2026', 'talk_type': 'TED Stage Talk', 'duration_seconds': 1091, 'duration_minutes': 18, 'published_at': '2026-05-07', 'recorded_on': '2026-04-17', 'views': 154312, 'topics': ['culture', 'ai', 'law', 'society', 'policy'], 'image': 'images/talk_004_neal-kumar-katyal-what-really-won-the-trillion-d.jpg', 'canonical_url': 'https://www.ted.com/talks/neal_kumar_katyal_what_really_won_the_trillion_dollar_supreme_court_case', 'description': "In November 2025, Neal Kumar Katyal was asked to do what no US Supreme Court litigator had ever done: convince the justices to strike down a sitting president's signature initiative. After enlisting the help of four unlikely coaches - and one secret weapon he hasn't told anyone about until now - he walked into the courtroom ready for anything. What he discovered about winning and connecting might just change how you think about performing under pressure.", 'transcript': 'Neal Kumar Katyal opens by framing the central tension behind What really won the trillion-dollar Supreme Court case. The talk then connects evidence, lived experience, and examples from TED2026. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '178175', 'title': 'The rising cost of dissent in America', 'slug': 'miles-taylor-the-rising-cost-of-dissent-in-america-may-2026', 'speaker': 'Miles Taylor', 'event': 'TEDxMidAtlantic', 'talk_type': 'TEDx Talk', 'duration_seconds': 1166, 'duration_minutes': 19, 'published_at': '2026-05-04', 'recorded_on': '2025-11-01', 'views': 154789, 'topics': ['politics', 'media', 'social change', 'united states', 'democracy', 'government'], 'image': 'images/talk_005_miles-taylor-the-rising-cost-of-dissent-in-ameri.jpg', 'canonical_url': 'https://www.ted.com/talks/miles_taylor_the_rising_cost_of_dissent_in_america_may_2026', 'description': "Former senior US national security official Miles Taylor shares a personal account that raises a broader civic concern: the growing cost of dissent in American public life. Drawing on his experience inside government and living the consequences of speaking openly, he says that the real threat to US democracy isn't the politicians or hard-liners - it's the two-thirds of Americans who don't speak up. (This talk contains mature language.)", 'transcript': 'Miles Taylor opens by framing the central tension behind The rising cost of dissent in America. The talk then connects evidence, lived experience, and examples from TEDxMidAtlantic. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '178086', 'title': 'Why AI is unlikely to become conscious', 'slug': 'anil-seth-why-ai-is-unlikely-to-become-conscious', 'speaker': 'Anil Seth', 'event': 'TED2026', 'talk_type': 'TED Stage Talk', 'duration_seconds': 897, 'duration_minutes': 15, 'published_at': '2026-05-01', 'recorded_on': '2026-04-16', 'views': 191682, 'topics': ['technology', 'future', 'brain', 'consciousness', 'ai'], 'image': 'images/talk_006_anil-seth-why-ai-is-unlikely-to-become-conscious.jpg', 'canonical_url': 'https://www.ted.com/talks/anil_seth_why_ai_is_unlikely_to_become_conscious', 'description': 'We see consciousness in AI the same way we see faces in clouds, says neuroscientist Anil Seth. He explores the all-too-human tendency to project inner life onto machines that are brilliant mimics, not sentient beings, and gives a definitive answer to the urgent question: Will AI ever gain consciousness?', 'transcript': 'Anil Seth opens by framing the central tension behind Why AI is unlikely to become conscious. The talk then connects evidence, lived experience, and examples from TED2026. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '175757', 'title': 'Reimagining traditional architecture for modern needs', 'slug': 'riyad-joucka-reimagining-traditional-architecture-for-modern-needs', 'speaker': 'Riyad Joucka', 'event': 'TED@BCG', 'talk_type': 'TED Institute Talk', 'duration_seconds': 492, 'duration_minutes': 8, 'published_at': '2026-04-30', 'recorded_on': '2025-10-23', 'views': 153822, 'topics': ['technology', 'design', 'architecture', 'urban planning', 'innovation', '3d printing'], 'image': 'images/talk_007_riyad-joucka-reimagining-traditional-architectur.jpg', 'canonical_url': 'https://www.ted.com/talks/riyad_joucka_reimagining_traditional_architecture_for_modern_needs', 'description': "Architect Riyad Joucka believes your home should be a mirror of who you are. Using 3D printing and ancient architectural wisdom, he's designing efficient, personal homes that respond to context, climate and culture without sacrificing character. He makes the case that we should start designing for people, not the market.", 'transcript': 'Riyad Joucka opens by framing the central tension behind Reimagining traditional architecture for modern needs. The talk then connects evidence, lived experience, and examples from TED@BCG. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '176563', 'title': 'How to invite creativity into your life', 'slug': 'rose-b-simpson-debbie-millman-how-to-invite-creativity-into-your-life', 'speaker': 'Rose B. Simpson, Debbie Millman', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 1065, 'duration_minutes': 18, 'published_at': '2026-04-29', 'recorded_on': '2025-11-10', 'views': 170066, 'topics': ['culture', 'nature', 'creativity', 'art', 'storytelling', 'mindfulness'], 'image': 'images/talk_008_rose-b-simpson-debbie-millman-how-to-invite-crea.jpg', 'canonical_url': 'https://www.ted.com/talks/rose_b_simpson_debbie_millman_how_to_invite_creativity_into_your_life', 'description': 'What do you hear when you sit in silence? For artist Rose B. Simpson, that question is the beginning of all art. She comes from a line of ceramic artists stretching back generations and, as part of her multidisciplinary work, she also builds custom lowrider cars. (If that sounds like a contradiction, that\'s kind of the point.) In conversation with "Design Matters" podcast host Debbie Millman, Simpson invites you to find your own aesthetic - not by searching, but by listening.', 'transcript': 'Rose B. Simpson, Debbie Millman opens by framing the central tension behind How to invite creativity into your life. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '175453', 'title': 'You got what you wanted. Now what?', 'slug': 'debbie-millman-you-got-what-you-wanted-now-what', 'speaker': 'Debbie Millman', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 473, 'duration_minutes': 8, 'published_at': '2026-04-27', 'recorded_on': '2025-11-09', 'views': 190209, 'topics': ['design', 'creativity', 'personal growth'], 'image': 'images/talk_009_debbie-millman-you-got-what-you-wanted-now-what.jpg', 'canonical_url': 'https://www.ted.com/talks/debbie_millman_you_got_what_you_wanted_now_what', 'description': 'Over two decades of interviewing countless creative people, Debbie Millman (host of the iconic "Design Matters" podcast) had a realization: the pride and joy of accomplishing something often evaporates almost instantly. She explains how to stop chasing external validation for your achievements and instead live for the act of creation itself.', 'transcript': 'Debbie Millman opens by framing the central tension behind You got what you wanted. Now what?. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '177490', 'title': 'What Kosovo can teach the world about freedom', 'slug': 'vjosa-osmani-sadriu-what-kosovo-can-teach-the-world-about-freedom', 'speaker': 'Vjosa Osmani Sadriu', 'event': 'TED2026', 'talk_type': 'TED Stage Talk', 'duration_seconds': 1047, 'duration_minutes': 17, 'published_at': '2026-04-24', 'recorded_on': '2026-04-14', 'views': 176972, 'topics': ['politics', 'social change', 'leadership', 'democracy', 'government'], 'image': 'images/talk_010_vjosa-osmani-sadriu-what-kosovo-can-teach-the-wo.jpg', 'canonical_url': 'https://www.ted.com/talks/vjosa_osmani_sadriu_what_kosovo_can_teach_the_world_about_freedom', 'description': '"Truth is the real oxygen for democracy," says Vjosa Osmani Sadriu, the 6th President of the Republic of Kosovo. As a child of war, she once longed for someone to save her people. Now she\'s been in the rooms where decisions are made - and she\'s never forgotten what brought her there. In conversation with solutions journalist Angus Hervey, she reflects on what it takes to defend democracy in a world where truth itself is under threat. (Recorded on April 14, 2026)', 'transcript': 'Vjosa Osmani Sadriu opens by framing the central tension behind What Kosovo can teach the world about freedom. The talk then connects evidence, lived experience, and examples from TED2026. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '177489', 'title': 'Beware the power of prediction', 'slug': 'carissa-veliz-beware-the-power-of-prediction', 'speaker': 'Carissa Veliz', 'event': 'TED2026', 'talk_type': 'TED Stage Talk', 'duration_seconds': 728, 'duration_minutes': 12, 'published_at': '2026-04-23', 'recorded_on': '2026-04-14', 'views': 267371, 'topics': ['technology', 'future', 'ai', 'ethics'], 'image': 'images/talk_011_carissa-veliz-beware-the-power-of-prediction.jpg', 'canonical_url': 'https://www.ted.com/talks/carissa_veliz_beware_the_power_of_prediction', 'description': "What do the story of Oedipus and your insurance premiums have in common? They are both driven by self-fulfilling prophecies. Philosopher and TED Fellow Carissa Veliz traces the hidden power of prediction, from Roman emperors who banned prophets to the AI algorithms quietly making decisions about your life right now. We tend to associate predictions with knowledge, she says, but they're actually attempts to grab power. So the next time someone tells you a specific outcome is inevitable, remember: they aren't describing the future - they're selling it.", 'transcript': 'Carissa Veliz opens by framing the central tension behind Beware the power of prediction. The talk then connects evidence, lived experience, and examples from TED2026. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '177096', 'title': 'The problem with billionaires - and the debut of True Net Worth', 'slug': 'randall-lane-the-problem-with-billionaires-and-the-debut-of-true-net-worth', 'speaker': 'Randall Lane', 'event': 'TED2026', 'talk_type': 'TED Stage Talk', 'duration_seconds': 499, 'duration_minutes': 8, 'published_at': '2026-04-20', 'recorded_on': '2026-04-16', 'views': 221434, 'topics': ['culture', 'economics', 'philanthropy', 'society', 'money', 'finance'], 'image': 'images/talk_012_randall-lane-the-problem-with-billionaires-and-t.jpg', 'canonical_url': 'https://www.ted.com/talks/randall_lane_the_problem_with_billionaires_and_the_debut_of_true_net_worth', 'description': "As chief content officer of Forbes, Randall Lane oversees the magazine's signature list of billionaires, tracking the richest people on Earth. But he has noticed that this prompts the ultra-wealthy to stockpile their money instead of spending it on the public good. He debuts a new ranking - True Net Worth - that applauds billionaires for their philanthropy and rewards generosity. Guess who's in the top five?", 'transcript': 'Randall Lane opens by framing the central tension behind The problem with billionaires - and the debut of True Net Worth. The talk then connects evidence, lived experience, and examples from TED2026. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '175050', 'title': 'A cheat sheet for accelerating clean energy', 'slug': 'kimiko-hirata-a-cheat-sheet-for-accelerating-clean-energy', 'speaker': 'Kimiko Hirata', 'event': 'TED Countdown Summit 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 586, 'duration_minutes': 10, 'published_at': '2026-04-20', 'recorded_on': '2025-06-18', 'views': 191819, 'topics': ['climate change', 'policy', 'countdown', 'renewable energy', 'fossil fuels'], 'image': 'images/talk_013_kimiko-hirata-a-cheat-sheet-for-accelerating-cle.jpg', 'canonical_url': 'https://www.ted.com/talks/kimiko_hirata_a_cheat_sheet_for_accelerating_clean_energy', 'description': 'After the Fukushima disaster shut down Japan\'s nuclear reactors, the coal industry rushed in to fill the energy gap. As climate advocate Kimiko Hirata watched dozens of new coal plant proposals quietly surface across the country - each one locking in decades of future emissions - she resolved to make them impossible to ignore. She shares how a small, scrappy civil society movement took on a fossil-fuel-dependent economy and got people to say "yes" to a renewable future.', 'transcript': 'Kimiko Hirata opens by framing the central tension behind A cheat sheet for accelerating clean energy. The talk then connects evidence, lived experience, and examples from TED Countdown Summit 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '176964', 'title': 'How I created OpenClaw, the breakthrough AI agent', 'slug': 'peter-steinberger-how-i-created-openclaw-the-breakthrough-ai-agent', 'speaker': 'Peter Steinberger', 'event': 'TED2026', 'talk_type': 'TED Stage Talk', 'duration_seconds': 1055, 'duration_minutes': 18, 'published_at': '2026-04-17', 'recorded_on': '2026-04-16', 'views': 551544, 'topics': ['technology', 'computers', 'ai', 'internet', 'machine learning', 'artificial intelligence'], 'image': 'images/talk_014_peter-steinberger-how-i-created-openclaw-the-bre.jpg', 'canonical_url': 'https://www.ted.com/talks/peter_steinberger_how_i_created_openclaw_the_breakthrough_ai_agent', 'description': 'OpenClaw creator Peter Steinberger takes us back to the transformative moment he let his AI agent loose on the internet, igniting one of the world\'s fastest-growing open-source projects. He makes a fascinating (and slightly unnerving) case that agents are a real shift, not just better versions of chatbots, and explores how they might reshape your ability to work, build and create. "The lobster is loose, and it\'s not going back into the tank," he says. (Followed by a brief Q&A with TED Chairman Chris Anderson)', 'transcript': 'Peter Steinberger opens by framing the central tension behind How I created OpenClaw, the breakthrough AI agent. The talk then connects evidence, lived experience, and examples from TED2026. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '176887', 'title': 'A plan to stop AI from automating our decline', 'slug': 'gina-raimondo-a-plan-to-stop-ai-from-automating-our-decline', 'speaker': 'Gina Raimondo', 'event': 'TED2026', 'talk_type': 'TED Stage Talk', 'duration_seconds': 951, 'duration_minutes': 16, 'published_at': '2026-04-16', 'recorded_on': '2026-04-14', 'views': 229795, 'topics': ['politics', 'technology', 'business', 'social change', 'work', 'ai'], 'image': 'images/talk_015_gina-raimondo-a-plan-to-stop-ai-from-automating-.jpg', 'canonical_url': 'https://www.ted.com/talks/gina_raimondo_a_plan_to_stop_ai_from_automating_our_decline', 'description': 'The United States is on track to win the AI race - and hollow itself out in the process, says Gina Raimondo, former Governor of Rhode Island and US Secretary of Commerce. In this unflinching look at the threat of AI-induced economic disruption and social unrest, she offers a concrete blueprint to prepare workers for what\'s coming next. "AI is a 100-year technology and needs a 100-year response," she says. Is America up to the challenge?', 'transcript': 'Gina Raimondo opens by framing the central tension behind A plan to stop AI from automating our decline. The talk then connects evidence, lived experience, and examples from TED2026. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '175041', 'title': 'East African sound meets cosmic trap', 'slug': 'akoth-jumadi-and-mr-lu-east-african-sound-meets-cosmic-trap', 'speaker': 'Akoth Jumadi and Mr. Lu', 'event': 'TED Countdown Summit 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 483, 'duration_minutes': 8, 'published_at': '2026-04-15', 'recorded_on': '2025-06-18', 'views': 2781, 'topics': ['music', 'performance', 'africa', 'art', 'sound'], 'image': 'images/talk_016_akoth-jumadi-and-mr-lu-east-african-sound-meets-.jpg', 'canonical_url': 'https://www.ted.com/talks/akoth_jumadi_and_mr_lu_east_african_sound_meets_cosmic_trap', 'description': 'Kenyan music duo Akoth Jumadi and MR. LU* fuse tribal roots with cosmic trap and celestial R&B, creating a hypnotic sound where ancient rhythms meet the future.', 'transcript': 'Akoth Jumadi and Mr. Lu opens by framing the central tension behind East African sound meets cosmic trap. The talk then connects evidence, lived experience, and examples from TED Countdown Summit 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '176566', 'title': 'What I got wrong about changing the world', 'slug': 'malala-yousafzai-what-i-got-wrong-about-changing-the-world', 'speaker': 'Malala Yousafzai', 'event': 'TED2026', 'talk_type': 'TED Stage Talk', 'duration_seconds': 703, 'duration_minutes': 12, 'published_at': '2026-04-14', 'recorded_on': '2026-04-14', 'views': 349363, 'topics': ['education', 'social change', 'activism', 'middle east', 'human rights'], 'image': 'images/talk_017_malala-yousafzai-what-i-got-wrong-about-changing.jpg', 'canonical_url': 'https://www.ted.com/talks/malala_yousafzai_what_i_got_wrong_about_changing_the_world', 'description': "Malala Yousafzai has spent her life advocating for girls' education - surviving an assassination attempt at 15, meeting with world leaders and then watching hard-won progress collapse when Afghanistan fell to the Taliban in 2021. That moment of despair forced her to completely rethink what it means to create change, and what she discovered replaced her shattered optimism with something more powerful and more honest. Hear how to keep fighting for the future you want, even when hope feels lost.", 'transcript': 'Malala Yousafzai opens by framing the central tension behind What I got wrong about changing the world. The talk then connects evidence, lived experience, and examples from TED2026. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '174201', 'title': 'Amman, Jordan', 'slug': 'ted-idea-search-amman-jordan', 'speaker': 'TED Idea Search', 'event': 'TED Originals', 'talk_type': 'Original Content', 'duration_seconds': 2610, 'duration_minutes': 44, 'published_at': '2026-04-09', 'recorded_on': '2026-04-09', 'views': 23418, 'topics': ['social change'], 'image': 'images/talk_018_ted-idea-search-amman-jordan.jpg', 'canonical_url': 'https://www.ted.com/talks/ted_idea_search_amman_jordan', 'description': "The TED Idea Search wraps up in Amman, Jordan, in a 2,000-year-old Roman amphitheater and in front of a crowd of 4,000. What unfolds inside those stone walls is something the series hasn't quite seen before: speakers shaped by the weight of living in a region the world tends to define for itself. From a mountaineer who turned grief into motivation to a therapist rewriting the Arab world's language around mental health, the final city makes the strongest case yet that the best ideas can come from anywhere.", 'transcript': 'TED Idea Search opens by framing the central tension behind Amman, Jordan. The talk then connects evidence, lived experience, and examples from TED Originals. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '175828', 'title': 'A musical journey through Turkana', 'slug': 'turkana-sessions-a-musical-journey-through-turkana', 'speaker': 'Turkana Sessions', 'event': 'TED Countdown Summit 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 401, 'duration_minutes': 7, 'published_at': '2026-04-09', 'recorded_on': '2025-06-16', 'views': 4223, 'topics': ['music', 'performance', 'africa'], 'image': 'images/talk_019_turkana-sessions-a-musical-journey-through-turka.jpg', 'canonical_url': 'https://www.ted.com/talks/turkana_sessions_a_musical_journey_through_turkana', 'description': 'The genre-defying band Turkana Sessions takes us on a musical tour through the soundscape of northwest Kenya, with Elizabeth Korkel singing and Eddie Grey shredding on guitar.', 'transcript': 'Turkana Sessions opens by framing the central tension behind A musical journey through Turkana. The talk then connects evidence, lived experience, and examples from TED Countdown Summit 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '175296', 'title': "A whale's-eye-view of the ocean", 'slug': 'eric-stackpole-a-whale-s-eye-view-of-the-ocean', 'speaker': 'Eric Stackpole', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 311, 'duration_minutes': 5, 'published_at': '2026-04-08', 'recorded_on': '2025-11-11', 'views': 193174, 'topics': ['science', 'technology', 'animals', 'exploration', 'ocean'], 'image': 'images/talk_020_eric-stackpole-a-whale-s-eye-view-of-the-ocean.jpg', 'canonical_url': 'https://www.ted.com/talks/eric_stackpole_a_whale_s_eye_view_of_the_ocean', 'description': "A hand-built camera with suction cups captured something no one had ever seen: two sperm whales communicating and swimming together in the deep ocean. Engineer Eric Stackpole shares the story of how a scrappy, DIY tool revealed this intimate glimpse into the lives of these giants - and makes the case that the only limit to what we can discover is what we're curious enough to explore.", 'transcript': "Eric Stackpole opens by framing the central tension behind A whale's-eye-view of the ocean. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.", 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '175934', 'title': 'The art and science of wine tasting', 'slug': 'qian-janice-wang-the-art-and-science-of-wine-tasting', 'speaker': 'Qian Janice Wang', 'event': 'TEDxNoVA', 'talk_type': 'TEDx Talk', 'duration_seconds': 919, 'duration_minutes': 15, 'published_at': '2026-04-07', 'recorded_on': '2025-10-10', 'views': 181481, 'topics': ['science', 'food', 'brain'], 'image': 'images/talk_021_qian-janice-wang-the-art-and-science-of-wine-tas.jpg', 'canonical_url': 'https://www.ted.com/talks/qian_janice_wang_the_art_and_science_of_wine_tasting', 'description': "No two people taste wine the same way, and science is starting to show us why. Sensory scientist Qian Janice Wang explores why experts and beginners experience complexity so differently - revealing that what makes a wine great may have less to do with what's in the glass and more to do with what's happening in your brain.", 'transcript': 'Qian Janice Wang opens by framing the central tension behind The art and science of wine tasting. The talk then connects evidence, lived experience, and examples from TEDxNoVA. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '171659', 'title': 'The accidental brilliance of makeshift signs', 'slug': 'kate-canales-the-accidental-brilliance-of-makeshift-signs', 'speaker': 'Kate Canales', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 466, 'duration_minutes': 8, 'published_at': '2026-04-06', 'recorded_on': '2025-11-11', 'views': 203431, 'topics': ['culture', 'technology', 'design', 'creativity', 'art', 'humor', 'society'], 'image': 'images/talk_022_kate-canales-the-accidental-brilliance-of-makesh.jpg', 'canonical_url': 'https://www.ted.com/talks/kate_canales_the_accidental_brilliance_of_makeshift_signs', 'description': "What happens when the design of everyday things misses the mark? People fill in the blanks. Designer Kate Canales has spent more than 20 years photographing the handmade, improvised signs that appear when the original falls short. From perplexing bathroom directions to our struggles with doors and point-of-sale machines, her photos capture something technology can't replace: our instinct to look out for each other and leave a few instructions behind.", 'transcript': 'Kate Canales opens by framing the central tension behind The accidental brilliance of makeshift signs. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '175830', 'title': "The nurse who can smell Parkinson's", 'slug': 'joy-milne-the-nurse-who-can-smell-parkinson-s', 'speaker': 'Joy Milne', 'event': 'TEDxManchester', 'talk_type': 'TEDx Talk', 'duration_seconds': 1077, 'duration_minutes': 18, 'published_at': '2026-04-03', 'recorded_on': '2023-03-04', 'views': 203929, 'topics': ['science', 'innovation', 'disease', 'health', 'health care', 'biology', 'medicine'], 'image': 'images/talk_023_joy-milne-the-nurse-who-can-smell-parkinson-s.jpg', 'canonical_url': 'https://www.ted.com/talks/joy_milne_the_nurse_who_can_smell_parkinson_s', 'description': "What does Parkinson's smell like? Ask nurse Joy Milne. Born with a hypersensitive nose, she spent a lifetime learning to recognize diseases through their scents. When she smelled Parkinson's on her husband years before his diagnosis, she decided to put her gift to the test. Today, her extraordinary nose has been translated into a non-invasive test - helping researchers diagnose what was right under their noses all along.", 'transcript': "Joy Milne opens by framing the central tension behind The nurse who can smell Parkinson's. The talk then connects evidence, lived experience, and examples from TEDxManchester. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.", 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '174199', 'title': 'Buenos Aires, Argentina', 'slug': 'ted-idea-search-buenos-aires-argentina', 'speaker': 'TED Idea Search', 'event': 'TED Originals', 'talk_type': 'Original Content', 'duration_seconds': 2561, 'duration_minutes': 43, 'published_at': '2026-04-02', 'recorded_on': '2026-04-02', 'views': 31212, 'topics': ['social change'], 'image': 'images/talk_024_ted-idea-search-buenos-aires-argentina.jpg', 'canonical_url': 'https://www.ted.com/talks/ted_idea_search_buenos_aires_argentina', 'description': 'The TED Idea Search arrives in Buenos Aires, a city with a fierce intellectual tradition, as 10 speakers deliver talks in a stunning warehouse that\'s home to the city\'s iconic opera sets, competing for a chance to speak on the TED main stage. Watch as a Gen Z voice reframes "brain rot" as a secret diplomatic tool and a surgeon explores the future of robotic medicine, reminding us why the human touch still matters - and much more. Choosing just one to represent Buenos Aires to the world turns out to be one of the hardest decisions yet.', 'transcript': 'TED Idea Search opens by framing the central tension behind Buenos Aires, Argentina. The talk then connects evidence, lived experience, and examples from TED Originals. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '175297', 'title': "I let DaddyGPT parent my kids. Here's what I learned", 'slug': 'stephen-remedios-i-let-daddygpt-parent-my-kids-here-s-what-i-learned', 'speaker': 'Stephen Remedios', 'event': 'TED@BCG', 'talk_type': 'TED Institute Talk', 'duration_seconds': 671, 'duration_minutes': 11, 'published_at': '2026-04-02', 'recorded_on': '2025-10-23', 'views': 201276, 'topics': ['technology', 'parenting', 'ai', 'kids'], 'image': 'images/talk_025_stephen-remedios-i-let-daddygpt-parent-my-kids-h.jpg', 'canonical_url': 'https://www.ted.com/talks/stephen_remedios_i_let_daddygpt_parent_my_kids_here_s_what_i_learned', 'description': "As the world races toward digital perfection, tech humanist Stephen Remedios tried to optimize the messiest and most imperfect of all human work: parenting. He shares the story of DaddyGPT, a digital version of himself built to help raise his kids - until they began to prefer it over him. What unfolds is a personal look at the limits of AI, and a reminder that what matters most isn't getting it right every time but showing up with the authentic imperfection only humans have.", 'transcript': "Stephen Remedios opens by framing the central tension behind I let DaddyGPT parent my kids. Here's what I learned. The talk then connects evidence, lived experience, and examples from TED@BCG. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.", 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '175452', 'title': 'A brilliant blend of ballet, hip-hop and African dance', 'slug': 'ghetto-classics-dance-a-brilliant-blend-of-ballet-hip-hop-and-african-dance', 'speaker': 'Ghetto Classics Dance', 'event': 'TED Countdown Summit 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 434, 'duration_minutes': 7, 'published_at': '2026-04-01', 'recorded_on': '2025-06-17', 'views': 3772, 'topics': ['performance', 'africa', 'art', 'dance', 'countdown'], 'image': 'images/talk_026_ghetto-classics-dance-a-brilliant-blend-of-balle.jpg', 'canonical_url': 'https://www.ted.com/talks/ghetto_classics_dance_a_brilliant_blend_of_ballet_hip_hop_and_african_dance', 'description': "Watch the performers of Ghetto Classics Dance light up the stage with a breathtaking fusion of traditional African dance, classical ballet and modern hip-hop. Founded in Korogocho, one of Nairobi's most under-resourced neighborhoods, this community-driven program empowers dancers through intensive training and mentorship.", 'transcript': 'Ghetto Classics Dance opens by framing the central tension behind A brilliant blend of ballet, hip-hop and African dance. The talk then connects evidence, lived experience, and examples from TED Countdown Summit 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '175374', 'title': '5 practical ways to take control of your life', 'slug': 'jim-vandehei-5-practical-ways-to-take-control-of-your-life', 'speaker': 'Jim VandeHei', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 654, 'duration_minutes': 11, 'published_at': '2026-03-31', 'recorded_on': '2025-11-11', 'views': 243174, 'topics': ['leadership', 'success', 'motivation', 'personal growth', 'goals'], 'image': 'images/talk_027_jim-vandehei-5-practical-ways-to-take-control-of.jpg', 'canonical_url': 'https://www.ted.com/talks/jim_vandehei_5_practical_ways_to_take_control_of_your_life', 'description': 'You can\'t control the world - but you can control you. That\'s the mantra that took Axios CEO Jim VandeHei, a once "unremarkably unremarkable 20-year-old," all the way to launching companies and interviewing presidents. He breaks down a career\'s worth of observations into five deceptively simple things you can control, and explores why mastering them can change the trajectory of your life.', 'transcript': 'Jim VandeHei opens by framing the central tension behind 5 practical ways to take control of your life. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '175298', 'title': 'Stress resets, the ultimate mental health hack', 'slug': 'jenny-taitz-stress-resets-the-ultimate-mental-health-hack', 'speaker': 'Jenny Taitz', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 630, 'duration_minutes': 10, 'published_at': '2026-03-30', 'recorded_on': '2025-11-10', 'views': 263345, 'topics': ['science', 'psychology', 'relationships', 'personal growth', 'mental health', 'emotions'], 'image': 'images/talk_028_jenny-taitz-stress-resets-the-ultimate-mental-he.jpg', 'canonical_url': 'https://www.ted.com/talks/jenny_taitz_stress_resets_the_ultimate_mental_health_hack', 'description': 'Stress is contagious - but so is calm. Psychologist Jenny Taitz explains why one stressful moment tends to snowball into the next, and shares small, immediate resets you can practice anywhere to break the spiral before it starts.', 'transcript': 'Jenny Taitz opens by framing the central tension behind Stress resets, the ultimate mental health hack. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '174198', 'title': 'Chicago, USA', 'slug': 'ted-idea-search-chicago-usa', 'speaker': 'TED Idea Search', 'event': 'TED Originals', 'talk_type': 'Original Content', 'duration_seconds': 2769, 'duration_minutes': 46, 'published_at': '2026-03-27', 'recorded_on': '2026-03-27', 'views': 28577, 'topics': ['social change'], 'image': 'images/talk_029_ted-idea-search-chicago-usa.jpg', 'canonical_url': 'https://www.ted.com/talks/ted_idea_search_chicago_usa', 'description': 'In the Windy City, 10 Chicagoans step onto the iconic red circle, each with six minutes to prove they have an idea that could change everything. Among them: a chemist who believes we can deploy precision medicine to save endangered species, a journalist creating tools to navigate difficult conversations and a runner challenging the narrative of a divided city by exploring every one of its streets. The stakes are personal, the competition is fierce - and one speaker will earn the chance to take their idea to the main stage at TED in Vancouver.', 'transcript': 'TED Idea Search opens by framing the central tension behind Chicago, USA. The talk then connects evidence, lived experience, and examples from TED Originals. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '175334', 'title': 'Why the world is still not built for women', 'slug': 'virginia-santy-why-the-world-is-still-not-built-for-women', 'speaker': 'Virginia Santy', 'event': 'TEDxMileHigh', 'talk_type': 'TEDx Talk', 'duration_seconds': 804, 'duration_minutes': 13, 'published_at': '2026-03-26', 'recorded_on': '2022-11-12', 'views': 214046, 'topics': ['design', 'cities', 'urban planning', 'social change', 'women', 'tedx', 'feminism'], 'image': 'images/talk_030_virginia-santy-why-the-world-is-still-not-built-.jpg', 'canonical_url': 'https://www.ted.com/talks/virginia_santy_why_the_world_is_still_not_built_for_women', 'description': 'Design consultant Virginia Santy set out to create an office space built specifically for women, flipping the script on the subtle (and not-so-subtle) ways that workplaces and cities still fail them. The results were striking: greater productivity, deeper collaboration and an environment where women felt genuinely valued, leading her to ask a simple question: What would the world look like if we designed with women in mind?', 'transcript': 'Virginia Santy opens by framing the central tension behind Why the world is still not built for women. The talk then connects evidence, lived experience, and examples from TEDxMileHigh. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '174197', 'title': 'Singapore', 'slug': 'ted-idea-search-singapore', 'speaker': 'TED Idea Search', 'event': 'TED Originals', 'talk_type': 'Original Content', 'duration_seconds': 0, 'duration_minutes': 1, 'published_at': '2026-03-25', 'recorded_on': '2026-03-25', 'views': 23267, 'topics': ['social change'], 'image': 'images/talk_031_ted-idea-search-singapore.jpg', 'canonical_url': 'https://www.ted.com/talks/ted_idea_search_singapore', 'description': "The TED Idea Search touches down in Singapore, where eight speakers compete for an extraordinary prize. From a diver-turned-ocean-restorer reviving dead coral reefs to a scientist growing sustainable building materials out of fungus and a government insider reimagining public institutions, the ideas are as diverse as the Lion City itself. As TED's coaches push each speaker to transform their thinking into a powerful narrative, nerves rise, breakthroughs emerge and one speaker earns the opportunity to share their idea on the global stage.", 'transcript': 'TED Idea Search opens by framing the central tension behind Singapore. The talk then connects evidence, lived experience, and examples from TED Originals. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '174672', 'title': 'My bank called in the middle of my TED Talk', 'slug': 'mike-albo-my-bank-called-in-the-middle-of-my-ted-talk', 'speaker': 'Mike Albo', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 344, 'duration_minutes': 6, 'published_at': '2026-03-25', 'recorded_on': '2025-11-10', 'views': 197679, 'topics': ['culture', 'technology', 'entertainment', 'consumerism', 'comedy', 'data'], 'image': 'images/talk_032_mike-albo-my-bank-called-in-the-middle-of-my-ted.jpg', 'canonical_url': 'https://www.ted.com/talks/mike_albo_my_bank_called_in_the_middle_of_my_ted_talk', 'description': 'In this TED Talk gone wrong, comedian Mike Albo receives an unexpected call from his bank. The result: a hilariously uncomfortable tour of his purchase history, and a reminder that in the digital age, our data knows us a little too well.', 'transcript': 'Mike Albo opens by framing the central tension behind My bank called in the middle of my TED Talk. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '174466', 'title': '3 ways to create a truly original design', 'slug': 'lope-gutierrez-ruiz-3-ways-to-create-a-truly-original-design', 'speaker': 'Lope Gutierrez-Ruiz', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 355, 'duration_minutes': 6, 'published_at': '2026-03-24', 'recorded_on': '2025-11-10', 'views': 217982, 'topics': ['culture', 'design', 'media', 'collaboration', 'creativity', 'art', 'ted fellows', 'animation'], 'image': 'images/talk_033_lope-gutierrez-ruiz-3-ways-to-create-a-truly-ori.jpg', 'canonical_url': 'https://www.ted.com/talks/lope_gutierrez_ruiz_3_ways_to_create_a_truly_original_design', 'description': "In a world where design trends are quietly converging - same color palettes, same typography, same illustration styles - how do you make work that actually looks different? Designer and TED Fellow Lope Gutierrez-Ruiz distills his answer into three sharp, counterintuitive ideas, ticking through his studio's own funky creations to show how you can make things that stand out.", 'transcript': 'Lope Gutierrez-Ruiz opens by framing the central tension behind 3 ways to create a truly original design. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '174464', 'title': '3 things I wish I knew when I was broke', 'slug': 'vivian-tu-3-things-i-wish-i-knew-when-i-was-broke', 'speaker': 'Vivian Tu', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 560, 'duration_minutes': 9, 'published_at': '2026-03-23', 'recorded_on': '2025-11-10', 'views': 300368, 'topics': ['business', 'personal growth', 'women in business', 'money', 'finance'], 'image': 'images/talk_034_vivian-tu-3-things-i-wish-i-knew-when-i-was-brok.jpg', 'canonical_url': 'https://www.ted.com/talks/vivian_tu_3_things_i_wish_i_knew_when_i_was_broke', 'description': "Finance doesn't have to feel like a foreign language. Wall Street trader-turned-financial educator Vivian Tu helps millions of people make sense of money, breaking down complex concepts into everyday terms you can understand. She shares how she broke free from the stress of living paycheck to paycheck - and explores how we can shift power structures to give everyone a real shot at building wealth.", 'transcript': 'Vivian Tu opens by framing the central tension behind 3 things I wish I knew when I was broke. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '174728', 'title': 'Joy will find you - if you let it', 'slug': 'david-larbi-joy-will-find-you-if-you-let-it', 'speaker': 'David Larbi', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 305, 'duration_minutes': 5, 'published_at': '2026-03-20', 'recorded_on': '2025-11-10', 'views': 243270, 'topics': ['performance', 'creativity', 'poetry', 'happiness', 'personal growth'], 'image': 'images/talk_035_david-larbi-joy-will-find-you-if-you-let-it.jpg', 'canonical_url': 'https://www.ted.com/talks/david_larbi_joy_will_find_you_if_you_let_it', 'description': 'Author David Larbi recites a poem about the journey toward joy, reminding us of all the ways it can be found: having a conversation with a stranger, tasting the perfect bite of food or enjoying a good stretch. Joy is all around us - you just need to know where to look.', 'transcript': 'David Larbi opens by framing the central tension behind Joy will find you - if you let it. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '174196', 'title': 'London, UK', 'slug': 'ted-idea-search-london-uk', 'speaker': 'TED Idea Search', 'event': 'TED Originals', 'talk_type': 'Original Content', 'duration_seconds': 2786, 'duration_minutes': 46, 'published_at': '2026-03-19', 'recorded_on': '2026-03-19', 'views': 38468, 'topics': ['social change'], 'image': 'images/talk_036_ted-idea-search-london-uk.jpg', 'canonical_url': 'https://www.ted.com/talks/ted_idea_search_london_uk', 'description': "In London, the TED Idea Search brings together 10 voices from one of the world's most influential cultural capitals to compete for the opportunity to speak on the main stage at TED. From a civil engineer revealing the invisible infrastructure shaping our cities to a classical singer uncovering the erased history of women in music, the ideas on offer are both deeply personal and global in scope. When the lights come up, London doesn't hold back - and one speaker delivers a talk no one in that room will soon forget.", 'transcript': 'TED Idea Search opens by framing the central tension behind London, UK. The talk then connects evidence, lived experience, and examples from TED Originals. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '173046', 'title': 'How to tune your inner voice', 'slug': 'rhonda-ross-daniel-alexander-jones-how-to-tune-your-inner-voice', 'speaker': 'Rhonda Ross, Daniel Alexander Jones', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 1196, 'duration_minutes': 20, 'published_at': '2026-03-19', 'recorded_on': '2025-11-09', 'views': 226951, 'topics': ['culture', 'music', 'creativity', 'art', 'relationships', 'personal growth', 'society', 'ted fellows', 'emotions'], 'image': 'images/talk_037_rhonda-ross-daniel-alexander-jones-how-to-tune-y.jpg', 'canonical_url': 'https://www.ted.com/talks/rhonda_ross_daniel_alexander_jones_how_to_tune_your_inner_voice', 'description': 'To calm the storm inside your mind, you must first understand it. Singer and actress Rhonda Ross shares her theory of "emotional sovereignty" - the idea that your feelings aren\'t shaped just by your circumstances, but by the thoughts running on loop in your head. In conversation with scholar and TED Fellow Daniel Alexander Jones, Ross introduces the unexpected, music-rooted practice for taking control of your narrative.', 'transcript': 'Rhonda Ross, Daniel Alexander Jones opens by framing the central tension behind How to tune your inner voice. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '174671', 'title': 'The 6 eras of NBA fashion - from restrained to radical', 'slug': 'mitchell-s-jackson-the-6-eras-of-nba-fashion-from-restrained-to-radical', 'speaker': 'Mitchell S. Jackson', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 564, 'duration_minutes': 9, 'published_at': '2026-03-19', 'recorded_on': '2025-11-11', 'views': 183882, 'topics': ['culture', 'history', 'sports', 'fashion', 'ted fellows', 'protest'], 'image': 'images/talk_038_mitchell-s-jackson-the-6-eras-of-nba-fashion-fro.jpg', 'canonical_url': 'https://www.ted.com/talks/mitchell_s_jackson_the_6_eras_of_nba_fashion_from_restrained_to_radical', 'description': 'What are you wearing, and why? This is the question that writer and TED Fellow Mitchell S. Jackson asks as he unpacks the six eras of NBA style. Tracing an arc from Bill Russell to Lebron James and beyond, he explores how players use fashion on and off the court to challenge the limits placed upon them - revealing a deeper story about culture, identity and power.', 'transcript': 'Mitchell S. Jackson opens by framing the central tension behind The 6 eras of NBA fashion - from restrained to radical. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '174584', 'title': 'I taught rats to drive. They taught me to enjoy the ride', 'slug': 'kelly-lambert-i-taught-rats-to-drive-they-taught-me-to-enjoy-the-ride', 'speaker': 'Kelly Lambert', 'event': 'TEDxRVA Youth', 'talk_type': 'TEDx Talk', 'duration_seconds': 840, 'duration_minutes': 14, 'published_at': '2026-03-18', 'recorded_on': '2025-11-09', 'views': 217160, 'topics': ['science', 'animals', 'happiness', 'brain', 'neuroscience', 'tedx', 'emotions'], 'image': 'images/talk_039_kelly-lambert-i-taught-rats-to-drive-they-taught.jpg', 'canonical_url': 'https://www.ted.com/talks/kelly_lambert_i_taught_rats_to_drive_they_taught_me_to_enjoy_the_ride', 'description': 'What can happy rats teach us about human joy? Behavioral neuroscientist Kelly Lambert describes how her team trained rats to drive tiny cars to earn treats - and noticed something surprising about how effort and anticipation affect the brain. The experiment opens new questions about how reward, agency and "behaviorceuticals" might help build resilience and support mental health.', 'transcript': 'Kelly Lambert opens by framing the central tension behind I taught rats to drive. They taught me to enjoy the ride. The talk then connects evidence, lived experience, and examples from TEDxRVA Youth. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '174670', 'title': 'Is luck random - or can you cultivate it?', 'slug': 'christian-busch-is-luck-random-or-can-you-cultivate-it', 'speaker': 'Christian Busch', 'event': 'TED@BCG', 'talk_type': 'TED Institute Talk', 'duration_seconds': 768, 'duration_minutes': 13, 'published_at': '2026-03-17', 'recorded_on': '2025-10-23', 'views': 833338, 'topics': ['science', 'future', 'personal growth', 'decision-making'], 'image': 'images/talk_040_christian-busch-is-luck-random-or-can-you-cultiv.jpg', 'canonical_url': 'https://www.ted.com/talks/christian_busch_is_luck_random_or_can_you_cultivate_it', 'description': 'When the 2025 Los Angeles wildfires destroyed his home and neighborhood, scientist Christian Busch encountered the opposite of serendipity: "zemblanity," or bad luck by design. Drawing on more than a decade of scientific research, he explores how people can navigate unpredictability by adopting a serendipity mindset that transforms setbacks into unexpected new beginnings. He asks: What if good luck isn\'t random but can actually be cultivated?', 'transcript': 'Christian Busch opens by framing the central tension behind Is luck random - or can you cultivate it?. The talk then connects evidence, lived experience, and examples from TED@BCG. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '174283', 'title': 'How to make transportation quieter, cleaner and cheaper', 'slug': 'doreen-orishaba-how-to-make-transportation-quieter-cleaner-and-cheaper', 'speaker': 'Doreen Orishaba', 'event': 'TED Countdown Summit 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 671, 'duration_minutes': 11, 'published_at': '2026-03-16', 'recorded_on': '2025-06-18', 'views': 214856, 'topics': ['climate change', 'transportation', 'africa', 'countdown'], 'image': 'images/talk_041_doreen-orishaba-how-to-make-transportation-quiet.jpg', 'canonical_url': 'https://www.ted.com/talks/doreen_orishaba_how_to_make_transportation_quieter_cleaner_and_cheaper', 'description': 'When Doreen Orishaba helped build Africa\'s first electric car in 2011, skeptics dismissed it as a "toy for the Western world." Now she\'s running dozens of electric buses across Kenya and Rwanda, moving thousands of passengers to work every day on zero-exhaust vehicles powered by near-silent engines. She breaks down what it actually takes to scale clean transport - and why skipping the gas station pit stop is closer than you may think.', 'transcript': 'Doreen Orishaba opens by framing the central tension behind How to make transportation quieter, cleaner and cheaper. The talk then connects evidence, lived experience, and examples from TED Countdown Summit 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '174282', 'title': 'What China can teach the world about scaling clean energy', 'slug': 'yin-yu-what-china-can-teach-the-world-about-scaling-clean-energy', 'speaker': 'Yin Yu', 'event': 'TED Countdown Summit 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 545, 'duration_minutes': 9, 'published_at': '2026-03-13', 'recorded_on': '2025-06-18', 'views': 8098, 'topics': ['climate change', 'sustainability', 'energy', 'china', 'solar energy', 'countdown', 'renewable energy'], 'image': 'images/talk_042_yin-yu-what-china-can-teach-the-world-about-scal.jpg', 'canonical_url': 'https://www.ted.com/talks/yin_yu_what_china_can_teach_the_world_about_scaling_clean_energy', 'description': 'When Yin Yu first visited a major hydropower dam site in China, she expected to see a thriving community. Instead, she found families who\'d lost their land and livelihoods to the rising water. It was a powerful lesson in how "green" megaprojects can harm the people they\'re meant to help. Now, as solar and electric vehicles spread rapidly across Southeast Asia, Yin says the opportunity is enormous - but only if countries don\'t repeat the mistakes of the past.', 'transcript': 'Yin Yu opens by framing the central tension behind What China can teach the world about scaling clean energy. The talk then connects evidence, lived experience, and examples from TED Countdown Summit 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '174195', 'title': 'Lagos, Nigeria', 'slug': 'ted-idea-search-lagos-nigeria', 'speaker': 'TED Idea Search', 'event': 'TED Originals', 'talk_type': 'Original Content', 'duration_seconds': 2792, 'duration_minutes': 47, 'published_at': '2026-03-12', 'recorded_on': '2026-03-12', 'views': 20035, 'topics': ['social change'], 'image': 'images/talk_043_ted-idea-search-lagos-nigeria.jpg', 'canonical_url': 'https://www.ted.com/talks/ted_idea_search_lagos_nigeria', 'description': "In the heart of Lagos - a megacity of 20 million people pulsing with energy and big ambitions - nine undiscovered voices compete for a chance to speak on the world's biggest stage for ideas. From a renewable energy advocate who studied by candlelight to an archivist reimagining Africa-centered education, these speakers bring stories with global stakes. But only one will earn the 7,000-mile journey to the TED stage in Vancouver.", 'transcript': 'TED Idea Search opens by framing the central tension behind Lagos, Nigeria. The talk then connects evidence, lived experience, and examples from TED Originals. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '137525', 'title': '"May Your Kindness Remain" / "If I Told"', 'slug': 'courtney-marie-andrews-may-your-kindness-remain-if-i-told', 'speaker': 'Courtney Marie Andrews', 'event': 'TEDCountdown@BloombergGreenFestival', 'talk_type': 'TED Stage Talk', 'duration_seconds': 634, 'duration_minutes': 11, 'published_at': '2026-03-11', 'recorded_on': '2024-07-12', 'views': 8624, 'topics': ['environment', 'music', 'performance'], 'image': 'images/talk_044_courtney-marie-andrews-may-your-kindness-remain-.jpg', 'canonical_url': 'https://www.ted.com/talks/courtney_marie_andrews_may_your_kindness_remain_if_i_told', 'description': 'Singer-songwriter Courtney Marie Andrews performs "If I Told" and "May Your Kindness Remain," songs based on her connection to music, nature and environmental advocacy.', 'transcript': 'Courtney Marie Andrews opens by framing the central tension behind "May Your Kindness Remain" / "If I Told". The talk then connects evidence, lived experience, and examples from TEDCountdown@BloombergGreenFestival. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '174194', 'title': 'Athens, Greece', 'slug': 'ted-idea-search-athens-greece', 'speaker': 'TED Idea Search', 'event': 'TED Originals', 'talk_type': 'Original Content', 'duration_seconds': 2892, 'duration_minutes': 48, 'published_at': '2026-03-10', 'recorded_on': '2026-03-10', 'views': 38463, 'topics': ['social change'], 'image': 'images/talk_045_ted-idea-search-athens-greece.jpg', 'canonical_url': 'https://www.ted.com/talks/ted_idea_search_athens_greece', 'description': "The next stop on the TED Idea Search is Athens, birthplace of democracy and the world's oldest debating tradition. Nine speakers - from a fashion manufacturer taking on modern slavery to a microbiologist tackling the science of bad breath - go head-to-head for a shot to speak on the TED stage in Vancouver. Rehearsals are rocky, nerves are real and the stakes couldn't be higher - and only one speaker gets to move on and represent Athens to the world.", 'transcript': 'TED Idea Search opens by framing the central tension behind Athens, Greece. The talk then connects evidence, lived experience, and examples from TED Originals. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '173420', 'title': 'What would your "deathbed self" tell you today?', 'slug': 'lauren-deeley-what-would-your-deathbed-self-tell-you-today', 'speaker': 'Lauren Deeley', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 379, 'duration_minutes': 6, 'published_at': '2026-03-10', 'recorded_on': '2025-11-10', 'views': 252860, 'topics': ['future', 'work', 'personal growth', 'self', 'money', 'life'], 'image': 'images/talk_046_lauren-deeley-what-would-your-deathbed-self-tell.jpg', 'canonical_url': 'https://www.ted.com/talks/lauren_deeley_what_would_your_deathbed_self_tell_you_today', 'description': 'What if the key to making better decisions today is getting to know the person you\'ll become tomorrow? Drawing on psychological research and real-life stories, private wealth advisor Lauren Deeley explores how building a meaningful connection with your "deathbed self" can bring more clarity, joy and intention to the life you\'re building right now.', 'transcript': 'Lauren Deeley opens by framing the central tension behind What would your "deathbed self" tell you today?. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '174009', 'title': 'Mumbai, India', 'slug': 'ted-idea-search-mumbai-india', 'speaker': 'TED Idea Search', 'event': 'TED Originals', 'talk_type': 'Original Content', 'duration_seconds': 2738, 'duration_minutes': 46, 'published_at': '2026-03-09', 'recorded_on': '2026-03-09', 'views': 22102, 'topics': ['social change'], 'image': 'images/talk_047_ted-idea-search-mumbai-india.jpg', 'canonical_url': 'https://www.ted.com/talks/ted_idea_search_mumbai_india', 'description': "In Mumbai, the TED Idea Search lands in India's bustling financial and creative capital, where 10 speakers are challenged to deliver the talk of their lives and compete for a one-of-a-kind opportunity: a spot on the TED stage in Vancouver. What emerges is a moving portrait of vulnerability and ambition, as ideas about vanishing tribal art, maternal health and India's forgotten fashion history look to shift perspectives on a global scale. Only one can make it through - who will it be?", 'transcript': 'TED Idea Search opens by framing the central tension behind Mumbai, India. The talk then connects evidence, lived experience, and examples from TED Originals. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '173439', 'title': 'Why you should keep a list of what makes you laugh', 'slug': 'chris-duffy-why-you-should-keep-a-list-of-what-makes-you-laugh', 'speaker': 'Chris Duffy', 'event': 'TED Talks Daily Book Club', 'talk_type': 'TED Stage Talk', 'duration_seconds': 3426, 'duration_minutes': 57, 'published_at': '2026-03-09', 'recorded_on': '2026-02-18', 'views': 229371, 'topics': ['culture', 'creativity', 'personal growth', 'comedy', 'humor'], 'image': 'images/talk_048_chris-duffy-why-you-should-keep-a-list-of-what-m.jpg', 'canonical_url': 'https://www.ted.com/talks/chris_duffy_why_you_should_keep_a_list_of_what_makes_you_laugh', 'description': 'The world is weird and hilarious - if you know where to look, says comedian Chris Duffy. In conversation with "TED Talks Daily" host Elise Hu, Duffy breaks down three practical pillars of humor, showing how laughter can help you feel present, creative and connected, even when the world feels overwhelming. (This conversation was part of an exclusive TED Membership event. TED Membership is the best way to support and engage with the big ideas you love from TED. To learn more, visit ted.com/membership.)', 'transcript': 'Chris Duffy opens by framing the central tension behind Why you should keep a list of what makes you laugh. The talk then connects evidence, lived experience, and examples from TED Talks Daily Book Club. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '172133', 'title': 'Conservation: a love story', 'slug': 'elsaphan-njora-conservation-a-love-story', 'speaker': 'Elsaphan Njora', 'event': 'TED Countdown Summit 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 520, 'duration_minutes': 9, 'published_at': '2026-03-06', 'recorded_on': '2025-06-17', 'views': 208417, 'topics': ['climate change', 'nature', 'love', 'biodiversity', 'conservation', 'countdown'], 'image': 'images/talk_049_elsaphan-njora-conservation-a-love-story.jpg', 'canonical_url': 'https://www.ted.com/talks/elsaphan_njora_conservation_a_love_story', 'description': "What if the key to saving nature isn't just about science or policy, but love? Love for the land, for the people who depend on it, for the world we leave behind. Artist Elsaphan Njora has journeyed across Kenya witnessing ecosystems vanish, from Indigenous forests to sacred lakes. But he's also seen communities breathing life back into rivers, forests and coasts in creative, unexpected ways - showing that conservation can flourish alongside livelihoods, and that even the most threatened landscapes can be reborn.", 'transcript': 'Elsaphan Njora opens by framing the central tension behind Conservation: a love story. The talk then connects evidence, lived experience, and examples from TED Countdown Summit 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '173850', 'title': 'Sydney, Australia', 'slug': 'ted-idea-search-sydney-australia', 'speaker': 'TED Idea Search', 'event': 'TED Originals', 'talk_type': 'Original Content', 'duration_seconds': 2625, 'duration_minutes': 44, 'published_at': '2026-03-04', 'recorded_on': '2026-03-04', 'views': 46087, 'topics': ['society'], 'image': 'images/talk_050_ted-idea-search-sydney-australia.jpg', 'canonical_url': 'https://www.ted.com/talks/ted_idea_search_sydney_australia', 'description': "In the premiere of the TED Idea Search, we travel to Sydney, Australia, where 10 brilliant people take the stage for the shot of a lifetime: a chance to speak at the TED conference in Vancouver. From a wildlife scientist deploying AI to bust illegal trafficking networks to Australia's own human rights commissioner sounding the alarm on brain-reading technology, these speakers bring ideas that could genuinely shift how we live. But only one can win - and the choice comes down to a single, unforgettable talk that leaves the audience (and the judges) blown away.", 'transcript': 'TED Idea Search opens by framing the central tension behind Sydney, Australia. The talk then connects evidence, lived experience, and examples from TED Originals. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '173043', 'title': '3 habits to practice curiosity - and escape your phone', 'slug': 'nayeema-raza-3-habits-to-practice-curiosity-and-escape-your-phone', 'speaker': 'Nayeema Raza', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 312, 'duration_minutes': 5, 'published_at': '2026-03-04', 'recorded_on': '2025-11-11', 'views': 554563, 'topics': ['culture', 'technology', 'social change', 'society', 'curiosity'], 'image': 'images/talk_051_nayeema-raza-3-habits-to-practice-curiosity-and-.jpg', 'canonical_url': 'https://www.ted.com/talks/nayeema_raza_3_habits_to_practice_curiosity_and_escape_your_phone', 'description': "We're so entangled with our devices that online has started to feel more real than IRL, says journalist Nayeema Raza. As screens reshape how we connect and relate, she offers three practical habits to reignite curiosity, restore presence and break free from our phones.", 'transcript': 'Nayeema Raza opens by framing the central tension behind 3 habits to practice curiosity - and escape your phone. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '173440', 'title': '4 relationship traps that lead to burnout', 'slug': 'eric-quintane-4-relationship-traps-that-lead-to-burnout', 'speaker': 'Eric Quintane', 'event': 'TEDxESMTBerlin', 'talk_type': 'TEDx Talk', 'duration_seconds': 991, 'duration_minutes': 17, 'published_at': '2026-03-04', 'recorded_on': '2025-02-01', 'views': 285438, 'topics': ['business', 'psychology', 'relationships', 'communication', 'work', 'personal growth', 'society', 'tedx'], 'image': 'images/talk_052_eric-quintane-4-relationship-traps-that-lead-to-.jpg', 'canonical_url': 'https://www.ted.com/talks/eric_quintane_4_relationship_traps_that_lead_to_burnout', 'description': 'Are your workplace relationships quietly burning you out? Drawing on large-scale research across industries, organizational behavior researcher Eric Quintane reveals four hidden relational traps woven into the fabric of work - and explores how connection shapes resilience, vulnerability and burnout.', 'transcript': 'Eric Quintane opens by framing the central tension behind 4 relationship traps that lead to burnout. The talk then connects evidence, lived experience, and examples from TEDxESMTBerlin. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '173576', 'title': 'Love, intimacy and connection in the age of AI', 'slug': 'bryony-cole-love-intimacy-and-connection-in-the-age-of-ai', 'speaker': 'Bryony Cole', 'event': 'TED Membership', 'talk_type': 'TED Stage Talk', 'duration_seconds': 2631, 'duration_minutes': 44, 'published_at': '2026-03-03', 'recorded_on': '2026-02-05', 'views': 203689, 'topics': ['technology', 'love', 'relationships', 'ai', 'sex', 'ted membership'], 'image': 'images/talk_053_bryony-cole-love-intimacy-and-connection-in-the-.jpg', 'canonical_url': 'https://www.ted.com/talks/bryony_cole_love_intimacy_and_connection_in_the_age_of_ai', 'description': "Relationships were never meant to be efficient, says sextech expert Bryony Cole, and yet AI companions are increasingly designed to be exactly that. As intimate relationships between humans and AI become more common, Cole challenges us to think more deliberately about how we shape our connections to machines - and with each other. (This conversation, hosted by TED's Whitney Pennington Rodgers, was part of an exclusive TED Membership event. TED Membership is the best way to support and engage with the big ideas you love from TED. To learn more, visit ted.com/membership.)", 'transcript': 'Bryony Cole opens by framing the central tension behind Love, intimacy and connection in the age of AI. The talk then connects evidence, lived experience, and examples from TED Membership. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '173044', 'title': 'The sneaky language tricks cults use to influence you', 'slug': 'amanda-montell-the-sneaky-language-tricks-cults-use-to-influence-you', 'speaker': 'Amanda Montell', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 354, 'duration_minutes': 6, 'published_at': '2026-03-02', 'recorded_on': '2025-11-11', 'views': 260199, 'topics': ['culture', 'media', 'relationships', 'communication', 'community', 'language', 'society'], 'image': 'images/talk_054_amanda-montell-the-sneaky-language-tricks-cults-.jpg', 'canonical_url': 'https://www.ted.com/talks/amanda_montell_the_sneaky_language_tricks_cults_use_to_influence_you', 'description': "In the age of social media and wellness trends, the comments section is as good as a cult compound, says linguist and cultural commentator Amanda Montell. Using Taylor Swift's throng of devoted Swifties as her guide, she exposes three sneaky language tactics that cults use to influence us (for better or for worse), revealing why none of us are as cult-proof as we'd like to think.", 'transcript': 'Amanda Montell opens by framing the central tension behind The sneaky language tricks cults use to influence you. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '173511', 'title': 'The attack on Iran - why now?', 'slug': 'ian-bremmer-the-attack-on-iran-why-now', 'speaker': 'Ian Bremmer', 'event': 'TED Explains the World with Ian Bremmer', 'talk_type': 'Original Content', 'duration_seconds': 2669, 'duration_minutes': 44, 'published_at': '2026-03-01', 'recorded_on': '2026-02-28', 'views': 684021, 'topics': ['global issues', 'politics', 'military', 'war', 'government', 'middle east', 'policy', 'international relations', 'current events'], 'image': 'images/talk_055_ian-bremmer-the-attack-on-iran-why-now.jpg', 'canonical_url': 'https://www.ted.com/talks/ian_bremmer_the_attack_on_iran_why_now', 'description': 'On the morning of February 28, 2026, the US and Israel bombed several parts of Iran, including the Tehran compound of Supreme Leader Ali Khamenei. Geopolitical expert and Eurasia Group founder Ian Bremmer breaks down why US President Donald Trump made the decision to strike, what it means for hopes of "regime change" and the key details you need to know about this perilous moment in global history. (This interview, hosted by TED\'s Helen Walters, was recorded on February 28, 2026.)', 'transcript': 'Ian Bremmer opens by framing the central tension behind The attack on Iran - why now?. The talk then connects evidence, lived experience, and examples from TED Explains the World with Ian Bremmer. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '173004', 'title': "What to do when you're told there's nothing left to try", 'slug': 'david-fajgenbaum-and-kiah-williams-what-to-do-when-you-re-told-there-s-nothing-left-to-try', 'speaker': 'David Fajgenbaum and Kiah Williams', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 1720, 'duration_minutes': 29, 'published_at': '2026-02-27', 'recorded_on': '2025-11-10', 'views': 220867, 'topics': ['science', 'technology', 'social change', 'health', 'health care', 'medicine', 'poverty', 'personal growth', 'ai', 'public health', 'medical research', 'the audacious project', 'artificial intelligence'], 'image': 'images/talk_056_david-fajgenbaum-and-kiah-williams-what-to-do-wh.jpg', 'canonical_url': 'https://www.ted.com/talks/david_fajgenbaum_and_kiah_williams_what_to_do_when_you_re_told_there_s_nothing_left_to_try', 'description': "What do you do when the world declares something impossible? When physician-scientist David Fajgenbaum was dying from a rare disease and social entrepreneur Kiah Williams was confronting the realities of economic hardship, they began asking a different question: What can I do today? In this conversation, they discuss how turning hope into action can drive meaningful change - one step at a time. (This conversation is hosted by The Audacious Project's Alexandra Tillmann.)", 'transcript': "David Fajgenbaum and Kiah Williams opens by framing the central tension behind What to do when you're told there's nothing left to try. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.", 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '172996', 'title': 'My year living with a robot', 'slug': 'emily-kate-genatowski-my-year-living-with-a-robot', 'speaker': 'Emily Kate Genatowski', 'event': 'TEDAI Vienna 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 830, 'duration_minutes': 14, 'published_at': '2026-02-25', 'recorded_on': '2025-09-26', 'views': 246590, 'topics': ['technology', 'robots', 'ai', 'life'], 'image': 'images/talk_057_emily-kate-genatowski-my-year-living-with-a-robo.jpg', 'canonical_url': 'https://www.ted.com/talks/emily_kate_genatowski_my_year_living_with_a_robot', 'description': "Imagine a robot moving into your home. How would it change your daily life? Historian Emily Kate Genatowski shares five eye-opening lessons from a year living with her AI-powered robot roommate, from the quirky and chaotic to the surprisingly mundane. Her experiences show that the future of robots isn't science fiction - it's practical, messy and already here.", 'transcript': 'Emily Kate Genatowski opens by framing the central tension behind My year living with a robot. The talk then connects evidence, lived experience, and examples from TEDAI Vienna 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '172999', 'title': 'Jermaine Dupri on the art of making a hit | On the Spot', 'slug': 'jermaine-dupri-jermaine-dupri-on-the-art-of-making-a-hit-on-the-spot', 'speaker': 'Jermaine Dupri', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 660, 'duration_minutes': 11, 'published_at': '2026-02-26', 'recorded_on': '2025-11-10', 'views': 211240, 'topics': ['culture', 'entertainment', 'music', 'collaboration', 'creativity', 'art'], 'image': 'images/talk_058_jermaine-dupri-jermaine-dupri-on-the-art-of-maki.jpg', 'canonical_url': 'https://www.ted.com/talks/jermaine_dupri_jermaine_dupri_on_the_art_of_making_a_hit_on_the_spot', 'description': 'Legendary music producer Jermaine Dupri pulls back the curtain on how hit songs really get made in TED\'s rapid-fire Q&A format, "On the Spot." Answering a stream of unexpected questions, he covers what makes a good hook, why he doesn\'t chase "cool," how he helped build Atlanta\'s sound and more.', 'transcript': 'Jermaine Dupri opens by framing the central tension behind Jermaine Dupri on the art of making a hit | On the Spot. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '171661', 'title': 'The controversial climate tool funding real change', 'slug': 'sandeep-roy-choudhury-the-controversial-climate-tool-funding-real-change', 'speaker': 'Sandeep Roy Choudhury', 'event': 'TED Countdown Summit 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 535, 'duration_minutes': 9, 'published_at': '2026-02-24', 'recorded_on': '2025-06-17', 'views': 221876, 'topics': ['climate change', 'environment', 'sustainability', 'finance', 'countdown'], 'image': 'images/talk_059_sandeep-roy-choudhury-the-controversial-climate-.jpg', 'canonical_url': 'https://www.ted.com/talks/sandeep_roy_choudhury_the_controversial_climate_tool_funding_real_change', 'description': "If a company plants trees to offset its pollution, is that climate progress - or is it greenwashing? Critics of carbon markets say it's the latter. But Sandeep Roy Choudhury, who's spent two decades financing climate projects from rural cookstoves to coastal forests, says the real failure is discouraging companies from even trying. Hear his case for why we shouldn't let perfection block meaningful action on climate change.", 'transcript': 'Sandeep Roy Choudhury opens by framing the central tension behind The controversial climate tool funding real change. The talk then connects evidence, lived experience, and examples from TED Countdown Summit 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '172142', 'title': 'A surprisingly effective way to fight misinformation', 'slug': 'dave-jorgenson-a-surprisingly-effective-way-to-fight-misinformation', 'speaker': 'Dave Jorgenson', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 754, 'duration_minutes': 13, 'published_at': '2026-02-23', 'recorded_on': '2025-11-09', 'views': 406598, 'topics': ['culture', 'media', 'humor', 'society', 'internet'], 'image': 'images/talk_060_dave-jorgenson-a-surprisingly-effective-way-to-f.jpg', 'canonical_url': 'https://www.ted.com/talks/dave_jorgenson_a_surprisingly_effective_way_to_fight_misinformation', 'description': "What if the best defense against misinformation isn't panic, but a punchline? Journalist and comedian Dave Jorgenson explores how misinformation has proliferated throughout history - from the age of Plato to the era of viral TikToks. With his own short, absurdist sketches that explain the news, he shows how humor can cut through fear, spark curiosity and explore nuanced truth.", 'transcript': 'Dave Jorgenson opens by framing the central tension behind A surprisingly effective way to fight misinformation. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '172495', 'title': 'How a viral choreographer makes his moves', 'slug': 'sean-bankhead-how-a-viral-choreographer-makes-his-moves', 'speaker': 'Sean Bankhead', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 399, 'duration_minutes': 7, 'published_at': '2026-02-20', 'recorded_on': '2025-11-09', 'views': 26868, 'topics': ['culture', 'music', 'performance', 'art', 'dance'], 'image': 'images/talk_061_sean-bankhead-how-a-viral-choreographer-makes-hi.jpg', 'canonical_url': 'https://www.ted.com/talks/sean_bankhead_how_a_viral_choreographer_makes_his_moves', 'description': 'In a swaggering performance, choreographer Sean Bankhead and his students perform the viral dance he designed for Victoria Monet\'s hit song "On My Mama." Rooted in Black culture and inspired by generations of iconic artists, Bankhead blends expertise with at least one move everyone can try - showing how choreography doesn\'t just reflect culture, it drives it forward.', 'transcript': 'Sean Bankhead opens by framing the central tension behind How a viral choreographer makes his moves. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '172774', 'title': "The story you're not hearing about AI data centers", 'slug': 'ay-e-coskun-the-story-you-re-not-hearing-about-ai-data-centers', 'speaker': 'Ayse Coskun', 'event': 'TEDAI San Francisco', 'talk_type': 'TED Stage Talk', 'duration_seconds': 717, 'duration_minutes': 12, 'published_at': '2026-02-19', 'recorded_on': '2025-10-21', 'views': 302717, 'topics': ['environment', 'sustainability', 'technology', 'energy', 'ai', 'data', 'renewable energy'], 'image': 'images/talk_062_ay-e-coskun-the-story-you-re-not-hearing-about-a.jpg', 'canonical_url': 'https://www.ted.com/talks/ay_e_coskun_the_story_you_re_not_hearing_about_ai_data_centers', 'description': "The race to build smarter AI is crashing into a physical limitation: the power grid simply can't keep up with the energy demands of data centers. Computer scientist Ayse Coskun shows how we could turn this problem on its head, transforming AI facilities into virtual batteries that help stabilize the grid and accelerate clean energy. Learn why the technology causing this crisis might be the only thing smart enough to fix it.", 'transcript': "Ayse Coskun opens by framing the central tension behind The story you're not hearing about AI data centers. The talk then connects evidence, lived experience, and examples from TEDAI San Francisco. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.", 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '170176', 'title': 'How to be a great listener', 'slug': 'maegan-stephens-nicole-lowenbraun-how-to-be-a-great-listener', 'speaker': 'Maegan Stephens, Nicole Lowenbraun', 'event': 'TED@BCG', 'talk_type': 'TED Stage Talk', 'duration_seconds': 706, 'duration_minutes': 12, 'published_at': '2026-02-19', 'recorded_on': '2025-10-23', 'views': 357273, 'topics': ['communication', 'leadership', 'work', 'trust', 'goals'], 'image': 'images/talk_063_maegan-stephens-nicole-lowenbraun-how-to-be-a-gr.jpg', 'canonical_url': 'https://www.ted.com/talks/maegan_stephens_nicole_lowenbraun_how_to_be_a_great_listener', 'description': 'Have you ever left a meeting thinking: everyone talked, but nothing was achieved? Chances are that people were listening to each other, just not in the same way. Listening experts Maegan Stephens and Nicole Lowenbraun unpack the four different ways to listen, sharing a practical framework that could change how you respond, build trust and get results - starting with just one simple question.', 'transcript': 'Maegan Stephens, Nicole Lowenbraun opens by framing the central tension behind How to be a great listener. The talk then connects evidence, lived experience, and examples from TED@BCG. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '170828', 'title': "What you know that AI doesn't", 'slug': 'priyanka-vergadia-what-you-know-that-ai-doesn-t', 'speaker': 'Priyanka Vergadia', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 559, 'duration_minutes': 9, 'published_at': '2026-02-18', 'recorded_on': '2025-11-10', 'views': 278682, 'topics': ['technology', 'collaboration', 'work', 'ai', 'career'], 'image': 'images/talk_064_priyanka-vergadia-what-you-know-that-ai-doesn-t.jpg', 'canonical_url': 'https://www.ted.com/talks/priyanka_vergadia_what_you_know_that_ai_doesn_t', 'description': "AI is good at seeing patterns, but it's humans who figure out what to do next, says technologist Priyanka Vergadia. She shares three stories of human excellence sparked by AI insights and offers a pathway to identify and cultivate your irreplaceable qualities, turning the AI revolution from a threat into an opportunity.", 'transcript': "Priyanka Vergadia opens by framing the central tension behind What you know that AI doesn't. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.", 'recommended_for': ['solo learning', 'research notes', 'evening watch']}] + +PLAYLISTS = [{'slug': 'ai-and-society', 'title': 'AI, Society, and the Future', 'description': 'Talks about artificial intelligence, prediction, work, law, and public life.', 'topic': 'AI|artificial intelligence|future|technology|law'}, {'slug': 'design-and-creativity', 'title': 'Design, Creativity, and Art', 'description': 'A set of design and creativity talks for teams planning a workshop.', 'topic': 'design|creativity|art|architecture|innovation'}, {'slug': 'climate-nature-conservation', 'title': 'Climate, Nature, and Conservation', 'description': 'Talks about conservation, clean energy, oceans, animals, and climate action.', 'topic': 'nature|climate change|renewable energy|conservation|ocean|animals|wildlife'}, {'slug': 'health-science-body', 'title': 'Health, Science, and the Body', 'description': 'Science and medicine talks with practical questions for public health.', 'topic': 'health|health care|medicine|disease|biology|science'}, {'slug': 'culture-democracy-stories', 'title': 'Culture, Democracy, and Stories', 'description': 'Talks about culture, rights, media, storytelling, and civic life.', 'topic': 'culture|democracy|government|media|storytelling|society|social change'}, {'slug': 'work-business-leadership', 'title': 'Work, Business, and Leadership', 'description': 'Talks about leadership, organizations, money, careers, and decision-making.', 'topic': 'business|work|leadership|money|finance|economics'}, {'slug': 'music-performance-art', 'title': 'Music, Performance, and Art', 'description': 'Performances and creative talks for audiences comparing style, culture, and sound.', 'topic': 'music|performance|dance|sound|art'}] + +EVENTS = [{'slug': 'ted-countdown-summit-2025', 'name': 'TED Countdown Summit 2025', 'city': 'Nairobi', 'month': 'June 2025', 'track': 'Community', 'capacity': 500}, {'slug': 'ted-explains-the-world-with-ian-bremmer', 'name': 'TED Explains the World with Ian Bremmer', 'city': 'Global', 'month': 'May 2026', 'track': 'Community', 'capacity': 570}, {'slug': 'ted-membership', 'name': 'TED Membership', 'city': 'Global', 'month': 'May 2026', 'track': 'Community', 'capacity': 640}, {'slug': 'ted-originals', 'name': 'TED Originals', 'city': 'Global', 'month': 'May 2026', 'track': 'Community', 'capacity': 710}, {'slug': 'ted-talks-daily-book-club', 'name': 'TED Talks Daily Book Club', 'city': 'Global', 'month': 'May 2026', 'track': 'Community', 'capacity': 780}, {'slug': 'ted2026', 'name': 'TED2026', 'city': 'Vancouver', 'month': 'April 2026', 'track': 'Flagship', 'capacity': 850}, {'slug': 'ted-bcg', 'name': 'TED@BCG', 'city': 'Global', 'month': 'May 2026', 'track': 'Community', 'capacity': 920}, {'slug': 'tedai-san-francisco', 'name': 'TEDAI San Francisco', 'city': 'Global', 'month': 'May 2026', 'track': 'Community', 'capacity': 990}, {'slug': 'tedai-vienna-2025', 'name': 'TEDAI Vienna 2025', 'city': 'Global', 'month': 'May 2026', 'track': 'Community', 'capacity': 1060}, {'slug': 'tedcountdown-bloomberggreenfestival', 'name': 'TEDCountdown@BloombergGreenFestival', 'city': 'Nairobi', 'month': 'June 2025', 'track': 'Community', 'capacity': 1130}, {'slug': 'tednext-2025', 'name': 'TEDNext 2025', 'city': 'Atlanta', 'month': 'November 2025', 'track': 'Community', 'capacity': 1200}, {'slug': 'tedxesmtberlin', 'name': 'TEDxESMTBerlin', 'city': 'Washington, DC', 'month': 'May 2026', 'track': 'TEDx', 'capacity': 1270}, {'slug': 'tedxmanchester', 'name': 'TEDxManchester', 'city': 'Washington, DC', 'month': 'May 2026', 'track': 'TEDx', 'capacity': 1340}, {'slug': 'tedxmidatlantic', 'name': 'TEDxMidAtlantic', 'city': 'Washington, DC', 'month': 'May 2026', 'track': 'TEDx', 'capacity': 1410}, {'slug': 'tedxmilehigh', 'name': 'TEDxMileHigh', 'city': 'Washington, DC', 'month': 'May 2026', 'track': 'TEDx', 'capacity': 1480}, {'slug': 'tedxnova', 'name': 'TEDxNoVA', 'city': 'Washington, DC', 'month': 'May 2026', 'track': 'TEDx', 'capacity': 1550}, {'slug': 'tedxrva-youth', 'name': 'TEDxRVA Youth', 'city': 'Washington, DC', 'month': 'May 2026', 'track': 'TEDx', 'capacity': 1620}] diff --git a/sites/ted/static/css/.gitkeep b/sites/ted/static/css/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/sites/ted/static/css/main.css b/sites/ted/static/css/main.css new file mode 100644 index 0000000..eb91f6a --- /dev/null +++ b/sites/ted/static/css/main.css @@ -0,0 +1,99 @@ +:root { + --red: #eb0028; + --ink: #111; + --muted: #5f6268; + --line: #dedede; + --soft: #f7f7f7; +} +* { box-sizing: border-box; } +body { margin: 0; font-family: Arial, Helvetica, sans-serif; color: var(--ink); background: #fff; } +a { color: inherit; text-decoration: none; } +img { display: block; width: 100%; object-fit: cover; } +button, .button { border: 0; background: #111; color: #fff; padding: 11px 16px; font-weight: 700; cursor: pointer; } +input, select { border: 1px solid var(--line); padding: 11px 12px; font: inherit; width: 100%; } + +.topbar { position: sticky; top: 0; z-index: 5; display: grid; grid-template-columns: auto auto minmax(240px, 1fr) auto; gap: 24px; align-items: center; padding: 0 28px; min-height: 64px; background: #fff; border-bottom: 1px solid var(--line); } +.brand { display: flex; align-items: baseline; gap: 12px; } +.brand span { color: var(--red); font-size: 34px; font-weight: 900; letter-spacing: 0; } +.brand small { color: var(--muted); font-size: 13px; white-space: nowrap; } +nav, .auth { display: flex; gap: 18px; align-items: center; font-size: 13px; font-weight: 700; text-transform: uppercase; } +.join { color: var(--red); } +.quick-search { display: flex; gap: 8px; } +.quick-search button { background: var(--red); } +.flashes { max-width: 1180px; margin: 16px auto 0; padding: 0 24px; } +.flash { padding: 12px 14px; background: #f0f4ff; border-left: 4px solid #3b63d1; } +.flash.error { background: #fff0f1; border-color: var(--red); } +.flash.success { background: #effaf2; border-color: #138a37; } + +main { min-height: 68vh; } +.hero { display: grid; grid-template-columns: minmax(280px, 0.9fr) minmax(340px, 1.1fr); gap: 48px; align-items: center; max-width: 1180px; margin: 0 auto; padding: 56px 24px 36px; } +.hero h1, .page-head h1 { margin: 0; font-size: clamp(42px, 7vw, 86px); line-height: 0.93; letter-spacing: 0; } +.hero p { max-width: 560px; color: var(--muted); font-size: 18px; line-height: 1.5; } +.eyebrow { margin: 0 0 12px; color: var(--red); font-size: 13px; font-weight: 800; text-transform: uppercase; } +.hero-actions { display: flex; gap: 12px; margin-top: 26px; } +.button { display: inline-flex; align-items: center; background: #111; } +.button.primary { background: var(--red); } +.lead-card { border-bottom: 4px solid var(--red); background: var(--soft); } +.lead-card img { aspect-ratio: 16 / 9; } +.lead-card span, .lead-card h2, .lead-card p { display: block; margin-left: 20px; margin-right: 20px; } +.lead-card span { margin-top: 18px; color: var(--red); font-size: 13px; font-weight: 800; text-transform: uppercase; } +.lead-card h2 { margin-top: 8px; margin-bottom: 10px; font-size: 28px; line-height: 1.05; } +.lead-card p { margin-bottom: 22px; color: var(--muted); } + +.band, .split, .page-head, .topic-grid, .detail-hero, .auth-page { max-width: 1180px; margin: 0 auto; padding: 36px 24px; } +.section-head { display: flex; justify-content: space-between; align-items: center; gap: 16px; margin-bottom: 18px; } +.section-head h2, article h2, aside h2, .panel h2 { margin: 0; font-size: 24px; } +.section-head a { color: var(--red); font-weight: 700; } +.grid { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 22px; } +.talk-card { border-top: 1px solid var(--line); background: #fff; } +.talk-card img { aspect-ratio: 16 / 9; background: #ddd; } +.card-body { padding: 14px 0; } +.meta { color: var(--red); font-size: 12px; font-weight: 800; text-transform: uppercase; } +.talk-card h3 { margin: 8px 0; font-size: 20px; line-height: 1.12; } +.talk-card p { margin: 0 0 10px; color: var(--muted); } +.chips { display: flex; flex-wrap: wrap; gap: 7px; } +.chips span, .chips a { display: inline-flex; padding: 6px 9px; background: var(--soft); color: #333; font-size: 12px; } + +.split { display: grid; grid-template-columns: 1fr 1fr; gap: 44px; } +.list { display: grid; gap: 8px; } +.row-link { display: grid; gap: 4px; padding: 14px 0; border-bottom: 1px solid var(--line); } +.row-link span { color: var(--muted); line-height: 1.35; } +.page-head { display: grid; gap: 14px; border-bottom: 1px solid var(--line); } +.page-head p { max-width: 720px; color: var(--muted); } +.filters { display: grid; grid-template-columns: minmax(220px, 1fr) 180px auto; gap: 12px; max-width: 720px; } + +.detail-hero { display: grid; grid-template-columns: minmax(360px, 1.08fr) minmax(300px, 0.92fr); gap: 38px; align-items: start; } +.detail-hero img { aspect-ratio: 16 / 9; } +.detail-hero h1 { margin: 0 0 10px; font-size: clamp(34px, 5vw, 64px); line-height: 0.98; } +.speaker { color: var(--muted); font-size: 20px; } +.stats { display: grid; grid-template-columns: repeat(3, 1fr); gap: 12px; margin: 24px 0; } +.stats div { border-top: 3px solid #111; padding-top: 8px; } +.stats dt { color: var(--muted); font-size: 12px; text-transform: uppercase; } +.stats dd { margin: 4px 0 0; font-weight: 800; } +.save-form { display: grid; grid-template-columns: 1fr auto; gap: 10px; } + +.topic-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 16px; } +.topic-grid a, .topic-grid article { display: grid; gap: 8px; min-height: 130px; padding: 20px; background: var(--soft); border-top: 3px solid var(--red); } +.topic-grid strong { font-size: 22px; } +.topic-grid span, .topic-grid p { color: var(--muted); margin: 0; } +.panel { display: grid; gap: 14px; padding: 24px; background: var(--soft); } +.panel label { display: grid; gap: 6px; font-weight: 700; } +.auth-page { display: grid; justify-content: center; } +.auth-page .panel { width: min(440px, calc(100vw - 48px)); } +.footer { margin-top: 36px; padding: 28px; display: flex; justify-content: space-between; gap: 28px; border-top: 1px solid var(--line); background: #111; color: #fff; } +.footer p { color: #c9c9c9; } +.topic-strip { display: flex; flex-wrap: wrap; gap: 10px; justify-content: flex-end; max-width: 620px; } +.topic-strip a { color: #fff; border: 1px solid #555; padding: 7px 9px; } + +@media (max-width: 900px) { + .topbar { grid-template-columns: 1fr; gap: 12px; padding: 14px 18px; } + nav, .auth { flex-wrap: wrap; } + .hero, .split, .detail-hero { grid-template-columns: 1fr; } + .grid, .topic-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } + .filters, .save-form { grid-template-columns: 1fr; } + .footer { display: grid; } +} +@media (max-width: 560px) { + .grid, .topic-grid, .stats { grid-template-columns: 1fr; } + .hero h1, .page-head h1 { font-size: 42px; } +} diff --git a/sites/ted/static/icons/.gitkeep b/sites/ted/static/icons/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/sites/ted/static/js/.gitkeep b/sites/ted/static/js/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/sites/ted/tasks.jsonl b/sites/ted/tasks.jsonl new file mode 100644 index 0000000..db4a5ac --- /dev/null +++ b/sites/ted/tasks.jsonl @@ -0,0 +1,18 @@ +{"web_name": "TED", "id": "TED--0", "ques": "Search for talks about AI and open the Anil Seth talk. What is the talk duration in minutes?", "web": "http://localhost:40015/", "upstream_url": "https://www.ted.com/"} +{"web_name": "TED", "id": "TED--1", "ques": "Find a TED2026 talk about driverless cars and save it to Alice Johnson's account with the note 'mobility planning'.", "web": "http://localhost:40015/", "upstream_url": "https://www.ted.com/"} +{"web_name": "TED", "id": "TED--2", "ques": "Browse the design topic and identify a talk from TEDNext 2025 that is shorter than 10 minutes.", "web": "http://localhost:40015/", "upstream_url": "https://www.ted.com/"} +{"web_name": "TED", "id": "TED--3", "ques": "Open the climate and nature playlist and name one talk recorded at the TED Countdown Summit 2025.", "web": "http://localhost:40015/", "upstream_url": "https://www.ted.com/"} +{"web_name": "TED", "id": "TED--4", "ques": "Log in as alice.j@test.com and change the newsletter topic to conservation.", "web": "http://localhost:40015/", "upstream_url": "https://www.ted.com/"} +{"web_name": "TED", "id": "TED--5", "ques": "Find the talk by Malala Yousafzai and list two topics attached to it.", "web": "http://localhost:40015/", "upstream_url": "https://www.ted.com/"} +{"web_name": "TED", "id": "TED--6", "ques": "Search for 'clean energy' and open the result by Kimiko Hirata. What event is it from?", "web": "http://localhost:40015/", "upstream_url": "https://www.ted.com/"} +{"web_name": "TED", "id": "TED--7", "ques": "Register interest in the TED Countdown Summit 2025 event while logged in as Alice Johnson.", "web": "http://localhost:40015/", "upstream_url": "https://www.ted.com/"} +{"web_name": "TED", "id": "TED--8", "ques": "Compare the talks by Alexi Pappas and Debbie Millman. Which one is shorter?", "web": "http://localhost:40015/", "upstream_url": "https://www.ted.com/"} +{"web_name": "TED", "id": "TED--9", "ques": "Find a talk about Parkinson's and save it to the current account with a note for public health review.", "web": "http://localhost:40015/", "upstream_url": "https://www.ted.com/"} +{"web_name": "TED", "id": "TED--10", "ques": "Open the AI, Society, and the Future playlist. Which included talk discusses a Supreme Court case?", "web": "http://localhost:40015/", "upstream_url": "https://www.ted.com/"} +{"web_name": "TED", "id": "TED--11", "ques": "Use filters to find TED2026 talks under 10 minutes and open the talk by Maya Higa.", "web": "http://localhost:40015/", "upstream_url": "https://www.ted.com/"} +{"web_name": "TED", "id": "TED--12", "ques": "Log in as alice.j@test.com and remove one saved talk that is not about AI from the account page.", "web": "http://localhost:40015/", "upstream_url": "https://www.ted.com/"} +{"web_name": "TED", "id": "TED--13", "ques": "Find the topic page for science and identify a TEDx talk about wine tasting.", "web": "http://localhost:40015/", "upstream_url": "https://www.ted.com/"} +{"web_name": "TED", "id": "TED--14", "ques": "Search for 'architecture 3D printing' and open the matching talk. Who is the speaker?", "web": "http://localhost:40015/", "upstream_url": "https://www.ted.com/"} +{"web_name": "TED", "id": "TED--15", "ques": "Find two talks in the music topic and determine which has more views.", "web": "http://localhost:40015/", "upstream_url": "https://www.ted.com/"} +{"web_name": "TED", "id": "TED--16", "ques": "Create a new account, save the Peter Steinberger AI agent talk, then confirm it appears under saved talks.", "web": "http://localhost:40015/", "upstream_url": "https://www.ted.com/"} +{"web_name": "TED", "id": "TED--17", "ques": "Open events and identify the city for the TEDNext 2025 event.", "web": "http://localhost:40015/", "upstream_url": "https://www.ted.com/"} diff --git a/sites/ted/templates/.gitkeep b/sites/ted/templates/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/sites/ted/templates/_talk_card.html b/sites/ted/templates/_talk_card.html new file mode 100644 index 0000000..50705bb --- /dev/null +++ b/sites/ted/templates/_talk_card.html @@ -0,0 +1,13 @@ + diff --git a/sites/ted/templates/account.html b/sites/ted/templates/account.html new file mode 100644 index 0000000..0ab7441 --- /dev/null +++ b/sites/ted/templates/account.html @@ -0,0 +1,38 @@ +{% extends "base.html" %} +{% block content %} +
+

Account

+

{{ user.display_name }}

+
+
+
+

Profile

+ + + + + +
+
+

Event registrations

+ {% for reg in registrations %} + + {% else %} +

No event registrations yet.

+ {% endfor %} +
+
+
+

Saved talks

+
+ {% for saved_item in saved %} + + {% else %} +

No saved talks yet.

+ {% endfor %} +
+
+{% endblock %} diff --git a/sites/ted/templates/base.html b/sites/ted/templates/base.html new file mode 100644 index 0000000..4b1e669 --- /dev/null +++ b/sites/ted/templates/base.html @@ -0,0 +1,57 @@ + + + + + + {% block title %}TED: Ideas change everything{% endblock %} + + + +
+ TEDIdeas change everything + + +
+ {% if current_user %} + {{ current_user.display_name }} + Log out + {% else %} + Log in + Join + {% endif %} +
+
+ + {% with messages = get_flashed_messages(with_categories=true) %} + {% if messages %} +
+ {% for category, message in messages %} +
{{ message }}
+ {% endfor %} +
+ {% endif %} + {% endwith %} + +
{% block content %}{% endblock %}
+ +
+
+ TED +

A local WebHarbor mirror for talks, topics, playlists, and event workflows.

+
+
+ {% for topic in nav_topics %} + {{ topic }} + {% endfor %} +
+
+ + diff --git a/sites/ted/templates/events.html b/sites/ted/templates/events.html new file mode 100644 index 0000000..f52cd9b --- /dev/null +++ b/sites/ted/templates/events.html @@ -0,0 +1,20 @@ +{% extends "base.html" %} +{% block content %} +
+

Attend

+

Events

+
+
+ {% for event in events %} +
+ {{ event.name }} + {{ event.city }} - {{ event.month }} - {{ event.track }} +

{{ event.capacity }} seats

+
+ + +
+
+ {% endfor %} +
+{% endblock %} diff --git a/sites/ted/templates/index.html b/sites/ted/templates/index.html new file mode 100644 index 0000000..2851769 --- /dev/null +++ b/sites/ted/templates/index.html @@ -0,0 +1,58 @@ +{% extends "base.html" %} +{% block content %} +
+
+

Newest from TED

+

Ideas change everything

+

Browse talks, save ideas to your account, compare speakers and topics, and register interest in TED events.

+ +
+ {% set lead = featured[0] %} + + + {{ lead.event }} +

{{ lead.title }}

+

{{ lead.speaker }}

+
+
+ +
+
+

Latest talks

+ See all +
+
+ {% for talk in featured %} + {% include "_talk_card.html" %} + {% endfor %} +
+
+ +
+ +
+

Curated playlists

+
+ {% for playlist in playlists %} + + {{ playlist.title }} + {{ playlist.description }} + + {% endfor %} +
+
+
+{% endblock %} diff --git a/sites/ted/templates/login.html b/sites/ted/templates/login.html new file mode 100644 index 0000000..151cafd --- /dev/null +++ b/sites/ted/templates/login.html @@ -0,0 +1,11 @@ +{% extends "base.html" %} +{% block content %} +
+
+

Log in

+ + + +
+
+{% endblock %} diff --git a/sites/ted/templates/playlist_detail.html b/sites/ted/templates/playlist_detail.html new file mode 100644 index 0000000..8f4cd2b --- /dev/null +++ b/sites/ted/templates/playlist_detail.html @@ -0,0 +1,16 @@ +{% extends "base.html" %} +{% block content %} +
+

Playlist

+

{{ playlist.title }}

+

{{ playlist.description }}

+
+
+
+ {% for link in links %} + {% set talk = link.talk %} + {% include "_talk_card.html" %} + {% endfor %} +
+
+{% endblock %} diff --git a/sites/ted/templates/playlists.html b/sites/ted/templates/playlists.html new file mode 100644 index 0000000..69ddf3b --- /dev/null +++ b/sites/ted/templates/playlists.html @@ -0,0 +1,12 @@ +{% extends "base.html" %} +{% block content %} +
+

Watch

+

Playlists

+
+
+ {% for playlist in playlists %} + {{ playlist.title }}{{ playlist.description }} + {% endfor %} +
+{% endblock %} diff --git a/sites/ted/templates/register.html b/sites/ted/templates/register.html new file mode 100644 index 0000000..60f1412 --- /dev/null +++ b/sites/ted/templates/register.html @@ -0,0 +1,13 @@ +{% extends "base.html" %} +{% block content %} +
+
+

Create account

+ + + + + +
+
+{% endblock %} diff --git a/sites/ted/templates/search.html b/sites/ted/templates/search.html new file mode 100644 index 0000000..f8b91a5 --- /dev/null +++ b/sites/ted/templates/search.html @@ -0,0 +1,17 @@ +{% extends "base.html" %} +{% block title %}Search TED{% endblock %} +{% block content %} +
+

Search

+

{% if q %}Results for "{{ q }}"{% else %}Search TED{% endif %}

+
+
+
+ {% for talk in talks %} + {% include "_talk_card.html" %} + {% else %} +

Try a query such as AI, climate, design, science, democracy, or health.

+ {% endfor %} +
+
+{% endblock %} diff --git a/sites/ted/templates/talk_detail.html b/sites/ted/templates/talk_detail.html new file mode 100644 index 0000000..223145a --- /dev/null +++ b/sites/ted/templates/talk_detail.html @@ -0,0 +1,42 @@ +{% extends "base.html" %} +{% block title %}{{ talk.title }} | TED{% endblock %} +{% block content %} +
+ +
+

{{ talk.event }} - {{ talk.talk_type }}

+

{{ talk.title }}

+

{{ talk.speaker }}

+

{{ talk.description }}

+
+
Duration
{{ talk.minutes }} minutes
+
Published
{{ talk.published_at|date_label }}
+
Views
{{ talk.views_label }}
+
+
+ + +
+
+
+
+
+

Transcript excerpt

+

{{ talk.transcript }}

+

Topics

+
+ {% for topic in talk.topics %}{{ topic }}{% endfor %} +
+
+ +
+{% endblock %} diff --git a/sites/ted/templates/talks.html b/sites/ted/templates/talks.html new file mode 100644 index 0000000..14e23a1 --- /dev/null +++ b/sites/ted/templates/talks.html @@ -0,0 +1,28 @@ +{% extends "base.html" %} +{% block title %}TED Talks{% endblock %} +{% block content %} +
+

Watch

+

{% if topic %}Talks about {{ topic }}{% else %}TED Talks{% endif %}

+
+ + + {% if topic %}{% endif %} + +
+
+
+
+ {% for talk in talks %} + {% include "_talk_card.html" %} + {% else %} +

No talks matched those filters.

+ {% endfor %} +
+
+{% endblock %} diff --git a/sites/ted/templates/topics.html b/sites/ted/templates/topics.html new file mode 100644 index 0000000..4e2ad25 --- /dev/null +++ b/sites/ted/templates/topics.html @@ -0,0 +1,12 @@ +{% extends "base.html" %} +{% block content %} +
+

Discover

+

Topics

+
+
+ {% for topic, count in counts %} + {{ topic }}{{ count }} talks + {% endfor %} +
+{% endblock %} diff --git a/websyn_start.sh b/websyn_start.sh index 72defad..b1e6939 100644 --- a/websyn_start.sh +++ b/websyn_start.sh @@ -1,11 +1,11 @@ #!/bin/bash -# WebSyn startup: launch all 12 mirror sites, then exec the original CMD. +# WebSyn startup: launch all mirror sites, then exec the original CMD. # This preserves the base image's browser env server (port 8100) as PID 1. set -e SITES=(allrecipes amazon apple arxiv bbc_news booking github google_flights google_map google_search huggingface wolfram_alpha - cambridge_dictionary coursera espn) + cambridge_dictionary coursera espn ted) BASE_PORT=40000 PID_DIR=/tmp/websyn_pids mkdir -p "$PID_DIR" @@ -17,7 +17,7 @@ for d in "${SITES[@]}"; do cp -a "/opt/WebSyn/$d/instance_seed" "/opt/WebSyn/$d/instance" done -echo "[WebSyn] Starting 15 sites on ports ${BASE_PORT}-$((BASE_PORT + 14))..." +echo "[WebSyn] Starting 16 sites on ports ${BASE_PORT}-$((BASE_PORT + 15))..." for i in "${!SITES[@]}"; do site="${SITES[$i]}" port=$((BASE_PORT + i)) @@ -51,8 +51,8 @@ except Exception: exit(1) ready=$((ready + 1)) fi done - echo " [${elapsed}/${max_wait}s] ${ready}/15 sites ready" - if [ $ready -eq 15 ]; then + echo " [${elapsed}/${max_wait}s] ${ready}/16 sites ready" + if [ $ready -eq 16 ]; then break fi done @@ -78,6 +78,6 @@ done echo "[WebSyn] Starting control server on :8101 (PID 1)..." # Control server becomes PID 1 — receives SIGTERM on `docker stop`, -# keeps the container alive as long as it's running. The 15 site +# keeps the container alive as long as it's running. The site # subprocesses are managed via /tmp/websyn_pids/.pid. exec python3 /opt/control_server.py --port 8101