Cliff | Short Drama Streaming App with Branching Episodes

Bluehost Shared Hosting

Cliff | Short Drama Streaming App with Branching Episodes

A short-drama app where the choice is the product

Cliff is a complete short drama streaming platform with branching episodes: a Flutter application for iOS and Android, and a Node + PostgreSQL backend with an operator panel. They are developed against each other and ship together — the app is not a mockup and the backend is not a stub.

Short vertical episodes end on a cliffhanger. The screen cracks along a fault line and the viewer picks a side: EMBER, the risky path that usually costs coins, or TIDE, the safe one that is free. Each side leads somewhere different, so a series ends in two, four or more places — and the path they did not take can be opened later and watched.

Live demo: cliff.webkodingtheme.com
Operator panel: cliff.webkodingtheme.com/app/admin
Demo credentials are printed on the sign-in page. Sign in and edit anything — the catalogue resets every hour.

Please note: the episode videos are not included

The download does not contain any episode videos. The 19 episodes of the sample series Unopened play only on the live demo, so you can see the app working with real content before you buy. What the download does include from that series is its story graph (episodes, branches, endings, prices), its poster and one still frame per episode, which demo mode and the seed script use. To publish your app, upload your own videos — the operator panel and the seed script attach them to episodes.

AI disclosure

The sample series, Unopened — its footage, episode frames and characters — was produced with AI video tools for demonstration. The download includes only its frames and poster; replace them with content you hold the rights to before you publish. AI-assisted tools were also used to help write and review parts of the source code and documentation; every part was reviewed and tested by the author.

Cliff | Short Drama Streaming App with Branching Episodes

The branching engine

Every competing short-drama item plays episodes in a straight line. In Cliff a series is a directed graph — an episode is a node, a branch option is an edge — and two rules follow from that, both enforced in the database rather than left to convention:

Unlocks are permanent. Paying for a branch buys the episode itself, which is what makes “the path you did not take can be opened later” true rather than marketing.

VIP grants no unlocks. Access is computed from the subscription being live, so cancelling puts the locks back. Otherwise one month of VIP would buy the whole catalogue permanently and nobody would ever renew.

The branch map screen draws the real graph — solid where the viewer has walked, dim where the story is still sealed — and counts how many endings they have reached out of how many exist. Endings are counted from the graph, never typed in, so the poster cannot claim a number the story does not have.

Cliff | Short Drama Streaming App with Branching Episodes

What the app does

Watching — Vertical video player with seeking and resume, progress saved per episode, a feed personalised from the tropes chosen during onboarding, search, series detail with an episode rail, library and continue-watching.

Choosing — The cliff moment with the fault-line split, the two-temperature EMBER/TIDE choice, real choice statistics that are withheld until enough people have chosen for a percentage to mean anything, and a branch map drawn from the live graph.

Store compliance — An age gate enforced by the router rather than a dismissible dialogue, data export on request, real account deletion with a recoverable grace period, push priming before the system dialogue, report and block with a moderation queue behind it, subscription management from settings, and a restore purchases button that really asks the store.

Push notifications — Send to every device, or a segment, from the panel through Firebase Cloud Messaging. The app is configured with build flags, so it compiles and runs without a Firebase project and simply does not offer notifications until you add one.

Demo mode — With no build flag the app runs against a built-in repository holding the same sample series the backend seeds. You can walk the entire loop, spend coins and reach an ending before standing up a database.

Cliff | Short Drama Streaming App with Branching Episodes

A real series to try it with

Unopened — nineteen episodes of about a minute, one cast, fifteen cliffs and four endings — plays in full on the live demo. The download carries its story graph, its poster and a frame for every episode, which demo mode and the seed script (npm run seed:unopened) use, so the app looks like a drama app from its first launch rather than a set of grey rectangles. The episode videos are not included; the seed attaches your own videos when you add them.

Cliff | Short Drama Streaming App with Branching Episodes

The operator panel

In the app’s own palette rather than a stock admin theme, and translated — English and Turkish ship, and adding a language is one file of plain strings.

The branch editor — Lay out cliffs, point each side at an episode, mark your endings. The validator refuses to publish while an episode is unreachable, a cliff has one side, or a choice leads nowhere. Every one of those presents to a viewer as the app being broken, so they block publication rather than warn.

The overview — Things that are actually wrong go above the numbers: a published series with an episode that has no video is a viewer hitting a black screen. It also shows the week’s EMBER/TIDE split, which is the number that tells you whether your branches are priced right.

Viewers — Balances, full ledgers and choice history. Adjustments are signed, so a minus takes coins away, and every one writes an audited reason.

Cliff | Short Drama Streaming App with Branching Episodes

Money, done honestly

The ledger balances. Every coin movement carries an idempotency key and is written in one transaction with the thing it paid for, behind a row lock. A retried request — a phone on a train, somebody tapping twice — moves the balance once.

Purchases are verified server-side. The phone saying a purchase succeeded is a string an app can be made to send. The receipt goes to Apple or Google and only their answer credits anything. RevenueCat is not required — that is a recurring cost several competing items pass on to you for something the stores already answer for free.

Rewarded advertisements pay from the network’s callback, not from the phone, with the signature verified against Google’s published keys. With verification switched off the endpoint refuses everything, because an unverified reward endpoint on the open internet is a coin faucet with a public URL.

No RevenueCat, no AWS SDK, no Google API client. The request signing each of those would provide is written against the standard library — about sixty lines you can read. Three dependencies on the server in total.

Cliff | Short Drama Streaming App with Branching Episodes

Running it

One command. The supplied installer for Ubuntu 22.04 and 24.04 brings Node, PostgreSQL, nginx and certbot from Ubuntu’s own repositories, creates the database, writes the configuration with generated secrets, applies the schema, registers a service and a daily job, obtains a certificate and prints the first password once. About ten minutes. It is written to be read before it is run.

Video lives on the operator’s own disk or in any S3-compatible store — AWS S3, DigitalOcean Spaces, Wasabi or Cloudflare R2 are the same API, so one implementation covers what other items list as three separate features. Episodes are served with HTTP range requests, which is not optional for video.

Rebranding is two files: the colour tokens and the theme. Swap the two accents and the three Google fonts and it is your product. The full design system — tokens, specimen cards, component sources and a 32-screen UI kit — ships with it.

Cliff | Short Drama Streaming App with Branching Episodes

Requirements

Flutter 3.38.1+ and Dart 3.10+ (the floor is set by the two store plugins, not by the app) · Node 20+ · PostgreSQL 14+ · Xcode for iOS builds (iOS 15+), Android Studio for Android builds · Ubuntu 22.04 or 24.04 for the supplied installer.

Third-party services and costs

None of the following is included in the item price. A VPS and a domain are required — shared cPanel hosting will not work, because this is a Node application and it serves video. Object storage and a CDN are optional and usage-priced. Publishing needs an Apple Developer Program membership and/or a Google Play Console account, and the stores take a commission on in-app purchases. AdMob and Firebase (push notifications, optional) have free tiers. RevenueCat is not required.

The sample series is AI-produced demonstration content (see AI disclosure above), and the other demo posters are drawn from the design system. Replace both with your own before release.

Support

Setup guidance and bug fixes are included. The documentation ships as a browsable HTML page and as a PDF, and covers a screen-by-screen tour of the app with annotated screenshots, installation, configuration, a branding and colour guide, the component props, the REST API, writing a branching series, store compliance and a troubleshooting section grouped by symptom.

License

Every feature ships in both licenses. Nothing is held back, disabled or sold as an add-on: the coin economy, in-app purchases, VIP subscriptions, rewarded advertisements, the branch-graph editor, the operator panel, the installer and the complete source are included whichever license you buy. There is no paid module and no upgrade to unlock.

Which license you need is decided by your end product rather than by which features you switch on. For the terms see Envato Standard Licenses.

Changelog

v1.1.0
– New: Unopened, a 19-episode sample series with four endings, playing on the live demo; its story graph, poster and frames are used by demo mode and the seed
– New: a frame for every episode, on its card and behind the player
– New: real push notification registration through Firebase Cloud Messaging
– New: Restore purchases, with optional Terms and Privacy links
– Improved: the VIP screen states exactly what VIP does, and the plan you pick is the plan you buy
– Removed: Downloads and Language screens and settings rows that had no feature behind them
– Fixed: posters and episode frames now load from a real server
– Fixed: iOS deployment target raised to 15.0 for current Xcode
– New app icon

v1.0.0
– Initial release
– Flutter application, iOS and Android, 20 screens
– Node + PostgreSQL backend with operator panel and branch-graph editor
– Idempotent coin ledger, store-verified purchases, AdMob server-side reward verification
– One-command installer for Ubuntu 22.04 and 24.04
– Demo mode: the app runs with no server at all
– Panel in English and Turkish

0 average based on 0 ratings.

WebKoding

WebKoding

Visit Author's Portfolio

View Portfolio
Last Update 2026-10-13
Created 2026-08-06
Sales 1
Discussion Comments
Software Version Flutter 3.x
Files Included Dart YAML JavaScript JSON .java .kotlin .h .storyboard .plist .swift
Video Preview Resolution