Skip to main content

Overview

OWASP Nest provides a comprehensive event discovery platform for OWASP conferences, AppSec Days, partner events, and local chapter meetups worldwide.

Event Model

Events are standalone entities with rich metadata and geographic information:
backend/apps/owasp/models/event.py

Event Categories

Global

Major OWASP conferences (AppSec Global, etc.)

AppSec Days

Regional AppSec Days events

Partner

Partner organization events

Other

Chapter meetups and community events

Event Attributes

Core Fields

name: str                      # Event name
key: str                       # Unique slugified identifier
category: str                  # Event category
start_date: date              # Event start date
end_date: date | None         # Event end date (optional)
description: str              # Event description
summary: str                  # AI-generated summary
url: str                      # Event registration URL

Location Data

suggested_location: str       # AI-generated location string
latitude: float | None        # Geocoded latitude
longitude: float | None       # Geocoded longitude

Timestamps

created_at: datetime          # Record creation
updated_at: datetime          # Last update

Browsing Events

Upcoming Events

Get events happening in the future:
GET /api/v0/events?is_upcoming=true
curl "https://nest.owasp.org/api/v0/events?is_upcoming=true&ordering=start_date"
Find events by geographic bounds:
GET /api/v0/events?latitude_gte=40&latitude_lte=50&longitude_gte=-10&longitude_lte=10
Filter Parameters:
  • latitude_gte - Minimum latitude
  • latitude_lte - Maximum latitude
  • longitude_gte - Minimum longitude
  • longitude_lte - Maximum longitude
  • is_upcoming - Filter for future events only

Sorting Events

Available sort options:
  • start_date - Earliest first
  • -start_date - Latest first (default)
  • end_date - By end date
  • -end_date - By end date descending
  • latitude / -latitude - By location
  • longitude / -longitude - By location

Event API

List Events

GET /api/v0/events
Response:
{
  "items": [
    {
      "key": "owasp-global-appsec-usa-2025-washington-dc",
      "name": "OWASP Global AppSec USA 2025 - Washington DC",
      "start_date": "2025-09-15",
      "end_date": "2025-09-19",
      "latitude": 38.9072,
      "longitude": -77.0369,
      "url": "https://owasp.org/events/2025-09-usa/"
    }
  ],
  "count": 42,
  "next": "https://nest.owasp.org/api/v0/events?page=2"
}

Get Event Details

GET /api/v0/events/{event_key}
Example:
curl "https://nest.owasp.org/api/v0/events/owasp-global-appsec-usa-2025-washington-dc"
Response:
{
  "key": "owasp-global-appsec-usa-2025-washington-dc",
  "name": "OWASP Global AppSec USA 2025 - Washington DC",
  "description": "Join us for the premier application security conference...",
  "start_date": "2025-09-15",
  "end_date": "2025-09-19",
  "latitude": 38.9072,
  "longitude": -77.0369,
  "url": "https://owasp.org/events/2025-09-usa/"
}

Date Parsing

Nest includes sophisticated date parsing for various formats:

Supported Formats

# backend/apps/owasp/models/event.py:111
@staticmethod
def parse_dates(dates: str, start_date: date) -> date | None:
Examples:
  • ISO format: 2025-05-26
  • Date ranges: May 15-17, 2025
  • Day ranges: 15-17 (infers month from start_date)
  • Year crossover: December 28 - January 2
The parser normalizes various dash characters (hyphen, en-dash, em-dash) and handles year crossover for multi-day events.

Geocoding

Events use AI-powered geocoding similar to chapters:

Location Generation

# backend/apps/owasp/models/event.py:220
def generate_geo_location(self) -> None:
    """Add latitude and longitude data."""
    location = None
    if self.suggested_location and self.suggested_location != "None":
        location = get_location_coordinates(self.suggested_location)
    if location is None:
        location = get_location_coordinates(self.get_context())
    if location:
        self.latitude = location.latitude
        self.longitude = location.longitude

Context Building

Event context for AI includes:
def get_context(self, *, include_dates: bool = False) -> str:
    context = [
        f"Name: {self.name}",
        f"Description: {self.description}",
        f"Summary: {self.summary}",
    ]
    if include_dates:
        context.append(f"Dates: {self.start_date} - {self.end_date}")
    return "\n".join(context)

AI-Generated Summaries

Events can generate AI summaries from their metadata:
# backend/apps/owasp/models/event.py:259
def generate_summary(self, prompt=None) -> None:
    """Generate a summary for the event."""
    open_ai = OpenAi()
    open_ai.set_input(self.get_context(include_dates=True))
    open_ai.set_max_tokens(100).set_prompt(
        prompt or Prompt.get_owasp_event_summary()
    )
    summary = open_ai.complete()
    self.summary = summary if summary != "None" else ""

Upcoming Events Query

Get only future events with valid data:
# backend/apps/owasp/models/event.py:72
@staticmethod
def upcoming_events():
    """Get upcoming events."""
    return (
        Event.objects
        .filter(start_date__gt=timezone.now())
        .exclude(Q(name__exact="") | Q(url__exact=""))
        .order_by("start_date")
    )
Upcoming events are filtered to exclude entries with missing names or URLs, ensuring high-quality results.

Slack Integration

Query upcoming events via Slack:
/events
Features:
  • Shows upcoming events sorted by start date
  • Displays event name, dates, location, description
  • Includes registration URL links
  • Links to full events page
# backend/apps/slack/commands/events.py:7
def get_events_data():
    """Get events data for the template."""
    from apps.owasp.models.event import Event
    
    return [
        {
            "description": event.description,
            "end_date": event.end_date,
            "location": event.suggested_location,
            "name": event.name,
            "start_date": event.start_date,
            "url": event.url,
        }
        for event in sorted(Event.upcoming_events(), key=lambda e: e.start_date)
    ]

Event Categories

Events are categorized for easy filtering:
class Category(models.TextChoices):
    APPSEC_DAYS = "appsec_days", "AppSec Days"
    GLOBAL = "global", "Global"
    OTHER = "other", "Other"
    PARTNER = "partner", "Partner"

Database Indexes

Optimized for date-based queries:
indexes = [
    models.Index(fields=["-start_date"], name="event_start_date_desc_idx"),
    models.Index(fields=["-end_date"], name="event_end_date_desc_idx"),
]

Event Data Sources

Events are imported from:
  • OWASP Foundation event pages
  • Chapter meetup calendars
  • Partner organization feeds
  • Manual submissions

Code Reference

Key implementation files:
  • Model: backend/apps/owasp/models/event.py:28
  • API: backend/apps/api/rest/v0/event.py:16
  • Slack Command: backend/apps/slack/commands/events.py:25
  • Date Parser: backend/apps/owasp/models/event.py:111

AI Integration

Events are indexed for AI-powered discovery:
backend/apps/ai/common/extractors/event.py
Extracted Content:
  • Event name and description
  • Location information
  • Date ranges
  • Event category
  • Registration URLs

Calendar Integration

Coming Soon

Calendar export features (iCal, Google Calendar) are planned for future releases.
  • Chapters - Find chapters hosting events
  • Search - Location-based event search
  • Slack Bot - Query events via /events

Build docs developers (and LLMs) love