Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions content/docs/products/fractal/meta.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
"environments",
"pr-previews",
"custom-domains",
"object-storage",
"backups",
"shell",
"cli-reference",
Expand Down
100 changes: 100 additions & 0 deletions content/docs/products/fractal/object-storage.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
---
title: Object Storage
description: S3-compatible buckets for uploads, assets, and media, with optional public URLs
---

Fractal gives every project **S3-compatible object storage**: durable buckets for
user uploads, exports, generated files, and media. Buckets are provisioned from
the dashboard, work with any standard S3 client, and can be **private** (the
default) or **public** with a ready-to-use media URL.

## Create a bucket

1. Open your project and go to the **Storage** tab.
2. Click **New bucket** and give it a name.
3. Choose **Private** or **Public** (see below), then create it.

Bucket names are a single DNS label: 3 to 63 characters, lowercase letters,
digits, and hyphens, with no leading or trailing hyphen (for example
`app-uploads` or `user-avatars`). The bucket is ready within a few seconds.

## Private vs public buckets

- **Private** (default): objects are reachable only with the bucket's
credentials. Serve files to users by generating presigned URLs from your app,
or by proxying them through your backend. Use this for anything sensitive.
- **Public**: objects are readable by anyone at a stable URL, with no
credentials. A public bucket is served at `https://<bucket>.media.omni.dev`, so
an object stored at `avatars/jane.png` in the `user-avatars` bucket is served
at `https://user-avatars.media.omni.dev/avatars/jane.png`. Use this for
avatars, images, video, and other assets you want browsers to load directly.

Writes always require the bucket's credentials, whether the bucket is public or
private. Public only affects read access.

You can switch a bucket between private and public later, and its public URL
starts or stops serving accordingly.

## Connect a bucket to your app

Attach a bucket to a service and Fractal injects its credentials into the
service as environment variables, so no secrets are ever written into your repo
or image. A service receives:

- an **endpoint** (the S3 API URL to point your client at),
- the **bucket** name,
- an **access key ID** and **secret access key**,
- a **region**.

Point any standard S3 client (the AWS SDK, `aws s3`, `rclone`, and so on) at the
endpoint with those credentials and the bucket behaves like any other S3 bucket.
A minimal upload with the AWS SDK for JavaScript:

```ts
import { S3Client, PutObjectCommand } from "@aws-sdk/client-s3";

const s3 = new S3Client({
endpoint: process.env.S3_ENDPOINT,
region: process.env.S3_REGION,
credentials: {
accessKeyId: process.env.S3_ACCESS_KEY_ID,
secretAccessKey: process.env.S3_SECRET_ACCESS_KEY,
},
forcePathStyle: true,
});

await s3.send(
new PutObjectCommand({
Bucket: process.env.S3_BUCKET,
Key: "avatars/jane.png",
Body: file,
ContentType: "image/png",
}),
);
```

Set `forcePathStyle: true` (path-style addressing); the platform serves buckets
by path (`/bucket/key`) rather than by virtual host.

## Serving public media

For a public bucket, the object's public URL is simply its key appended to the
bucket's media host:

```
https://<bucket>.media.omni.dev/<key>
```

Public objects are served over HTTPS with a valid certificate and hardened
response headers (a restrictive content-security-policy plus `nosniff`, so a
stored file cannot execute as script), and permissive CORS for `GET`/`HEAD` so
browsers and canvases can load them. There is nothing else to configure: upload
with your credentials, then link to the public URL.

## Limits

Each plan includes an object-storage allowance: a maximum number of buckets per
project and a total-bytes ceiling across them. Storage above the included
allowance is billed per gigabyte-month (see [Billing](./billing)). Buckets are
deleted from the **Storage** tab; deleting a bucket removes its objects
permanently.
1 change: 0 additions & 1 deletion content/docs/products/herald/deliverability.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -38,4 +38,3 @@ For each sending domain, Herald surfaces recommendations in the dashboard: verif
## Delivery events

Every message's lifecycle (delivered, bounced, complained, opened, clicked) is tracked in the message log and streamed out as CloudEvents. Watching bounce and complaint events is the fastest way to catch a deliverability issue as it develops. See [Transactional Email](/products/herald/transactional-email) for webhook setup.
</content>
1 change: 0 additions & 1 deletion content/docs/products/herald/getting-started.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -71,4 +71,3 @@ Herald runs suppression checks and DKIM signing before the message goes out. Onc
- [Transactional Email](/products/herald/transactional-email): batch sends, listing and inspecting messages, and webhooks
- [Marketing Email](/products/herald/marketing-email): audiences and broadcasts
- [Deliverability](/products/herald/deliverability): dedicated IPs, suppression, and reputation isolation
</content>
2 changes: 0 additions & 2 deletions content/docs/products/herald/index.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -72,5 +72,3 @@ Herald is made up of two parts:

- The **API** is what your application sends through: a tenant-scoped GraphQL endpoint that accepts messages, signs and suppresses them, and records every delivery event.
- The **dashboard** is where your team works: manage sending domains and their deliverability recommendations, browse the message log and delivery events, manage suppressions and API keys, and see sending health at a glance.
</content>
</invoke>
1 change: 0 additions & 1 deletion content/docs/products/herald/marketing-email.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -40,4 +40,3 @@ Every broadcast carries the pieces that keep marketing mail compliant:
- **CAN-SPAM compliant footers** included automatically.

Unsubscribes and complaints feed Herald's suppression list, so a contact who opts out or reports a message is not sent to again. See [Deliverability](/products/herald/deliverability) for how suppression protects your sending reputation.
</content>
1 change: 0 additions & 1 deletion content/docs/products/herald/transactional-email.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -71,4 +71,3 @@ Every SDK method is a typed wrapper over the generated GraphQL client. For any o
```ts
herald.raw.sendEmail({ input: { /* ... */ } });
```
</content>
43 changes: 0 additions & 43 deletions content/docs/products/thrivestream.mdx

This file was deleted.

4 changes: 4 additions & 0 deletions content/docs/products/thrivestream/.mirror.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"repo": "git@github.com:coopbri/thrivestream-docs.git",
"ref": "3a79734ef0fddc2054626b4b9c73e328e89b7cad"
}
27 changes: 27 additions & 0 deletions content/docs/products/thrivestream/chat.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
---
title: Live Chat
description: Real-time chat alongside every Thrivestream broadcast.
canonical: "https://docs.thrivestream.live/chat"
mirroredFrom: "git@github.com:coopbri/thrivestream-docs.git@3a79734ef0fddc2054626b4b9c73e328e89b7cad"
sourceUrl: "https://github.com/coopbri/thrivestream-docs/blob/3a79734ef0fddc2054626b4b9c73e328e89b7cad/content/docs/chat.mdx"
---

Live chat brings a real-time conversation to every stream, between the broadcaster and viewers, updating instantly for everyone watching.

## Sending Messages

Type in the chat box and send. Your message appears immediately for everyone in the stream, labeled with your handle.

## Rate Limits

To keep chat readable, sending is rate limited: a short burst is fine, but rapid-fire messages are throttled. If you are posting too quickly, wait a moment and try again.

## Moderation

On your own stream, each chat message shows a **Remove from chat** button (only you, the broadcaster, can see it). Selecting it removes that person from your chat: their existing messages stay, but they can no longer post for the rest of the broadcast. Keep it respectful: harassment and spam are not welcome.

<Callout type="info">
Live chat is tied to a live stream: once the broadcast ends, no new messages
can be sent. If the stream was recorded, the conversation lives on as [chat
replay](/products/thrivestream/videos#chat-replay) on the video, synced to playback.
</Callout>
29 changes: 29 additions & 0 deletions content/docs/products/thrivestream/following.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
---
title: Following
description: Follow creators and reach followers-only streams on Thrivestream.
canonical: "https://docs.thrivestream.live/following"
mirroredFrom: "git@github.com:coopbri/thrivestream-docs.git@3a79734ef0fddc2054626b4b9c73e328e89b7cad"
sourceUrl: "https://github.com/coopbri/thrivestream-docs/blob/3a79734ef0fddc2054626b4b9c73e328e89b7cad/content/docs/following.mdx"
---

Following a creator is how you keep up with the people you want to watch, and how creators build an audience they can broadcast to directly.

## Follow a Creator

Open a creator's channel at `/@their-handle` (for example from a stream's byline) and select **Follow**. The button switches to **Following**, and the creator's follower count updates right away. Select it again to unfollow.

You can't follow yourself, and the Follow button doesn't appear on your own channel.

## Follower Count

Every channel shows how many people follow that creator. It updates as people follow and unfollow.

## Followers-Only Streams

Creators can limit a broadcast to their followers by choosing **Followers only** when they [go live](/products/thrivestream/going-live#who-can-watch). If you open a followers-only stream you don't follow yet, you'll see a **Follow to watch** prompt: follow the creator and playback begins. See [Watching](/products/thrivestream/watching#followers-only-streams) for what this looks like as a viewer.

<Callout type="info">
Following is separate from the **Follow on Threads** link on a channel. That
link points to the creator's [Threads](/products/thrivestream/threads) profile; following on
Thrivestream is what unlocks their followers-only streams.
</Callout>
34 changes: 34 additions & 0 deletions content/docs/products/thrivestream/getting-started.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
---
title: Getting Started
description: Sign in and find your way around Thrivestream.
canonical: "https://docs.thrivestream.live/getting-started"
mirroredFrom: "git@github.com:coopbri/thrivestream-docs.git@3a79734ef0fddc2054626b4b9c73e328e89b7cad"
sourceUrl: "https://github.com/coopbri/thrivestream-docs/blob/3a79734ef0fddc2054626b4b9c73e328e89b7cad/content/docs/getting-started.mdx"
---

## Sign In

Thrivestream uses an Omni account to sign in.

1. Open [thrivestream.live](https://thrivestream.live)
2. Select **Continue with Omni**
3. Sign in to Omni, or create an account if you do not have one
4. You land on the live feed, signed in

If you used Thrivestream before sign-in moved to Omni, your account is still there. If you are still signed in on a device, connect your Omni account from [Settings](/products/thrivestream/settings) and **Continue with Omni** will sign you in from then on. If you are locked out, reach out and we will connect it for you. See [Omni Account](/products/thrivestream/omni-account).

<Callout type="info">
Thrivestream is in private testing, so sign-in is limited to people who have
been invited. If you cannot get in, you have not been added yet.
</Callout>

## The Live Feed

The home page is the **live feed**: every stream that is on the air right now. Select a stream to start watching, or head to the studio to go live yourself.

## Next Steps

- Connect your Omni account for sign-in: see [Omni Account](/products/thrivestream/omni-account)
- Ready to broadcast? See [Going Live](/products/thrivestream/going-live)
- Want to watch first? See [Watching](/products/thrivestream/watching)
- Curious how Threads ties in? See [Threads Integration](/products/thrivestream/threads)
94 changes: 94 additions & 0 deletions content/docs/products/thrivestream/going-live.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
---
title: Going Live
description: Start a broadcast from the Thrivestream web studio.
canonical: "https://docs.thrivestream.live/going-live"
mirroredFrom: "git@github.com:coopbri/thrivestream-docs.git@3a79734ef0fddc2054626b4b9c73e328e89b7cad"
sourceUrl: "https://github.com/coopbri/thrivestream-docs/blob/3a79734ef0fddc2054626b4b9c73e328e89b7cad/content/docs/going-live.mdx"
---

You broadcast from the **studio**, a web page that runs entirely in your browser. There is nothing to download.

## Start a Stream

1. From the live feed, select **Go Live**
2. Give your stream a title (and an optional description)
3. Choose your [orientation](#orientation), Landscape or Portrait
4. Under **Who can watch**, choose your stream's audience (see [below](#who-can-watch))
5. Select **Go live** to open your studio, then select **Enter studio**
6. Grant your browser access to your camera and microphone when prompted
7. You land in a private [preview](#preview-your-control-room). Get your shot right, then select **Go Live** to go on the air

A short **countdown** plays once you commit, then you go live. Nothing is public until the countdown finishes: your stream stays off the feed and no Threads announcement goes out until you are actually on the air.

Your stream now appears in the live feed, and viewers can join.

<Callout type="info">
Want a copy afterward? Toggle **Record this stream** before you go live and
Thrivestream saves it as a [video](/products/thrivestream/videos) you can share and download.
</Callout>

## Orientation

Choose how your video is framed before you go live:

- **Landscape** (16:9) is widescreen, best for desktop, gaming, and webinars
- **Portrait** (9:16) is vertical, best for phones and mobile-first viewers

Thrivestream starts on a default that suits your device (Portrait on phones, Landscape on larger screens), and you can change it in the go-live form or on the studio's ready screen. You set orientation before you go live, so it can't change once you are on the air, and any recording keeps the same shape.

## Who Can Watch

Every stream has a visibility that you pick when you create it. It controls who
can find and join your broadcast:

- **Public**: anyone can find your stream in the live feed and watch it. This is the default.
- **Ghost (Unlisted)**: your stream goes invisible in the feed and is reachable only by its direct link (that's the ghost). Handy for sharing a broadcast with a specific group.
- **Followers only**: only people who [follow you](/products/thrivestream/following) can watch. Anyone else who opens the link sees a prompt to follow first.

Ghost and followers-only streams never appear in the public feed. You can share their link the same way as any other stream.

## Preview (Your Control Room)

Before anything goes public, the studio drops you into a private **preview**. It looks just like the live studio, with a clear **Preview** badge, and only you can see it:

- Watch your real self-view, exactly as viewers will once you go live
- Set your framing: [switch cameras](#camera), zoom, and check your mic level
- Toggle your camera or share your screen (on desktop) to rehearse your setup

Nothing is broadcast here. Your stream stays off the feed and no Threads announcement fires until you commit. When you are ready, select **Go Live** to start the countdown, or **Back to setup** to step back out and adjust your details. Because you go live from a warm preview, your camera is already connected, so you go on the air without a cold start.

## In the Studio

While you are live, the studio shows:

- **Your preview**, exactly what viewers see
- **Controls** to mute your microphone, toggle your camera, share your screen (on desktop), and end the stream
- A **share button** to copy your stream link (or open the share sheet on mobile) so you can invite people in
- A **Guests** button to bring people on stage with you (see [Streaming with Guests](/products/thrivestream/guests))

[Live chat](/products/thrivestream/chat) runs right in the studio, so you can talk with your viewers and moderate the conversation while you broadcast.

## Camera

- **Switch cameras**: on a phone with more than one camera, a switch-camera button flips between the front and rear lens, both before you go live and mid-broadcast. On the ready screen you can also pick which camera you start on
- **Zoom**: pinch on your video (or use the on-screen zoom buttons) to zoom the camera in and out
- **Toggle**: turn your camera off and back on at any time from the studio controls

Camera controls appear only where they apply: the switch button is hidden when your device has a single camera, and zoom shows where your camera or device supports it.

## End a Stream

Select **End Stream** in the studio. The broadcast stops immediately and the stream leaves the live feed.

<Callout type="info">
You don't have to end perfectly: if you close or reload the studio while live,
your browser warns you first, and your stream keeps running for a short time so
you can return and pick up where you left off. If you don't come back, it ends
automatically.
</Callout>

## Tips for a Good Broadcast

- Use a wired connection when you can; WebRTC is sensitive to unstable upload bandwidth
- Find a quiet, well-lit spot
- Share your stream link and let your Threads audience know you are live
Loading
Loading