I Made Two AI Sisters the Face of My Indie App So I Wouldn’t Have to Show Mine

I Made Two AI Sisters the Face of My Indie App So I Wouldn’t Have to Show Mine

Amana is a solo-built iOS app that renders the sky outside your window from your time, location, and the sun's position, and tries to get you to walk outside and give a real sky a name. It shipped for the RevenueCat Shipaton on 6 August 2026. The problem this post is about came after shipping: an app with no face is hard to point at. Why characters, and why two I do not want to be on camera, and a brush-lettered logo cannot talk. So the app got two spokespersons. Akane, the elder, belongs to dusk. Kahatare, the younger, belongs to the hour before dawn. Their names come from old Japanese words for the two twilights, both of which literally ask "who is that?", the hours when faces blur. They share the app's name as a surname. The two-sister setup was a marketing choice that turned out to carry a story on its own. The sisters live at opposite ends of the day, so in principle they can never stand under the same sky. When I later needed a 21-second music video for the chorus of the app's theme song, whose lyric is roughly "let's leave here and go meet you, toward the real sky", the tragedy was already built in. I did not have to invent a plot; I had to avoid breaking one. Everything about them is generated, and every upload says so. What Seedance broke, and what phrasing survived I generate the character video with Seedance 2.5 through seevio.ai, from a fixed set of eight or nine reference images of the sisters. Pricing, measured on the screen rather than remembered: 480p costs 10 credits per second, 720p 20, 1080p 30. A 30-second clip at 720p is 600 credits. I misread this once, because the page defaults to 480p and I read the cost before switching resolution. Read the price and the resolution next to it together. With a monthly grant of 1,600 credits, a 60-second piece at 720p means two generations and no retakes. So before spending 600, I spent 50 on a five-second scout with no dialogue and a static camera, purely to answer the two questions I had no evidence for: do two faces in one frame stay two faces, and does a floating panel hold its position? Both passed, and the scout surfaced three prompt failures that would have ruined the full take. Metaphors become objects. I described the panel as having "proportions like a phone screen". The model drew an iPhone, with notch and bezel. I kept the phone in the end, but as an explicit instruction ("one large modern smartphone, standing upright, seen straight from the front") rather than an accident. The same rule shaped the chorus video: I wanted the frame split in half, sunset left and pre-dawn right, and did not write "split screen" because I expected a literal partition. I wrote where each sky is: "Behind AKANE on the left half of the frame the sky is a burning orange and rose sunset. Behind KAHATARE on the right half the sky is deep indigo before dawn." That rendered as intended. Relative descriptions do not land. "AKANE is much taller than KAHATARE" was ignored; the sisters came out the same height. "KAHATARE's head only reaches AKANE's shoulder" worked, and I have used it in every prompt since. Concrete spatial relationships survive; comparatives do not. Reaching breaks sleeves. Asked to stand apart, the two drifted to the centre of the frame and the younger sister stretched an arm toward the panel; the sleeve of her coat extended with it, unnaturally. The fix was to stop asking for the gesture. Only the elder touches the panel now, the younger points or looks up, and for the back-to-back chorus video the prompt says outright: "They never touch each other with their hands and never reach out." Adjacency was not the bug; it became the whole composition. One more constraint I respected without proof: every clip that came out well took place in one location. With no retake budget I did not ask the model to move anyone indoors to outdoors. Never let the model draw the app The rule that made the whole thing work is that Seedance never draws UI or text. If you ask for a phone screen with an interface, you get a phone screen with corrupted pseudo-Japanese menus. So the prompt asks for a glass panel whose contents are "only plain open sky, slightly different in tone from the sky behind it, with no interface, icons or text", with "a thin pale luminous rim" so the four corners are trackable. The real app footage goes in afterwards. That has a physical consequence for the acting. The inside of the panel is overwritten in post, so any finger drawn inside it disappears the moment the recording is dropped in. Fingertips may touch the outer rim, never the glass. No swipes, no taps. Compositing turned out simpler than I feared, because the panel does not move by a single pixel across a 30-second take. That means you measure the rim once and reuse the coordinates for every frame. I do it with a luminance profile: dump a frame, take a horizontal row through the panel, and find the bright peaks that are the rim. One correction from the second take: measuring on a single row gave x 145 to 572, which was the colour boundary of the glass, not the rim. Measuring across every row from y 140 to 580 gave the real rim at 133 to 584. Use several rows and require them to agree. Then it is one ffmpeg overlay per segment, roughly scale=532:946,crop=532:858:0:44 and overlay=272:119 at 1080p, with the device recording cropped centred so the interface stays readable. Two details cost an afternoon each: The elder sister's hair and the glow at her fingertips are drawn in front of the panel in the source. Drop a recording in and they are hidden; cut it out with a hard enable=between(...) and the hair pops back into existence on one frame. The fix was fade=t=out:alpha=1 on the recording over half a second, so the glass "returns to sky" instead of switching. Subtitle and lyric overlays with enable='gte(t,st)*lt(t,en)': the interval must be half-open, or two lines stack on the boundary frame. This ffmpeg build has no drawtext, so all text, lyrics, subtitles and the end card, is rendered to transparent PNGs with PIL in the app's own bundled fonts and overlaid. The end card is a PNG too: icon, brush-lettered logo, App Store URL, because Shorts are watched muted and the description folds away on a phone. The two ffmpeg traps that hurt -loop 1 without -t runs forever. I passed a looping mask PNG into a filter_complex overlay expecting the output to stop when the main video ended. It does not. With the default shortest=0, framesync repeats the last frame of finite inputs for as long as any infinite source is alive. A 30-second render wrote for eleven hours and 3.5 GB before I noticed. Every -loop 1 image now carries -t , and the scripts say so in a comment. zoompan with d= freezes on frame one. The d parameter is output frames per input frame, not duration. Set it to the clip length and the filter grabs the first input frame and zooms it for the whole run, silently discarding everything after. On a single still this looks correct, which is why I did not catch it until a four-minute video with four crossfading images turned out to be one image at ten sampled points. The filter is d=1. The diagnostic: build a two-image, 30-second test; if the crossfade works there, the stage after it is guilty. The chorus short, end to end For the 21-second chorus video I had 278 credits left. 720p needed 420, so it went out at 480p (210 credits, 68 left) and was upscaled to 1080 by 1920 with Lanczos in the build script. The cut point in the song is not chosen by ear. An RMS scan found 1.25 seconds of near-silence at -38.9 dB ending at 72.25 s, where the chorus lands at -13.6 dB, and the four lyric lines sit at the loudness valleys after it. The generated audio is muted; only the song plays. Four lyric PNGs, a three-second end card dissolved in with an 0.8-second xfade, 23.2 seconds total. All four beats of the script came out: back to back, split sky, the younger sister turning to look, and the pull-back that shows the two skies were one. What the numbers say Across sixteen Shorts, the channel has 3,528 cumulative views; the last 28 days show 2,939 views, 3.1 hours of watch time, and two subscribers. Individual Shorts plateau between 250 and 490 views. The English versions beat the Japanese ones where both exist (382 versus 267 on one pair), and the episodes with the sisters are the best performers. The chorus short reached 257 views in 2.6 days with 51 percent average view duration and four likes. The full-length song video, by contrast, had two views in the same three days its Short had 310. Shorts are the door; the long video is the room. What the numbers do not say is that any of this sells the app. Weekly active users, with test devices removed, went from eight in the first week of August to six at the end of it. The pipeline from exposure to download exists and is thin. The place it stops is inside the app, between the second visit and the purchase, and that is not a video problem. Three things I would keep Buy evidence before you buy the take. A 50-credit scout answered every question a 600-credit generation would have failed on. When you cannot retake, spend a twelfth of the budget on the unknowns first. Let the model draw only what it is good at, and composite the rest. Empty glass and a luminous rim from the model; real pixels from the real app. The split kept the characters generated and the product honest. Write the physical fact, not the comparison or the metaphor. Where the skies are, whose head reaches whose shoulder, what the hands never do. Every prompt failure I had was an abstraction the model made concrete on its own terms. The sisters are on YouTube, X, Instagram, and TikTok as amana_sky. Here’s the chorus short. Amana is free on the AppStore.

Original Source

Read the full article at Hackernoon →

KhanList aggregates and links to publicly available news content. We do not host full articles from third-party sources. Always verify important information with original sources.