Three jobs, not one, usually done by different people. Jump to yours:
| Part | Who does it | How long |
|---|---|---|
| Part A — Set up the organisation | Once, by whoever can create private repositories and push apps to staff machines | ~30 min |
| Part B — Join, for each person | Every person who will use the Studio. No technical knowledge needed | ~5 min each |
| Part C — Set up your brands | Once for the whole organisation, by someone who knows the brand — not necessarily whoever did Part A | ~30 min |
| Keeping it up to date | New versions, the Studio's own backlog, your brands, and your libraries — four jobs with four owners | — |
| If something looks wrong | Every message you might see, and what to do about it | — |
BLOCKED - Phase 0 incomplete. It happens once for everyone, so pick the person
who knows the brand rather than the most technical person.Each person who uses the Studio has two folders on their own computer. Everyone's work joins up automatically, and colleagues who do not use the Studio get a read-only copy to look at.
Done once, by whoever administers this. You do not need to understand the marketing side of the Studio to do it.
git --version in PowerShell does not answer, install it from
git-scm.com/downloads, accepting every default.
You do not need Python, or the Studio itself, unless you are taking the
single-person route in Step A2.| What it is for | Who opens it | |
|---|---|---|
| Azure DevOps or GitHub | Where the two folders actually live, so every person's machine stays in step with everyone else's | Nobody, by hand. Claude Code uses it in the background |
| SharePoint | Where colleagues read finished work and dashboards, without needing the Studio | Anyone you share the library with |
&&: Windows PowerShell does not accept it and will give you a parser error.
$HOME means your own user folder, for example
C:\Users\jsmith. You can paste it literally; PowerShell fills it in.
git config --global user.name "Your Name"
git config --global user.email "you@yourcompany.com"
Already used Git on this machine? These are almost certainly set. Running them
again does no harm.Do this first, so there is somewhere for the next step to put things. Create two empty private repositories, named exactly:
AI-marketing-studio-code
AI-marketing-studio-data
On Azure DevOps: open your project, then Repos in the left sidebar, then the repository dropdown at the top, then New repository. Set Repository name, leave Add a README unticked, and click Create. Repeat for the second name.
On GitHub: click + (top right), then New repository. Set Repository name, choose Private, leave Add a README file unticked, and click Create repository. Repeat for the second name.
Now find each repository's clone address. You use them in Step A2 in a minute, and again every time somebody new joins.
.git. If what you copied does not end in .git, you have the
web page address instead, and the commands below will not work.Access: everyone who will use the Studio needs write access to
AI-marketing-studio-data and read access to
AI-marketing-studio-code.
The whole thing is one folder of files on GitHub. You do not need a GitHub account, and nothing has to be installed to download it.
C:\Users\jsmith.deploy
so you end up with C:\Users\jsmith\deploy and the paths below match.Open deploy. You should see exactly two folders, side by side:
deploy\code
deploy\data
Open code and check you can see README.md, index.html, and
folders called docs and craft.
soundtrak-ai-studio-team-main\soundtrak-ai-studio-team-main\. You want the
inner one, the level where code and data sit directly
inside. If opening code just shows one more folder to click into, go up a level and
rename that one to deploy instead. Getting this right now prevents every
"it cannot find the folder" problem below.Marketing AI System
folder and run:
python .claude/lib/build_seed.py --out $HOME\deploy --profile team
That produces the same two folders at C:\Users\<you>\deploy. Then continue from
Step A3. It scans for anything that should not travel and refuses to produce a
deployment if it finds any. If it stops, that is the check working.This is the step that puts everything where your whole team can reach it. You are turning each folder into a repository and sending it up.
The code folder first. Open PowerShell in deploy and paste this whole block.
Replace <code clone address> with the first address from Step A1:
cd $HOME\deploy\code
git init
git add -A
git commit -m "Initial version"
git branch -M main
git tag -a v1.0.0 -m "Version 1.0.0"
git remote add origin <code clone address>
git push -u origin main
git push --tags
Then the data folder, the same way, with the second address. Note there is no version label here: labels apply to the Studio, not to your work.
cd $HOME\deploy\data
git init
git add -A
git commit -m "Initial version"
git branch -M main
git remote add origin <data clone address>
git push -u origin main
cd $HOME
You will be asked to sign in to your host the first time. Refresh both repository pages in your browser afterwards: where they were empty, you should now see files.
main.
main, then Set as default branch.main. Why it matters: when the default
does not match, everyone who follows Part B clones a folder that looks successful and is
completely empty, with no error worth reading. Thirty seconds here saves a very confusing
afternoon.That is where everything lives from now on. Every person who joins gets their own copy of
these two, and their work flows back here. You can now delete the deploy folder.
v1.0.0 label is for. It fixes everyone's Studio
to a known version, so a change never lands on somebody halfway through a campaign: they are told a
newer version exists, and take it when they are ready. git push --tags is what makes
the label visible to everyone else.code contents over a
fresh copy of your code repository, commit, and label it with the next number:
v1.1.0 for something newv1.0.1 for a fixCampaigns produce images and video. Those are stored using Git LFS, which the data repository is already set up to use from its first upload. You just need it switched on at the host, and installed on each machine.
Azure DevOps: LFS is on by default. Nothing to do.
GitHub: LFS is on by default for the repository. Check your plan's included storage and bandwidth under Settings then Billing and licensing.
On each machine (yours and everyone else's), Git LFS has to be installed once. Run:
git lfs install
If that says the command is not recognised, install it from git-lfs.com and run it again. Part B's health check tests for this, so people will be told if they have missed it.
Colleagues without Claude Code still need to see dashboards and finished work. Everyone who uses the Studio publishes to the same SharePoint library, so the pages stay current whoever happens to be working, rather than going stale because one person is away.
| In File Explorer | What it is | Who can read it |
|---|---|---|
Blue cloud, OneDrive or OneDrive - YourOrg | Your own storage | Only you |
| Building icon, named after your organisation | A SharePoint library | Everyone with access to that site |
First, create the library if you do not already have one. In SharePoint, go to the team site your marketing people can reach, choose New → Document library, and name it something obvious such as Marketing Studio. If a suitable library already exists, use that instead. Nothing to create, nothing to sync: this step is the one people skip, and then go looking for a folder that was never made.
Then put the library on each person's machine. Open it in a browser and click the one button in the toolbar that puts it on their computer. Depending on how new your tenant is that button says either Sync or Add shortcut to OneDrive — both do the same job here.
SharePoint lives on the web and the Studio writes to folders on a computer; this is what bridges the two. If neither button is there, syncing is switched off by policy and IT has to turn it on.
The library then appears in File Explorer as an ordinary folder, named after itself. It is
usually under your organisation's name or your work OneDrive, but it can be anywhere —
people often move their OneDrive somewhere shorter like C:\claude, and the folder
follows.
Open it and copy the address from the
bar at the top — that is the path you need below. Publishing writes a campaigns
folder and an index page, so point it at a subfolder such as
AI Studio dashboards rather than the top of a library other people use.
Then each person tells the Studio where to publish. In PowerShell, once per machine, replacing the path with the one you just copied:
[Environment]::SetEnvironmentVariable("MAS_PUBLISH_DIR", "C:\Users\jsmith\Contoso\Marketing Studio - Documents", "User")
Close PowerShell and open a new one, or the change will not be visible yet. Then, from the
code folder:
python .claude/lib/publish_surfaces.py
It prints how many pages it copied.
The normal OneDrive sync does the upload. No app registration and no admin consent needed. It only ever writes outward, so nothing anyone does in SharePoint can affect the real work.
The Studio keeps everyone's pages up to date automatically using a Claude Code feature called hooks. Some organisations apply a policy that blocks these.
Have one person do Part B on a real, managed company laptop and read their health check. It tests this directly and says so in plain language.
Deploy these through Intune, Company Portal, or however you normally distribute software. Every one is in the public winget repository, so no packaging work is needed.
| App | winget ID | Why |
|---|---|---|
| Claude Code | Anthropic.ClaudeCode | The only interface your people use |
| Python 3.12 | Python.Python.3.12 | Runs the Studio. Must be on PATH, which a managed deployment gets right and a hand install often does not |
| Git | Git.Git | How work reaches colleagues |
| Git LFS | GitHub.GitLFS | Images and video. Without it, media arrives as small text files |
| FFmpeg | Gyan.FFmpeg | Video quality. Ship it even though it is optional, see below |
A ready-made configuration file is in the code repository at
deploy/studio-prerequisites.winget.yaml. To try it on one machine first:
winget configure .\deploy\studio-prerequisites.winget.yaml
Part A is done. Everything after this is per-person, and you send them the same three things every time. Here is the whole message:
Subject: Setting up the AI Marketing Studio
The apps you need are already on your machine. Follow Part B
of the organisation deployment guide, which takes about five minutes and needs no technical
knowledge:
https://soundtrakconsulting.com/ai-studio/guide/org-deployment-guide#for-each-person
When it asks for the two addresses, use these:
code: [the AI-marketing-studio-code clone
address]
data: [the AI-marketing-studio-data clone
address]
You already have access. If the health check at the end says anything other than READY, send me what it printed.
Before you send it, confirm that person has write access to
AI-marketing-studio-data and read access to
AI-marketing-studio-code. Everything else in Part B is self-service.
About 5 minutes, once. You will not open a terminal, type a command, or install anything: you ask Claude, in a normal sentence, and it does the work.
AI-marketing-studio-code.git)AI-marketing-studio-data.git)| Repository | You need | Because |
|---|---|---|
AI-marketing-studio-data | Write Azure DevOps: Contribute | Your campaigns and brand work save here and reach your colleagues |
AI-marketing-studio-code | Read Azure DevOps: Read | You only ever take new versions. Nothing you do is ever written back to it |
Your IT team installs these for you. Open Company Portal from the Start menu and check for them, or just ask IT whether they have been pushed to your machine.
| App | What it is for |
|---|---|
| Claude Code | The only thing you actually use. You type what you want, in plain English |
| Python | Runs the Studio behind the scenes. You will never open it |
| Git and Git LFS | How your work reaches your colleagues, including images and video |
| FFmpeg | Video quality. Only matters if you produce video |
Then open Claude Code once, sign in when it opens your browser, type /model and
choose Opus. Use the desktop app, not the browser version: the browser one runs in
the cloud and cannot open folders on your computer.
Make an empty folder for the Studio. C:\Studio is a good choice, and it must
not be inside OneDrive.
Now open that folder in Claude Code:
Studio folder, click it once to highlight it, then click
Open. That picks the folder itself; you do not need to go inside it first.Then type this, pasting in the two addresses you were given:
Set up my studio. My code address is <code address>
and my data address is <data address>.
That is the whole of your setup. It is an ordinary sentence, not a command, and you cannot break anything by wording it differently. Claude does the rest and narrates as it goes:
Repository not found almost always means the wrong
account. It does not mean the repository is missing. The message is deliberately
vague, so that nobody can discover private repositories they are not allowed to see, and it
covers three different situations: wrong account signed in (usually a personal GitHub already
saved on the machine), access not granted yet, or a mistyped address.
Claude finishes by running a health check and explaining the result in plain English. You are looking for READY.
If anything is wrong it will say what, and whether it can fix it. Two things it cannot fix on your behalf, because they are not yours to fix:
You can re-run it whenever you like by saying "run the health check".
Every message the check can print, blocker or not, is listed in If something looks wrong at the end of this page.
Setup created two folders inside the one you chose: code and data.
From now on you always work in code, and this is a one-time switch.
Click + New to start a fresh chat, then Local → Select folder again, and
this time choose Studio\code. Say yes if it asks about trusting the folder.
code is the folder you have open. In the folder above it, nothing will happen and
nothing will tell you why.
data. You never open that folder
yourself; the Studio writes to it for you.Ask for your home page:
open my studio home
It is one page linking to your campaign dashboard, your system dashboard and the guides. Bookmark it. That single bookmark is your way back into everything, and the pages behind it update themselves as you work, so you only ever refresh.
Then say what you want:
what's awaiting me
Your work saves and reaches your colleagues automatically at the end of every session, with no action from you.
BLOCKED - Phase 0 incomplete, that is the signal nobody has done it yet: say so to
whoever set this up.The Operator guide takes it from here: how a campaign actually runs, stage by stage.
Once for the organisation, not once per person. Done by whoever knows the brand, which is usually a marketer rather than whoever did Part A.
[phase0-gate] acme: BLOCKED - Phase 0 incomplete
x no tenant baseline - tenant-brand/acme.yaml missing. Run Phase 0 first.
That is not a fault. Every campaign is built on your brand foundation, so the foundation has to
exist before there is anything to build on.All optional. The more you bring, the sharper it starts, but nothing here blocks you and you can add the rest later.
In Claude Code, press + New for a fresh chat, point it at your code folder,
and name the chat "Brand setup". You will come back to it.
Then type:
Onboard <your business name>
The Studio interviews you a few questions at a time and builds the foundation. Point it at your website and any public material and it uses them as source while it asks. Anything missing is marked to fill in later rather than blocking you.
If the organisation runs more than one brand, repeat Step C2 for each:
Onboard <sister brand name>
Each brand is independent: its own voice, segments, and compliance rules. A campaign belongs to exactly one of them, so work never bleeds between brands by accident.
The foundation reaches your colleagues the same way everything else does, at the end of the session. From then on, any of them can open Claude Code and say:
start a campaign: <what it is for>
People who join later never repeat Part C. They clone, provision, and the brand is already there.
Four different things go stale, on four different rhythms, and they are not the same job. Decide who owns each one now, while you are setting up, rather than discovering in six months that nobody did.
| What | Who | How often |
|---|---|---|
| 1. New versions of the Studio | Administrator publishes, each person takes it | When a release appears |
| 2. The Studio's own improvements | Anyone can raise; one nominated owner decides | Continuous, reviewed monthly |
| 3. Your brands | Whoever owns that brand | When something real changes |
| 4. Your libraries | Everyone, all the time | Whenever you see something good |
Nobody is ever upgraded without deciding to be. Each person's Studio sits on a pinned version, never a moving one, so the system cannot change underneath someone in the middle of a campaign. Taking a new version is always a deliberate act, and it can be undone.
data
repository and are not touched, read or rewritten by an upgrade.It happens in two stages, and the first one is easy to forget. Your organisation has its own copy of the Studio, so a new release does not appear for your people until an administrator puts it there.
| Stage | Who | What happens |
|---|---|---|
| 1. Bring the version in | Administrator, once per release | Download the new version, replace the code files, and publish it as a numbered release
in your AI-marketing-studio-code repository |
| 2. Take the version | Each person, when they choose | Ask Claude to update. Takes under a minute |
Same download as Step A2, then from inside your code folder, one line at a time.
Replace v1.2.0 with the version number you are publishing:
git add -A
git commit -m "Update to v1.2.0"
git tag -a v1.2.0 -m "v1.2.0"
git push
git push origin v1.2.0
v1.2.0.
Three numbers, with a leading v. Anything else is ignored entirely, and your people
will simply never be offered the update, with no error to tell you why.
Then tell your team it is available. Nothing notifies them automatically, by design: an upgrade that arrives unannounced is an upgrade that arrives mid-campaign.
In your code folder, say:
check for studio updates
You will be told which version you are on, whether a newer one exists, and what changed in it. Then, when you are ready:
update the studio
If you change your mind, say "roll back the studio" and you are returned to the version you were on before. That is the whole of it.
python .claude/lib/operator_versions.py at any time to see the whole team.| If you see | What it means | What to do |
|---|---|---|
| "refusing to update: working tree has N uncommitted change(s)" | Something in the code folder was edited. The Studio will not quietly discard it | Tell whoever set this up. Your own work is never in this folder, so this is unexpected and worth understanding rather than overriding |
| "no release tags found" | Stage 1 has not been done | Your administrator has not published a version yet |
| "already on version" | Nothing to do | You are current |
| Nothing appears, though a release exists | The version number was not in the v1.2.0 form, so it is invisible |
Administrator: re-publish it with a correctly formed number |
Separate from taking new versions, the Studio keeps its own to-do list: things your team wants it to do better. Anyone can add to it, in a sentence, the moment they notice something:
system idea: the weekly digest should show last week's numbers too
That files a proper record with the reasoning, so it is still useful in three months when whoever wrote it has forgotten. Ideas sit in an inbox until someone decides what to do with them.
The owner works through it by saying:
triage the inbox
what's on the system backlog
Once a quarter, or after anything goes noticeably wrong, they can also run a review of how the system itself is performing:
run a system retro
It produces actions, not just observations, and files them where they will actually be seen.
The brand foundation from Part C is not a one-off. Positioning shifts, segments change, a new proof point lands, someone finally writes down the tone of voice. Whoever owns that brand says:
update my brand
It only asks about what has changed. It checks what is already recorded and interviews you on the gaps, so it is safe to run any time and never makes you re-explain the whole business. It is the same workflow that set the brand up in the first place, which is why re-running it is normal rather than a repair.
Worth doing after anything that changes the story: a repositioning, a new segment, a pricing change, an acquisition, a rebrand.
Two libraries, both shared by the whole team, both of which get more valuable the more people feed them. There is no approval step and nothing to coordinate — adding is additive, so just add.
| Library | What belongs in it | Say |
|---|---|---|
| Best-Practice Library | Work worth learning from: a campaign that landed, an award winner, a competitor's execution, anything you would want to show someone | add this to my best-practice library |
| Insights Library | Evidence rather than craft: market data, behavioural science, a research paper, a category study | add this to my Insights Library |
Paste a link, or point at a file, with either phrase. The Studio reads the source, writes it up properly, and files it so it can be found later by what it is about rather than by who saved it.
Three things are different from working alone. None of them need a command in normal use.
code folder:
python .claude/lib/system_update.py --check
That only looks; it changes nothing. When you are ready:
python .claude/lib/system_update.py --apply
If an update causes a problem, python .claude/lib/system_update.py
--rollback puts you back on the previous version. Both refuse to run if you have unsaved
changes in the code folder, which you should not have: your work belongs in
data..env file, which is never
shared.People without Claude Code read a published copy of your dashboards and finished work, refreshed by one nominated machine (Part A, Step A5). It is read-only: editing anything there changes nothing, and the real version is always the one you work on.
| What you see | What it means | Fix |
|---|---|---|
[FAIL] python module: ... MISSING | Blocker. A library the Studio needs did not install during setup | Say "fix my setup". Claude installs them for you |
[WARN] playwright missing (optional) | Ignorable. Only affects the small preview images on the gallery page | Leave it, or say "fix my setup" |
[WARN] playwright: chromium not installed | Ignorable. Different from the row above: the tool is installed but its browser is not, usually a download that was interrupted | Say "fix my setup", or python -m playwright install chromium (~150 MB, once) |
[WARN] publish target unset | Ignorable unless you publish to SharePoint. The read-only pages for colleagues without the Studio are switched off | Optional. Administrator sets MAS_PUBLISH_DIR per Step A5, then you open a new terminal |
[WARN] ffmpeg (recommended) | Ignorable unless you ship video. Video still exports, slightly lower quality, via the built-in fallback | Ask IT to push FFmpeg from Company Portal (Step A7). Installing it yourself needs admin rights: winget install --id Gyan.FFmpeg -e, then open a new terminal |
| "python is not recognised" | Python is missing, or was installed without "Add Python to PATH" | Ask IT to deploy it from Company Portal, which sets this correctly |
[FAIL] operator identity: UNSET | Your name would not appear against your approvals | git config --global user.email you@work.com |
[FAIL] hooks not declared | Company policy may be blocking the automatic page updates | Tell whoever set this up. The Studio still works; pages need a manual refresh |
[FAIL] DATA repo has NO remote | Setup was not finished, so nothing would reach your colleagues | Administrator: finish Step A2 |
BLOCKED - Phase 0 incomplete when starting a campaign | The brand foundation does not exist yet. Not a fault | Someone completes Part C, once for the organisation |
| Pages look out of date | A refresh was missed | python .claude/lib/surface_freshness.py --heal |
| Windows Security: "your administrator is not allowing you to access content from …AppData…" | Git was installed per person instead of for the whole machine. Your company blocks programs running from personal folders, which is correct | Do not click Unblock — it is per file, and Git has hundreds. Ask IT to reinstall Git machine-wide (Step A7) |
| The Studio says it has not been set up, or offers to run Setup Studio | Your two folders were never connected. Not a fresh install, whatever it says | Do not accept Setup Studio. Say "finish my setup", or re-run Step B2 |
| You cannot see any campaigns | Pointed at the wrong folder | Say "my studio is pointed at the wrong folder" |
| Your two folders cloned but are empty | The repository's default branch is not main | Administrator: fix it on the repository page (Part A, Step A3), then clone again |
| Images arrive as small text files | Large-file storage not switched on for you | Run git lfs install, then get the data folder again |
| "Who has this campaign?" | - | python .claude/lib/campaign_claim.py --list |
| Something feels broken and you cannot place it | - | python .claude/skills/system-smoke-test/doctor.py |