Introduction

Real-time job progress tracking for AI applications.

Seenn is a job state transport service designed for AI applications that process tasks asynchronously. Instead of leaving users staring at a loading spinner, show them real-time progress, ETA, and results.

Choose Your SDK

Seenn provides two types of SDKs with different purposes:

Backend SDKs

Producer

Manage job lifecycle from your server — start, update progress, mark complete.

Client SDKs

Consumer

Subscribe to real-time updates in your mobile/web app — display progress, Live Activity.

How it Works

Your Backend
SDK
S
Seenn
SSE
Your App
  1. Backend starts a job — When a user triggers an async task (video generation, image processing, etc.)
  2. Backend reports progress — As processing continues, send progress updates to Seenn
  3. Client receives updates — Mobile app gets real-time SSE events with progress, message, ETA
  4. Job completes — Client receives the result URL or error message instantly

Quick Example

Here's a complete example showing backend and client working together:

1. Backend: Start and Update a Job

import { SeennClient } from '@seenn/node';

const seenn = new SeennClient({ apiKey: 'sk_live_...' });

// Start a job when user triggers video generation
const job = await seenn.jobs.start({
  userId: 'user_123',
  jobType: 'video-generation',
  title: 'Creating your video...',
});

// Update progress as processing continues
await job.setProgress(25, { message: 'Analyzing prompt...' });
await job.setProgress(50, { message: 'Generating frames...' });
await job.setProgress(75, { message: 'Rendering video...' });

// Complete with result URL
await job.complete({
  result: { url: 'https://cdn.example.com/video.mp4' }
});

2. Client: Subscribe to Updates

import 'package:seenn_flutter/seenn_flutter.dart';

// Initialize once at app startup
await Seenn.init(
  appId: 'app_xxx',
  userToken: 'token_from_your_backend',
);

// Subscribe to job updates
final tracker = Seenn.instance.jobs.subscribe('job_123');

tracker.onProgress.listen((update) {
  print('Progress: \${update.progress}%');
  print('Message: \${update.message}');
});

tracker.onComplete.listen((job) {
  print('Done! Result: \${job.resultUrl}');
});

Key Features

Real-time Updates

SSE-based streaming with automatic reconnection and missed event recovery.

iOS Live Activity

Show job progress on Dynamic Island and Lock Screen automatically.

Type-safe SDKs

Full TypeScript and Dart type definitions with IDE autocomplete.

Parent-Child Jobs

Track batch processing with automatic progress aggregation.

SDK Comparison

Feature Backend SDKs Client SDKs
Start jobs
Update progress
Mark complete/failed
Subscribe to updates
Real-time SSE
iOS Live Activity
Authentication Secret key (sk_*) User token (JWT)