titles, weights = zip(*titles)
     title = random.choices(titles, weights)[0]
 
+    rows = db.query(
+            """
+            SELECT * FROM jams
+            INNER JOIN users ON jams.ownerid = users.userid
+            """)
+    all_jams = [jams.Jam.from_row(r) for r in rows]
+    all_events = []
+    for j in all_jams:
+        all_events.extend(j.events)
+    ongoing_events, upcoming_events, _, _ = jams._sort_events(all_events)
+
     page_songs = songs.get_latest(50)
-    return render_template("index.html", users=all_users, songs=page_songs, page_title=title)
+    return render_template(
+            "index.html",
+            users=all_users,
+            songs=page_songs,
+            page_title=title,
+            ongoing_events=ongoing_events,
+            upcoming_events=upcoming_events)
 
 @app.get("/site-news")
 def site_news():
 
                     INNER JOIN users ON jams.ownerid = users.userid
                     WHERE jam_events.threadid = ?
                     """, [comment["threadid"]], one=True)
+            # TODO: This is duplicated in the JamEvent class
+            startdate = datetime.fromisoformat(jam_event["startdate"]) if jam_event["startdate"] else None
+            hidden = ((startdate is None) or startdate > datetime.now(timezone.utc))
             comment["eventid"] = jam_event["eventid"]
             comment["jamid"] = jam_event["jamid"]
-            comment["title"] = jam_event["title"]
+            comment["title"] = "[Upcoming Event]" if hidden else jam_event["title"]
             comment["content_userid"] = jam_event["userid"]
             comment["content_username"] = jam_event["username"]
 
 
 
 from flask import abort, Blueprint, g, redirect, render_template, request, url_for
 
-from . import auth, comments, db, songs
+from . import auth, comments, db, jams, songs
 from .sanitize import sanitize_user_text
 
 bp = Blueprint("jams", __name__, url_prefix="/jams")
 
 ðŸŽ¶ Welcome to a little song place.  Make music, and share it with friends! ðŸŽµ
 </p>
 
+{% if ongoing_events or upcoming_events %}
+<h2>Jams</h2>
+{% from "jam-event-list.html" import jam_event_list %}
+{{ jam_event_list("Ongoing Events", ongoing_events, "Ends", "end") }}
+{{ jam_event_list("Upcoming Events", upcoming_events, "Starts", "start") }}
+{% endif %}
+
 <h2>Humans</h2>
 <p>
 Check out the music and profiles of the fine folks below!
 
     {% for event in events %}
     <li class="jam-event-list-entry">
         {% if event.hidden -%}
-        <span class="visibility-indicator">[Upcoming Event]</span>
+        <span class="visibility-indicator">
+            <a href="/jams/{{ event.jamid }}/events/{{ event.eventid }}">[Upcoming Event]</a>
+        </span>
         {%- else -%}
         <span class="jam-event-list-title">
             <a href="/jams/{{ event.jamid }}/events/{{ event.eventid }}">{{ event.title }}</a>
 
     </div>
     <br/>
     <div>
-    {{ jam.description }}
+    {{ (jam.description.replace("\n", "<br>"))|safe }}
     </div>
 
     {% if not event.hidden -%}
 
 
     <h2>Description</h2>
     <div>
-    {{ jam.description|safe }}
+    {{ (jam.description.replace("\n", "<br>"))|safe }}
     </div>
 
     <h2>Events</h2>
 
 
     client.post("/login", data={"username": "user", "password": "password"})
     response = client.get("/activity")
-    assert b"New Event" in response.data, response.data.decode()
+    assert b"[Upcoming Event]" in response.data, response.data.decode()
     assert b"hey cool event" in response.data, response.data.decode()
 
 def test_activity_for_reply_to_comment(client):