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

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
Blank — screen readers will use the Visual Story below.
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
Visual storyThe shoot’s north star — and what screen readers hear
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 }} {{ ck.tier }}
{{ ck.acceptedText }}
Compliance log
{{ a.text }}
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 }}
Slide {{ place.pv.slideN }} · {{ place.pv.slideKind }}
“{{ place.pv.slideLine }}”
Wants: {{ place.pv.slideMatch }}
Also fits
{{ 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.
From your bank — a slot just opened
{{ bf.label }}
{{ bf.text }}
{{ c.text }}
{{ c.t }}Banked {{ c.brandShort }}?

Shoot Board

Every shoot you're planning, booked or wrapped. Open one to see all its shots, lined up by setting.
No shoots yet. Start one here, or tick settings in Line-up by setting.
{{ sc.statusLabel }} {{ sc.postCount }} posts · {{ sc.shotCount }} shots · {{ sc.setupCount }} settings
{{ sn.label }}
No posts yet — add settings from Line-up by setting.
{{ st.setupId }}{{ st.setup }}{{ st.light }}
{{ pp.brandShort }}{{ pp.title }}
Setting · {{ gp.backdrop }}{{ gp.count }} shots
#{{ sh.n }}
{{ sh.head }}{{ sh.type }}{{ sh.device }}
{{ sh.subject }}
{{ sh.light }}
Every un-shot shot, grouped by the setting it needs — so one setup feeds every brand at once. {{ shoots.line.selText }}
Nothing waiting to be shot.
{{ st.setupId }}{{ st.setup }}
{{ bp.brandShort }}
{{ st.postCount }} posts · {{ st.shotCount }} shots {{ st.consentStr }}
{{ st.light }} · {{ st.wardrobe }}
{{ pp.brandShort }}{{ pp.title }}· {{ pp.shootName }}
Setting · {{ gp.backdrop }}{{ gp.count }} shots
#{{ sh.n }}
{{ sh.head }}{{ sh.type }}{{ sh.device }}
{{ sh.subject }}
{{ sh.light }}
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 }}

Import posts

Bring in the planned posts (and future CSV / JSON exports). Rows are checked against brand access before anything is created; each comes back with its real id.

or paste below · CSV needs a header row (brand, hook, caption, status, scheduled_date, pillar, format…)
{{ imp.error }}
{{ imp.total }} rows{{ imp.valid }} ready{{ imp.invalid }} will be skipped
{{ r.n }}{{ r.brand }}{{ r.hook }}{{ r.status }}{{ r.err }}
{{ imp.more }}
{{ imp.resultText }}

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.

Rules · what can be accepted in context
Review items can be accepted by an approver with a logged reason. Lock any of them up to a hard gate. The three locked items are fix-only, always.
{{ r.label }}
{{ r.label }}
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. Log the real meeting, check last cycle’s decisions, add the stats and the honest feedback — Chimp helps you write it up. Nothing runs until you submit.

Date
Attendees
Meeting notes
1 · Last meeting — did it work?
{{ intake.lastMonth }}{{ intake.lastDate }}
We decided
{{ x.text }}
On record: {{ intake.lastRecorded }}
Your verdict
No previous review yet — this meeting becomes the baseline.
2 · The stats
Follower trend this cycle
{{ t.brandShort }}
Top posts by DM shares / saves
3 · The feedback
Brand direction
What isn’t working we keep pretending is ★
New catchphrases coined
4 · Decisions accepted
{{ dc.text }}
Pivots you tick after the review are added here too. Mark them “taken” in the Meeting library once they’re done.
{{ intake.savedText }}
Tick “we had the meeting” to submit. The agent reviews, researches and diagnoses — then you decide. Never autopilot.
Think Tank · history

Meeting library

Every meeting’s minutes, stats and feedback, and the decisions accepted and taken.

{{ mlib.openCount }} accepted, still to do {{ mlib.takenCount }} taken
No meetings yet. Save one from Meeting Intake and it lands here.
{{ m.title }} {{ m.subline }}
{{ m.statusLabel }} {{ m.decCount }}
{{ m.preview }}
Minutes
{{ m.notes }}
Review of the previous meeting
{{ m.verdict }}
{{ m.lastNotes }}
Follower trend
{{ t.brandShort }}{{ t.v }}
Top posts
{{ m.topPosts }}
Brand direction
{{ m.direction }}
What isn’t working
{{ m.notWorking }}
Catchphrases coined
{{ m.catchphrases }}
Outcome next cycle
{{ m.outcome }}
Decisions
None recorded.
{{ d.label }} {{ d.text }} {{ d.meta }}

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
{{ hello }}
Chimp
{{ chimp.scopeText }}
Ask about posts, captions, shoots, campaigns or the calendar. Chimp drafts — you decide.
{{ m.content }}
Chimp is thinking…
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 }}