Skip to main content
From first setup to playback

Connect, upload, and play.

Connect storage, upload a video, then copy its link and send it.

Getting started

Follow these three steps

1

1. Connect your video storage

Connect Cloudflare R2.

Storage holds your video files. Choose automatic setup if this is your first connection.

  1. 1.Choose Connect storage.
  2. 2.Choose Cloudflare R2 automatic setup.
  3. 3.Follow the on-screen steps to paste a token and choose your domain.
Sign in Where do I copy the key?
My storageConnected
R2My R2 bucket
Paste a Cloudflare token → choose your domain
2

2. Upload videos

Upload videos in your browser.

Choose your files. We prepare them for playback.

  1. 1.Choose Upload video in your video list.
  2. 2.Choose files or a folder, then select where to upload them.
  3. 3.Keep the browser open until the video shows Ready.
Sign in
Upload videosBrowser

Choose video files or a folder

We prepare it for playback after upload
3

3. Show it

Copy the link.

Your recipient can open the link to watch.

  1. 1.Open a Ready video and choose Share.
  2. 2.For a private video, choose Create share link. For a public video, copy its link directly.
  3. 3.Paste the link into a message or email.
Sign in
▶

Ready to play

https://nulx.dev/s/…

Copy link

Where would you like to share your video?

Open your video, then choose Share. Follow just one option below.

Send a video anyone can watch

  1. In the video's Share tab, save Visibility as Public.
  2. On the same tab, choose Copy video link.
  3. Paste the link into your message or email.

Anyone with the link can watch. Processing must finish and any scheduled release time must arrive first.

Send a video to a client or reviewer

  1. Open the Share tab of a private or protected video.
  2. Choose Create share link.
  3. Choose Copy link on the new link and send it.

Links last 7 days by default. You can add a numeric password (PIN). Send the PIN separately from the link.

Put a video on your website

  1. Open Embed on a website.
  2. Choose Copy embed code.
  3. Paste it into an HTML block in your site editor.

Embed code adds a player to your page. For a protected share link, open its embed, stats and revoke options to copy the code.

For developers · oEmbed and HLS URLs

oEmbed turns a video link into an embedded player. Paste a public video link into the video URL field of a service that supports it. Copy oEmbed URL is for developers connecting the API. Private or protected videos and /s/ share links are not supported. Use Connect to an external platform when a service asks for HLS. Anyone with that URL can access the video, and it reveals the source address. Share it only with the intended recipient.

oEmbed: /oembed?url=…&format=json HLS: /l/…/master.m3u8

oEmbed developer docs

Before sending, open the link in a different browser to check it. The Send to a teammate address opens the management page for signed-in members of your account.

Open videos

Do you need to set up a domain?

A domain is an internet address such as example.com. If your video is already uploaded, you do not need to set up another domain to send its link. Open an option below only when you need it.

Choose an address for video delivery
  1. Have a domain managed by your Cloudflare account ready, such as example.com.
  2. In NULX Storage, choose Cloudflare R2 automatic setup, then Protected playback.
  3. Follow the first-time setup guide below to create a Cloudflare token. A token is like a password that lets NULX perform setup.
  4. Paste the token and choose Verify token. Select the account and domain.
  5. Choose the first part of your video address. For example, video plus example.com makes video.example.com. Use an address that is not already in use.
  6. Choose Continue, then Connect storage. If DNS or HTTPS is pending, wait and check the same setup again.
  7. After connecting, upload one video and play it. A ready status alone does not prove playback works.
  8. This address delivers video files. Sharing links still use nulx.dev. Connections that already contain videos need a separate migration to change their address.
Open storage
Choose where to embed your videos
  1. Open Settings → Allowed embed domains.
  2. Enter the website where you will put the player. Leave out https:// and any path. Example: www.example.com
  3. For multiple sites, separate addresses with commas or newlines. You can add up to 20. Add example.com and www.example.com separately.
  4. Do not include stars (*) or port numbers. You do not need an API key or DNS changes for this setting.
  5. A folder’s own domain list takes priority. An empty list uses its parent folder, then the account settings.
  6. This limits which websites can embed the video. It does not prevent someone opening a public link directly. An empty field does not mean block all sites.
Open account domain settings
Advanced · Different settings for each site
  1. Open Site deliveries and choose videos or folders. A folder includes subfolders and videos added later.
  2. Enter all websites you want to allow, then save.
  3. Copy the embed code from this screen as it is. An ordinary video link or oEmbed URL will not carry the site-specific settings.
  4. The delivery value in the address selects the site settings. Do not edit it yourself.
  5. When settings overlap, the site list comes first, then the folder and its parents, then the account. Lists do not merge, so include every required address.
Open site deliveries

Copy the key needed for setup

A key is like a password used to connect storage. You do not need one just to send a video link. Open the option that matches your setup. Put keys only in the specified fields, never in messages or support requests.

First-time setup · Cloudflare R2 automatic setup
  1. Sign in to Cloudflare and enable R2. The account must also manage your domain. Cloudflare may charge separately for storage, delivery and Worker usage.
  2. In NULX Storage, choose Cloudflare R2 automatic setup. You must be the account owner.
  3. Choose Create token in Cloudflare. In the new tab, choose Get started under Create Custom Token.
  4. Under Permissions, select these four rows using the exact names shown. Account → Workers R2 Storage → Edit User → API Tokens → Edit Account → Account Settings → Read Zone → Zone → Read
  5. For Protected playback, add these two permissions. Account → Workers Scripts → Edit Zone → DNS → Read
  6. Under Account Resources, select only the account you will connect. Under Zone Resources, select only your domain.
  7. Choose Continue to summary → Create Token. Copy the token shown. You can only see it once.
  8. Return to NULX and paste it into the first step’s token field. Choose Verify token. Do not use a Global API Key or R2 S3 credentials here.
  9. Choose the account, domain and first part of your video address. Choose Continue → Connect storage.
  10. Protected setup needs an empty private bucket. Public bucket mode makes every file in the bucket public.
  11. This setup token is not saved. Separate storage keys created during setup are still needed, so do not delete them.
  12. To retry R2 protected playback on an existing saved connection, use these permissions. Account Settings Read · Zone Read · DNS Read Workers Scripts Edit · R2 Storage Read New automatic setup also needs R2 Edit and API Tokens Edit.
Cloudflare token creation guide
I already have R2 storage · What goes in each field?
  1. In NULX Storage, choose the existing-bucket option. A bucket is a space that holds your video files.
  2. To upload videos, choose Read/write. Read-only cannot upload new files.
  3. In Cloudflare, open R2 → Overview. Under Account Details, choose Manage beside API Tokens, then create a token.
  4. Select only the bucket you want to use. Choose Object Read & Write for uploads, or Object Read only for read-only access.
  5. Account ID: paste the 32-character ID of your Cloudflare account.
  6. Access Key ID: copy Access Key ID from the token you just created.
  7. Secret Access Key: copy Secret Access Key from the same screen. Do not confuse it with the different API Token value.
  8. Bucket: enter the exact name shown in R2. Label: choose a name you will recognize.
  9. Public base URL: enter the address that serves your video files. Example: https://video.example.com Do not use …r2.cloudflarestorage.com or a NULX sharing link.
  10. If you chose to connect only certain folders, enter their allowed prefixes. Save and check the connection and protected playback status.
  11. You can only see Secret Access Key at creation. If lost, replace it with a new key, check that the connection works, then revoke the old key.
Official R2 credentials and permissions
For developers · Create a NULX API key
  1. Ordinary sharing does not need an API key. This is for developers connecting another program.
  2. Sign in as owner and open API keys. Choose a name, required scopes and expiry, then issue a key. Scopes depend on the plan; Founding supports only playback:read.
  3. Copy the full key shown once into your server’s secret settings. For example, use NULX_API_KEY.
  4. Send it in the X-API-Key request header. A storage provider key cannot authenticate to NULX.
  5. Never put the key in webpage code, iframe URLs, shared URLs or public repositories.
  6. If lost: issue a new key → replace it on your server → check the integration → revoke the old key.
NULX API authentication and scopes
For developers · Receive updates on your server (webhooks)
  1. A webhook sends updates, such as completed video processing, to your server. Ask your developer for a public HTTPS receiver address.
  2. Sign in as owner and open Webhooks. Enter the receiver address. Example: https://app.example.com/webhooks/nulx Do not enter a viewing or storage address.
  3. Choose the events you want and register. Choosing no events subscribes to all events.
  4. Copy the signing secret shown once into the receiver server’s secret settings. This is different from API and storage keys.
  5. The server must check NULX-Signature to verify the notification and use NULX-Event-Id to prevent duplicate processing. See the developer guide below for verification details.
  6. Configure the receiver to return 2xx after it successfully processes a notification.
Webhook developer guide
Setup is not working · Check these first
  1. Key error or 401/403? Check the key type, account, permissions and expiry. Paste the key again if the password field is empty.
  2. Domain missing? Check that it belongs to the same Cloudflare account and the token has permission for that domain.
  3. Address already in use? Choose another first part of the address. Do not delete live DNS records.
  4. DNS or HTTPS pending? Check the target and DNS settings shown. Updates can take time to spread. Wait, then check the same setup again.
  5. Video will not play? Check processing, release time and storage protection. Also check the share link’s PIN, expiry and revocation.
  6. Only failing on your website? Check that the actual site is in your allowed domain list. Do not make a video public just to bypass the problem.
  7. Still stuck? Send support the error message and time. Do not send keys, PINs or protected sharing links.

Share safely

Choose the address for the audience and player you need. Video protection still applies to every site.

Public link or iframe

In Video → Share, copy the player URL or iframe code. A public, ready video also works with oEmbed.

Good for: One stable address for a page, blog or message.

Keep in mind: Anyone with the URL can watch. Allowed embed domains restrict framing, not direct viewing.

Open videos

Protected share link

Make the video private or signed, then create a link with an optional PIN and an expiry of 1, 7, 30, 90, 180 or 365 days, a custom date, or no expiry. The link can also go in an iframe.

Good for: Share one video with someone outside your team and end that link later.

Keep in mind: A forwarded URL and PIN also work for someone else. The storage must support protected delivery.

Open videos

Site delivery

The account owner assigns videos or folders to a named site, sets allowed iframe domains and a default subtitle language, then copies its site embed. Folder assignments include future uploads.

Good for: Separate embed rules and viewing stats for each site; pause it without deleting its setup.

Keep in mind: It does not deploy a website or override video protection. Protected embeds need a fresh server-issued token; pausing returns 410.

Open site deliveries

External HLS link

The account owner can create this in Video → Share → Connect to an external platform for an external player that cannot use an iframe.

Good for: Connect a player that expects a manifest URL.

Keep in mind: The platform and viewers can inspect and save the playback address. There is no PIN or domain lock; test long playback and seeking. This option is managed in the dashboard.

Open videos

Sharing only with teammates? Copy the team link in Video → Share; viewers sign in with their team account.

Your first share

  1. Check the video protection setting and storage connection. Private videos require signed delivery URLs.
  2. Choose a sharing period, or no expiry for ongoing access. If you set a PIN, we recommend 8 digits.
  3. Open the link in another browser while signed out to check the PIN and playback before sending it.

Common questions

What if someone forwards the address?

A link-based share can be used by another recipient. You can require a PIN, but restricting access to a specific recipient email is not currently available.

Does ending a share stop everything immediately?

New access and share-session refreshes are blocked. Issued video URLs may remain valid until expiry, and received video cannot be recalled. This is not immediate revocation of every media segment.

Does an allowed-site list prevent URL leaks?

It limits which websites may embed the player. It is not authentication against forwarding, direct requests or copying the video.

Why am I asked to reopen the link?

If the share has not ended, reopen the original share link. Expiry, permission changes or a security update may require you to enter the PIN again.

Protecting your own storage

Check both NULX delivery protection and your storage's public settings. The steps below are guidance, not automated test results.

Cloudflare R2
  1. Check the bucket's public r2.dev address and all custom domains. They are independent public routes.
  2. Verify that the NULX protected playback route actually works. Entering a signing key alone does not install the delivery layer.
  3. Test the transition before closing public origin routes so existing videos keep working. Do not disable them before protection is ready.

Never put API keys or storage secrets in share links, chat or browser code. Storage changes must be made by the account owner.

Everyday features

Open only what you need

Getting video in

Pick a whole folder in the browser and everything inside goes up, with the same folder structure. For very large files or hundreds at once, the PC uploader we give contracted customers is faster.

Do this

  1. 1. Open the library and choose Upload.
  2. 2. Pick files, or choose Select folder to send a whole folder.
  3. 3. Leave the tab open while it uploads. Finished videos appear in the list.

If it fails

  • Subtitles named name.ko.srt or name_KR.srt next to the video attach automatically, whether you upload from the web or the PC app.
  • Titles, descriptions and tags come from info.json in the same folder; use 1.info.json next to 1.mp4 to override one video.
  • If the service restarts mid-upload it picks up where it left off. Just keep the tab open.
Ask about the PC uploader
Organize with folders

The left pane of the library is your folder window. NULX at the top is the whole library; create as many folders as you like below it and drag videos into place, just like files on your computer.

Do this

  1. 1. In the folder pane, click + next to NULX or any folder and name it. It is created inside the folder you clicked.
  2. 2. Grab a video row and drop it on a folder. Checked videos move together.
  3. 3. Or click the folder name on a video row to pick a folder from the list.

If it fails

  • Drop a folder onto another folder to nest it (up to 6 levels).
  • Deleting a folder never deletes videos; they move one level up.
  • Open a folder and click Protection at the top right to protect every video in it and its sub-folders, plus anything added later.
Sign in
Protected playback and share links

Give a share link an expiry and an optional numeric password (PIN). Stop sharing when you no longer need the link.

Do this

  1. 1. Check protected playback and connection status in Storage. Protected R2 automatic setup installs the required Worker. Protected playback requires a paid plan.
  2. 2. Choose Protected playback under Visibility in the video's Share tab, or apply Protection to a folder.
  3. 3. In Share, choose an expiry and a PIN (4–8 digits), then create a link. Stop sharing to prevent new visits.

If it fails

  • Protected playback is not DRM and does not stop screen recording; it makes addresses expire.
  • If Protected playback cannot be selected, one of two things is missing: the storage's protected playback setup or a paid plan.
  • Setting a folder to Protected while the storage has no signing keeps its videos public and tells you so.
Sign in
Attach subtitles

Attach SRT or VTT files, generate automatic captions, and translate them. Viewers toggle subtitles in the player.

Do this

  1. 1. Open the video → Subtitles tab.
  2. 2. Choose a language and upload an SRT or VTT file.
  3. 3. Automatic captions are created when you tick the option at upload; use Translate to add more languages.

If it fails

  • Garbled text? Save the file as UTF-8.
  • Hosted automatic captions send extracted speech audio to the speech-recognition provider. Translation sends subtitle text. These optional features are billed by the minute used.
Sign in
Add video to another service or your site

Copy a video link or code into another service. The method depends on its editor.

Do this

  1. 1. Open your video and choose Share.
  2. 2. For a public video, choose Copy video link and paste into the service’s video URL field. The editor must support oEmbed.
  3. 3. For your own website, copy the embed code from Embed on a website.

If it fails

  • The oEmbed URL is unavailable for private, protected, processing, or scheduled videos.
  • Restrict iframe playback with the folder's playback sites. A blank list inherits the account defaults.
  • Protected playback needs fresh server-issued URLs or share links instead of fixed oEmbed.
Sign in oEmbed developer docs
Team and roles

Owners handle hard-to-undo things like billing, storage and deletion; members do the everyday work of uploading and organizing.

Do this

  1. 1. Open Team.
  2. 2. Enter the email to invite. That person is in as soon as they sign in with it.
  3. 3. Check roles. There can be several owners, but the last one cannot be removed.

If it fails

  • A greyed-out button for a member is an owner-only action.
  • Deleting storage, emptying trash and changing the plan are owner-only.
Sign in
Two bills, two places

NULX bills the plan, encoding beyond the included hours, and automatic captions you turned on. Cloudflare bills your R2 storage and operations separately; approved alternative storage providers bill their own charges.

Do this

  1. 1. Usage shows this month's encoding minutes and caption minutes.
  2. 2. The Billing tab shows NULX invoices.
  3. 3. Check storage costs in your Cloudflare dashboard, or the dashboard of your approved storage provider.

If it fails

  • Wondering about cost? Look at the usage numbers first; invoices are computed from them.
  • Protected playback is not available on the free evaluation.
Sign in

When you are stuck

Find your symptom

SymptomCauseFix
Video will not play (403 or 503)Storage protection may be incomplete, or your plan does not support protected playback.Check connection status and protected playback in Storage. If it still fails, send support the error message.
I cannot uploadNo writable storage is connected.Check your storage connection. Uploading requires Read/write access.
The video stays ProcessingReading or converting the file may have failed.Check the error above your video list and retry processing. Contact support if it keeps failing.
I cannot find the PC uploader login codeCodes are not emailed. Create one on the website.Sign in on the website, open Desktop app login and choose Create login code. Enter it in the app within 5 minutes. If the menu is missing, ask support whether your account has access.
Deleted storage still appears in the PC uploaderThe app has not refreshed its list yet.Choose Recheck storage to refresh the list.
Protecting a folder did not change its videosStorage protection may not be ready.Enable protected playback in Storage, then apply folder protection again.

Costs stay in your hands

Your videos stay in your storage, with clear costs

Review NULX usage separately from storage-provider costs.

View pricing