Skip to main content
The Bulletin Board system sends curated content digests to followers, keeping them updated on new stories from profiles they follow.

Overview

Bulletin Board automates content distribution:
  • Followers subscribe to profiles they’re interested in
  • System compiles new stories from followed profiles
  • Digests delivered on schedule (daily, bi-daily, weekly)
  • Multiple delivery channels (Email, Telegram)
  • Personalized content based on follows
Subscriptions are per-profile, per-channel. A user can have different digest frequencies for different profiles.

Subscription System

Creating a Subscription

1

Follow a profile

User follows a profile they want updates from
2

Choose delivery channel

Select Email or Telegram (or both)
3

Set frequency

  • Daily: Digest sent every day
  • Bi-daily: Digest sent every two days
  • Weekly: Digest sent once per week
4

Configure preferences

  • Preferred Time: UTC hour for delivery (0-23)
  • Default Locale: Language for digest content
5

Subscribe

Subscription activated, next digest scheduled

Subscription Properties

{
  "id": "subscription-ulid",
  "profile_id": "profile-ulid",
  "profile_slug": "acme-corp",
  "channel": "telegram",
  "frequency": "weekly",
  "default_locale": "en",
  "preferred_time": 9,
  "last_bulletin_at": "2025-03-01T09:00:00Z",
  "created_at": "2025-01-15T14:30:00Z"
}

Delivery Channels

Email

Delivered to user’s verified email address

Telegram

Sent via Aya Bot to linked Telegram account

Email Delivery

Requirements:
  • User must have verified email
  • Email delivery service configured
Email Format:
  • HTML with responsive design
  • Grouped by followed profile
  • Story summaries with read-more links
  • Unsubscribe link in footer
  • Profile branding (logos, colors)
Email digests are optimized for mobile and desktop reading with clean, scannable layouts.

Telegram Delivery

Requirements:
  • User must have linked Telegram account (see Telegram Bot)
  • Aya Bot must be able to message user
Telegram Format:
  • Markdown-formatted messages
  • Grouped by profile
  • Story titles with direct links
  • Inline navigation buttons
  • Author information
Telegram digests use Telegram’s native formatting for optimal mobile experience.

Digest Frequency

Daily Digests

  • Sent every day at preferred time
  • Includes stories from past 24 hours
  • Best for high-volume profiles
  • May be empty if no new content

Bi-Daily Digests

  • Sent every two days at preferred time
  • Includes stories from past 48 hours
  • Balanced frequency for moderate activity
  • Reduces notification fatigue

Weekly Digests

  • Sent once per week at preferred time
  • Includes stories from past 7 days
  • Best for low-volume profiles
  • Comprehensive weekly roundup
Users can have different frequencies for different profiles - daily for their favorite communities, weekly for less active ones.

Digest Content Structure

Digest Groups

Digests are organized by followed profile:
┌──────────────────────────────────┐
│ Your Weekly Digest          │
│ March 1, 2025                │
└──────────────────────────────────┘

[Profile Logo] Acme Corp
  • Product Launch - March 15
    "Announcing our revolutionary..." 
    Published by Jane Doe
    
  • Q4 2024 Results
    "Record growth in all sectors..."
    Published by John Smith

[Profile Logo] Tech Community
  • Monthly Meetup - March 10
    "Join us for talks on AI..."
    Published by Community Team

Story Information

Each story in digest includes:
  • Story title (linked to full story)
  • Story kind (article, news, event, etc.)
  • Summary or AI-generated summary
  • Author profile info
  • Publication date
  • Story picture (if available)
  • Read time estimate
Stories use AI-generated summaries (summary_ai) if manual summary is missing.

Digest Generation

Digests are generated in batch:
1

Scheduler identifies due subscriptions

System finds subscriptions due for delivery based on frequency and last sent time
2

Query new stories

For each subscription:
  • Find followed profiles (via membership)
  • Get published stories since last bulletin
  • Filter by publication status and visibility
3

Group by profile

Stories grouped by publishing profile for organized digest
4

Apply locale fallback

Use 3-tier fallback for story content:
  1. Subscriber’s preferred locale
  2. Profile’s default locale
  3. Any available translation
5

Compile digest

Generate digest object with all groups and stories
6

Deliver via channel

Send via email or Telegram based on subscription
7

Log delivery

Record bulletin log with status and story count

Empty Digests

Empty digests are NOT sent. Users only receive bulletins when there’s new content.
Digest is skipped if:
  • No new published stories since last bulletin
  • All stories are private (user lacks access)
  • Followed profiles have no publications

Bulletin Logs

Each delivery is logged:
{
  "id": "log-ulid",
  "subscription_id": "subscription-ulid",
  "status": "sent",
  "story_count": 5,
  "error_message": null,
  "created_at": "2025-03-01T09:00:00Z"
}
Log Statuses:
  • sent: Successfully delivered
  • failed: Delivery failed (see error_message)
Failure Reasons:
  • Email: Bounced, invalid address, rate limited
  • Telegram: Bot blocked by user, user deleted account
Failed deliveries pause the subscription after 3 consecutive failures to avoid spam.

Managing Subscriptions

View Subscriptions

Users can view all their subscriptions:
  • Grouped by channel (Email, Telegram)
  • Sorted by profile
  • Shows frequency and last delivery
  • Next scheduled delivery time

Update Subscription

1

Select subscription

Choose subscription to modify
2

Change settings

  • Update frequency
  • Change preferred time
  • Modify locale
3

Save changes

Next digest scheduled with new settings

Unsubscribe

Methods:
  • Click unsubscribe in digest footer
  • Remove subscription from settings page
  • Unfollow profile (removes all related subscriptions)
Unsubscribing from one channel (Email) doesn’t affect other channels (Telegram). Users can maintain separate preferences.

Preferred Delivery Time

Users set preferred UTC hour (0-23): Examples:
  • 9 = 09:00 UTC (morning in Europe)
  • 14 = 14:00 UTC (morning in US East Coast)
  • 22 = 22:00 UTC (evening in US, morning in Asia)
Recommend users set delivery time for their morning reading routine.

Multi-Locale Support

Digests respect locale preferences:
1

User sets default locale

Subscription configured with preferred language
2

Stories fetched with locale

System retrieves stories using 3-tier fallback
3

Digest UI localized

Headers, labels, and text in subscriber’s language
Supported Languages: ar, de, en, es, fr, it, ja, ko, nl, pt-PT, ru, tr, zh-CN

Profile Perspective

Profile owners can see:
  • Number of bulletin subscribers
  • Breakdown by channel (Email vs Telegram)
  • Subscriber growth over time
  • Most subscribed frequency
Individual subscriber information is private. Profile owners see aggregated statistics only.

Best Practices

  • Publish stories at consistent times
  • Write compelling summaries (they appear in digests)
  • Use story pictures for visual appeal
  • Consider subscriber time zones when publishing
  • Enable AI summarization for automatic summaries
  • Promote subscription on your profile
  • Choose frequency based on profile activity
  • Set delivery time for your reading routine
  • Use different channels for different needs
  • Unsubscribe from inactive profiles
  • Update locale if language preferences change
  • Check spam folder if emails missing
  • Encourage members to subscribe
  • Maintain regular publishing schedule
  • Feature bulletin subscription in onboarding
  • Use consistent story kinds for filtering
  • Monitor delivery success rates
  • Provide value in every digest

Delivery Timing

Digests are sent in batch jobs: Process:
  1. Cron job runs hourly
  2. Identifies subscriptions due at current hour
  3. Generates and sends digests
  4. Updates last_bulletin_at timestamp
  5. Schedules next delivery based on frequency
Actual delivery may occur 0-59 minutes after preferred hour depending on batch processing time.

Spam Prevention

Rate Limiting

Maximum 1 digest per frequency period

Empty Skip

No digest sent if no new content

Failure Pausing

Pause after 3 failed deliveries

Easy Unsubscribe

One-click unsubscribe in every digest

Troubleshooting

  1. Check spam/junk folder
  2. Verify email address is correct and verified
  3. Check subscription is active (not paused)
  4. Review bulletin logs for delivery errors
  5. Ensure followed profiles have published new stories
  1. Verify Telegram account is linked
  2. Check you haven’t blocked Aya Bot
  3. Start conversation with bot if first time
  4. Review subscription status
  5. Check bulletin logs
  • Adjust frequency (daily/bi-daily/weekly)
  • Follow/unfollow profiles as needed
  • Check profile activity level
  • Consider different channels for different profiles
  • Update subscription locale setting
  • Check profile has translations in your language
  • System falls back to profile default if no translation

Configuration

Server Configuration:
# Email delivery
BULLETIN__EMAIL_FROM=[email protected]
BULLETIN__EMAIL_PROVIDER=sendgrid  # or ses, smtp
BULLETIN__EMAIL_API_KEY=...

# Telegram delivery
BULLETIN__TELEGRAM_BOT_TOKEN=...

# Scheduling
BULLETIN__BATCH_SIZE=100  # Digests per batch
BULLETIN__MAX_FAILURES=3  # Auto-pause threshold

Next Steps

Stories

Create content for digests

Telegram Bot

Link Telegram for digest delivery

Profiles

Build your following

AI Integrations

Enable AI summarization for digests

Build docs developers (and LLMs) love