The brand-house command portal.
Log in with your mobile number.
{{ login.err }}
Access is by invitation — numbers are added by an admin.
Prototype · demo logins · code 123456
Social Monkey
{{ shell.needsYouCount }}
{{ preview.text }}
{{ meInitial }}
Data failed to load: {{ loadError }}
{{ dash.today }}

{{ dash.greeting }}

This week: {{ dash.stat.scheduled }} going out, {{ dash.stat.toShoot }} still to shoot, and {{ dash.stat.needYou }} that need a decision from you.

Needs you · {{ dash.stat.needYou }}
See all {{ dash.stat.needYou }} →
You're all caught up. Nothing waiting on you.
{{ n.brandShort }} {{ n.kindLabel }}
{{ n.title }}
{{ n.reason }}
{{ n.dateLabel }} {{ n.action }} →
This week at a glance Open calendar →
{{ d.name }} {{ d.num }}
{{ p.fmt }}
·
{{ l.label }}
Pipeline health
{{ pl.brandShort }} {{ pl.total }} posts
{{ s.count }} {{ s.label }}
{{ pl.note }}
Quick actions

Calendar

{{ cal.label }}
Campaigns
{{ w }}
{{ d.day }}
{{ p.title }}
+{{ d.more }} more
Banked · shot & ready, unscheduled ({{ cal.bankedCount }})
Drag onto a date to schedule
{{ b.brandShort }}{{ b.statusLabel }}
{{ b.title }}

Pipeline

drag a card to advance its status
{{ col.label }} {{ col.count }}
{{ c.format }}
{{ c.brandShort }}
{{ c.title }}
{{ c.dateLabel }}
{{ c.bestTime }}
·
{{ detail.brandFull }} {{ detail.statusLabel }}

{{ detail.hook }}

{{ detail.id }} · {{ detail.format }} · {{ detail.dateLabel }} · {{ detail.platform }}
Suggested time · {{ detail.bestTime }}
Branch
Clinic posts: that clinic's machines · Machine sales: the public catalogue
The content
Suggested rewrite
{{ detail.sugHook }}
Refining…
Suggested rewrite
{{ detail.sugCaption }}
required
Carousel · {{ detail.slideCount }} slides
{{ sl.n }} {{ sl.text }}
Strategy
Pillar
{{ detail.pillar }}
Goal
{{ detail.goal }}
Audience
{{ detail.audience }}
Funnel
{{ detail.funnel }}
Marketing angle
{{ detail.angle }}
Speaks to
{{ detail.speaksTo }}
Shot direction
Colour signal {{ detail.colourSignal }}Shade {{ detail.accentShade }}{{ detail.shotCountLabel }}
{{ detail.noShotsText }}
{{ sh.num }} Before / after · identical frame · no retouch
Shot type
Camera angle
Lens feel
Device · branch only
Frames
Subject — exactly what is in frame
Composition
Lighting
Backdrop / setting
Wardrobe / styling
Props (comma-separated)
Colour story
Model direction / pose — exact and physical
Movement — one beat per line
{{ sh.framingLabel }}{{ r }}
Compliance {{ detail.compLabel }}
{{ ck.label }}
Citation (research / study) — required before approval
Dance around the words — describe the appearance, never promise a physiological outcome. Humour stays unhinged; claims wear the lab coat.
Assets & template {{ detail.template }}
4:5
9:16
ref: {{ detail.imageRef }} · preset: {{ detail.editPreset }}

Describe → Generate

Describe an image, a moment, or an idea. The agent drafts it in Sarah's voice — caption, hook, brand, timing, shoot direction, compliance — ready to save. You always review before it posts.

Brand
Branch
Agent may only mention: {{ gen.branchDevices }}
Drafting in Sarah's voice… brand brains · compliance · timing rules loaded
{{ gen.error }}
{{ gen.rv.brandShort }} {{ gen.rv.brandWhy }}
Format
{{ gen.rv.format }}
Pillar
{{ gen.rv.pillar }}
Best time
{{ gen.rv.bestTime }}
Hook
{{ gen.rv.hook }}
Caption
{{ gen.rv.caption }}
CTA
{{ gen.rv.cta }}
Hashtags
{{ gen.rv.hashtagsStr }}
Shoot direction
{{ gen.rv.shootDirection }}
Alt text
{{ gen.rv.altText }}
Compliance flags applied
• {{ f }}

Capture Inbox

{{ inbox.count }}

Raw dumps, newest first. Shape them when there's time — nothing needs to be caught in the mood, nothing gets lost.

Where does this pic fit?
Drop a photo you love. The agent suggests whether to attach it, draft a new post, or bank it — you confirm, nothing auto-applies.
Mock response
Reading the photo against your open posts, brands and banked library…
Suggested · {{ place.decisionLabel }}
{{ place.reason }}
{{ place.pv.brandShort }}{{ place.pv.id }} · {{ place.pv.statusLabel }}
{{ place.pv.title }}
{{ place.pv.sub }}
{{ place.pv.brandShort }}{{ place.pv.pillar }} · {{ place.pv.format }}{{ place.pv.time }}
{{ place.pv.hook }}
{{ place.pv.caption }}
{{ f }}
{{ place.pv.brandShort }}{{ place.pv.theme }}
{{ place.doneText }}
All shaped — inbox zero.
{{ c.text }}
{{ c.t }}Banked {{ c.brandShort }}?

Shoot Board

Last big shoot: {{ shoots.bank.date }} · banks through {{ shoots.bank.banksThrough }} · {{ shoots.bank.postsDrawn }} posts still drawing from it.
Evergreen banked — no need to shoot yet
Format health
{{ shoots.intel.flag }}
{{ b.v }}
{{ b.label }}
{{ r }}
Status
{{ col.label }} {{ col.items.length }}
{{ ss.date }}
{{ ss.location }}
{{ ss.count }} posts · {{ ss.shotsLabel }}
{{ c.brandShort }}{{ c.format }}
{{ c.title }}
Generated shoot Covers {{ shoots.gen.count }} un-shot posts · {{ shoots.gen.dayCount }} day(s) · ~{{ shoots.gen.totalShots }} shots
{{ shoots.gen.model }}
{{ d.day }}{{ d.totalPosts }} posts · ~{{ d.totalShots }} shots
{{ st.setupId }} {{ st.setup }}
~{{ st.shots }} shots {{ st.consentStr }}
{{ st.light }} · {{ st.backdrop }}
{{ pp.brandShort }}{{ pp.title }}
Nothing un-shot right now — everything's banked or in flight.
Batch suggestions
{{ ba.count }} posts want the {{ ba.setup }} {{ ba.tag }}
{{ it.title }}

Compliance queue

{{ compliance.count }}

Every post with an open flag — a missing citation or consent — in one place. Clear these before they can be approved.

Nothing flagged — every post is compliant.
{{ c.brandShort }}
{{ c.title }}
{{ c.issue }}
{{ c.statusLabel }} {{ c.stateLabel }} Resolve →
Think Tank · New review

Meeting Intake

The gate. The Think Tank does nothing until this is submitted — a real meeting, real stats, real feedback. Never autopilot.

Date
Attendees
1 · The stats
Follower trend this cycle
S AL MX
2 · The feedback
Brand direction
What isn't working we keep pretending is ★
New catchphrases coined
Nothing runs until you submit. The agent reviews, researches and diagnoses — then you decide.

Review · {{ review.month }}

{{ st.label }}
{{ review.error }}
Findings
{{ f.claim }}
{{ f.backing }}
Working
{{ w }}
Not working
{{ w }}
Opportunities
{{ w }}
Recommended pivots
Options, not orders. Tick the ones you want — they seed the plan.

Nothing to review yet

The Think Tank fires only after a real meeting and real stats. Submit the intake and the agent reviews, researches, and diagnoses — every claim backed.

Insights Vault

The memory. Every review, what you decided, and whether it worked — so the Think Tank learns your account, not a benchmark.

Reach over time · per brand
{{ tr.brandShort }}
{{ b.val }}
{{ b.label }}
Timeline
{{ rs.month }}{{ rs.date }}
{{ rs.outcome.text }}
Decided
· {{ d }}
Think Tank · Next cycle

Plan Builder

The review's recommendations, in your words. Edit freely — on approval it seeds draft posts into the Calendar & Pipeline, closing the loop.

Campaign focus
Content mix shift
Growth lever
Shoot needs
Approved — {{ plan.seeded }} draft posts seeded.
They're in the Pipeline at Drafted, ready to shape.
This plan is set by HQ. Execute within it — drafts, shoots and designs still go through approval.

Brand Brains

The agent's fuel — what makes generation sound like Sarah, not slop. The single most important data in the app.

Changes flow to the agents instantly
{{ brains.name }} · role
{{ brains.role }}
{{ brains.voiceNote }}
Colour source: {{ brains.colourSource }}
Hard rules
{{ r }}
Post types
{{ p }}
Signatures
{{ g }}
Catchphrase bank
{{ c }} {{ c }} ✦
Set by HQ — inherited read-only. Every branch generates from this same brain.
Cringe list · banned
{{ b }} {{ b }} ✦
Set by HQ — inherited read-only. Every branch generates from this same brain.

MoyaLux machines

{{ machines.total }}

The fleet and its modalities. Clinic posts can only mention their branch's machines; machine-sales posts can use the public catalogue. Claims stay at modality level — compliance flags any technology a machine doesn't have.

Pretoria clinic
{{ machines.pre }}
Polokwane clinic
{{ machines.pol }}
{{ c.name }}
{{ m.name }}
{{ m.modality }}
{{ m.does }}
{{ p.label }}

Templates

{{ templates.count }}

The Claude Design render registry — every shot type with its slots, dimensions and crop outputs. Posts link here to render.

{{ t.statusLabel }}
{{ t.code }}{{ t.brandShort }}
{{ t.name }}
{{ t.note }}
{{ t.format }} · {{ t.slots }} slot(s)
{{ t.dims }} · crops {{ t.cropStr }}
Open in Studio →

Team & Access

{{ team.count }}

Add a mobile number, give it a role and a slice of the business. They log in with an SMS code and only ever see their slice. There is no open sign-up.

Role · what they do
Owner approves & posts · Editor drafts & designs · Viewer reads
Scope · what they see
Brands, and MoyaLux branches. Everything else is absent.
Governance · who owns strategy
HQ (Pretoria) owns Think Tank, Brand Brain & Plan. Polokwane executes.
{{ team.form.title }}
Name
Mobile — their login
Role
Brand access
MoyaLux branch access · at least one
{{ team.form.err }}
{{ u.initial }}
{{ u.name }}
{{ u.masked }} · {{ u.last }}
{{ u.roleLabel }} {{ c }} {{ u.statusLabel }}
Scope here is a convenience filter. The server enforces the same scope on every query — a hidden brand or branch is unreachable by the API, not just not shown.

{{ soon.name }}

{{ soon.desc }}

Coming in the next build
Quick capture 3 seconds · shape it later
Call Sheet
{{ csheet.total }} posts · ~{{ csheet.shots }} shots
Shot list by setup
{{ d.day }}
{{ st.setupId }}{{ st.setup }}{{ st.nums }}
{{ sh.n }}
{{ sh.head }}{{ sh.frames }} framesConsent needed
Subject {{ sh.subject }}
{{ sh.spec }}
Light / set {{ sh.light }}
Styling {{ sh.style }}
Pose {{ sh.pose }}
Beats {{ sh.move }}
Kit
· {{ k }}
People
· {{ p }}
Consent required
{{ c }}
On the day
{{ r }}
Book this shoot

Books all {{ book.count }} un-shot posts into a session — they move to Shooting and leave the not-yet-shot queue.

Date
Location
{{ toast }}