Organisation deployment guide

This is the version for a team. Several people, each with their own Claude Code, sharing one set of brands, one library and one set of campaigns.

Setting it up for yourself alone? Use the single-person Deployment guide instead. It is simpler, and nothing on this page applies to you.

Three jobs, not one, usually done by different people. Jump to yours:

PartWho does itHow 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
⚠️ Part C is not optional, and it is the one people miss. Until your brands exist, nobody can start a campaign: the Studio stops with BLOCKED - Phase 0 incomplete. It happens once for everyone, so pick the person who knows the brand rather than the most technical person.

What everyone ends up with

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.

ON YOUR COMPUTER The Studio The product itself. You never edit it. folder: code Your work Campaigns, brands, ideas. You edit this. folder: data New versions, when you choose shared Your teammates Same two folders, their own computers. joined up automatically Everyone else at work reads a copy in SharePoint. Look, do not touch.
ℹ️ "Why two folders? Why not just one?" Because they change for completely different reasons. The Studio changes when a new version is released, which might be next month. Your work changes every day. Keeping them apart means taking a new version never disturbs a half-finished campaign, and your campaign never has to wait for a release.

You will not be managing these folders. You set them up once, and after that Claude Code handles the moving parts for you.
ℹ️ "Why not just put it all on SharePoint?" Word and Excel files merge when two people edit them at once. The Studio's files do not. SharePoint would quietly save a second copy called "Bob's conflicted copy", and the Studio would read that as a real, separate piece of work. So the shared folder underneath is built for this instead. Nobody has to learn it, and SharePoint is still where colleagues read the results.

Part A - Setting up the organisation

Done once, by whoever administers this. You do not need to understand the marketing side of the Studio to do it.

📋 What to line up before you start. You also need Git on your own machine for Part A. If 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.
ℹ️ Azure DevOps or GitHub, and SharePoint, are not alternatives to each other. They do two different jobs, and you may well end up with both:
What it is forWho opens it
Azure DevOps
or GitHub
Where the two folders actually live, so every person's machine stays in step with everyone else'sNobody, by hand. Claude Code uses it in the background
SharePointWhere colleagues read finished work and dashboards, without needing the StudioAnyone you share the library with
You cannot swap one for the other. SharePoint cannot safely hold the working files (see the note above about conflicted copies), and a repository is not something you would ask a colleague to browse.
⌨️ About the commands on this page. They are written for Windows PowerShell, which is what you get from the Start menu by typing PowerShell. They work unchanged in the macOS and Linux terminal too.

Run them one line at a time, pressing Enter after each. Do not join them 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.

Do this first, once on this machine. Git refuses to label a version until it knows who you are, and the error it gives is not obvious. Run these two lines now:
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.
Step A1 - Create the two repositories

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.

⚠️ Leave them completely empty. Do not add a README, a .gitignore or a licence. If you do, Step A2's upload is rejected as a conflict. An empty repository is the point: Step A2 fills it.

Now find each repository's clone address. You use them in Step A2 in a minute, and again every time somebody new joins.

📋 The clone address, not the address bar. They look similar and only one works.
  • Azure DevOps: the blue Clone button, top right of the Repos view. Copy the HTTPS value.
  • GitHub: the green < > Code button. Copy the HTTPS value.
It ends in .git. If what you copied does not end in .git, you have the web page address instead, and the commands below will not work.
💡 Do you need to write them down? Not really, but paste them somewhere for the next five minutes.
  • Right now: you need both, and the clipboard only holds one at a time. Paste them into Notepad, or anywhere scratch, so Step A2 is copy-and-paste rather than click-back-and-forth.
  • Long term: no need to store them. They are always on that same button, on the repository page, whenever you want them again.
  • Worth doing anyway: you will be sending these two addresses to every new person, so put them wherever your team keeps its joining notes, next to a link to this guide. That saves you looking them up each time.
These are not secrets. They are just addresses, and anyone without access to the repository cannot use them. Who can get in is controlled by the access you grant below, never by keeping the address quiet.

Access: everyone who will use the Studio needs write access to AI-marketing-studio-data and read access to AI-marketing-studio-code.

⚠️ Everyone in a deployment sees every brand. There is no per-brand permission boundary inside one deployment. If a brand must be hidden from someone, or you are bringing in an outside person who should not see everything, they need their own separate deployment. Decide this before you invite people, not after.
Step A2 - Download the Studio

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.

  1. Open github.com/abraun64/soundtrak-ai-studio-team.
  2. Click the green < > Code button, top right of the file list, then Download ZIP.
  3. The ZIP lands in your Downloads folder. Right-click it, choose Extract All, and extract into your own user folder, for example C:\Users\jsmith.
  4. Rename the extracted folder to exactly:
    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.

⚠️ Watch for the folder inside a folder. GitHub often extracts a folder inside a folder, like 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.
💡 Already running the single-person Studio and moving up to a team? Then do not download anything: build it from what you already have, so your existing brands and campaigns come across. On that machine, open PowerShell in your 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.
Step A3 - Upload the two folders

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.

⚠️ Do the identity lines at the top of this page first. If you have not, the commit below stops with "Author identity unknown", which does not explain itself.

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
ℹ️ You will see a long list of warnings saying "CRLF will be replaced by LF". That is normal and harmless. Git is standardising how line endings are stored so Windows, Mac and Linux machines all agree. Nothing is wrong and nothing is lost. There can be well over a hundred of these lines; scroll past them.

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.

✅ Check one thing now, or people will clone empty folders. On each repository's page, confirm the default branch reads main.
  • Azure DevOps: Repos then Branches. The default has a home icon beside it. To change: the ... menu on main, then Set as default branch.
  • GitHub: Settings then General then Default branch.
If it says anything else, change it to 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.

🏷️ What the 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.
🔁 How updates reach you later. New versions appear on the same GitHub page you downloaded from. You download the new ZIP, copy its code contents over a fresh copy of your code repository, commit, and label it with the next number:
  • v1.1.0 for something new
  • v1.0.1 for a fix
Your data repository is never touched by an update. Your campaigns and brands are yours and stay exactly where they are. Everyone is told the next time they sit down to work, and chooses their own moment to take it.
Step A4 - Turn on large-file storage

Campaigns 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.

💾 Check your plan covers it. LFS usage grows with headcount, because every person's first download pulls the media. Doing this now costs nothing; retrofitting it later means rewriting history and everyone re-downloading from scratch.
Step A5 - Set up the read-only pages (optional)

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.

🔁 Publishing cannot go backwards. The obvious worry with everybody publishing is that someone whose copy is a few days behind republishes old pages over newer ones, and the whole organisation watches the dashboards regress. That cannot happen. Every page records the date of the content it was built from, and is only ever replaced by something at least as new — a publish from someone out of date quietly does nothing instead.
❓ SharePoint and OneDrive are not the same thing, though one app syncs both. This trips people up, because the OneDrive client syncs your personal OneDrive, your work OneDrive and any SharePoint library, all through the same tray icon. "OneDrive is syncing" does not mean SharePoint is.
In File ExplorerWhat it isWho can read it
Blue cloud, OneDrive or OneDrive - YourOrgYour own storageOnly you
Building icon, named after your organisationA SharePoint libraryEveryone with access to that site
Publishing must go to the second one. Pointing it at your own OneDrive means colleagues cannot read any of it, which is the entire purpose.

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.

🔎 How to be sure a folder is really the synced one. Do not judge by where it is. In File Explorer, a synced folder shows a status column with cloud or green-tick icons beside each file; an ordinary local folder shows none. The mistake worth avoiding is creating a folder yourself and assuming it is connected: only the button on the library page makes the link, and a folder you made by hand will accept everything the Studio writes and show it to nobody.

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.

♻️ After that first run it looks after itself. On this machine only, the Studio republishes at the end of every session, so the pages your colleagues read stay current without anyone remembering to do anything. Unchanged pages are skipped, so it is quick and quiet.

Every published page carries its own "content last updated" line, so a reader can always see how current it is. If this machine is off for a week, colleagues see a week-old date rather than being quietly misled.

If the SharePoint library is ever un-synced or the folder renamed, the publisher machine says so loudly at the end of the session. Nobody downstream can detect that themselves, which is why it is reported here.

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.

Step A6 - Check one thing before you roll out widely

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.

⚠️ Worth doing before you promise anything. If hooks are blocked the Studio still works, but pages need a manual refresh instead of updating themselves. That is a fine trade-off if people know about it upfront, and an annoying surprise if they do not.
Step A7 - Push the five apps to everyone's machine

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.

Appwinget IDWhy
Claude CodeAnthropic.ClaudeCodeThe only interface your people use
Python 3.12Python.Python.3.12Runs the Studio. Must be on PATH, which a managed deployment gets right and a hand install often does not
GitGit.GitHow work reaches colleagues
Git LFSGitHub.GitLFSImages and video. Without it, media arrives as small text files
FFmpegGyan.FFmpegVideo 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
📦 Ship the optional ones anyway. FFmpeg is marked optional because a single person working alone can live without it. That logic does not survive contact with an organisation: you are building the package once for everybody, and leaving it out only means a marketer hits a missing-dependency error mid-campaign, on the day they first ship video. It cannot be installed by the Studio either, because it is system software rather than a Python package. If you skip it here, nobody gets it.

Playwright and its browser are deliberately not on this list. They are Python components, and the Studio installs them into each person's own Python during setup, which is where they belong.
🛡️ Do not send anyone a setup script. It is tempting to put a double-clickable installer on SharePoint so nobody has to think. Resist it. An unsigned script that installs software and clones repositories is indistinguishable from the attack it imitates, most Defender ASR rules block exactly that shape, and it teaches your staff to double-click executables from a shared drive. There is no need for one: Claude Code is already approved, installed and audited, and it runs the setup itself.
Step A8 - Hand it to your first person

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.

📌 The FIRST person you send this to has one extra job. Once they are through Part B, they set up your brands in Part C. Until that is done nobody can start a campaign, so pick someone who knows the brand rather than whoever is most technical. Everyone after them does Part B only.

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.

💡 Keep that message as a template. It is the same every time, apart from the name. Saving it where your team keeps joining notes is why the two addresses are worth writing down once.

Part B - Joining, for each person

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.

📋 Ask whoever set this up for two things before you start: And confirm they have granted you access, with the account you sign in to work with. Nothing below works until they have.
🔑 What access you need, and what you do not. Two different levels, and Admin is not one of them:
RepositoryYou needBecause
AI-marketing-studio-dataWrite
Azure DevOps: Contribute
Your campaigns and brand work save here and reach your colleagues
AI-marketing-studio-codeRead
Azure DevOps: Read
You only ever take new versions. Nothing you do is ever written back to it
Do not ask for Admin. Admin lets you delete the repository, rewrite its history and change who else has access, and the Studio never needs any of that. Granting it to every person is a risk with no upside.

You will not open a terminal, and you will not run any commands. You type ordinary sentences to Claude and it does the work.
Step B1 - Check you have the four apps

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.

AppWhat it is for
Claude CodeThe only thing you actually use. You type what you want, in plain English
PythonRuns the Studio behind the scenes. You will never open it
Git and Git LFSHow your work reaches your colleagues, including images and video
FFmpegVideo quality. Only matters if you produce video
🛡️ If any are missing, ask IT. Do not download and install them yourself, and be wary of anyone who sends you a file or a script that offers to do it for you. On a managed work computer, software comes from Company Portal.

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.

Step B2 - Ask Claude to set you up

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:

  1. Open Claude (the desktop app) and click the Code tab at the top.
  2. Choose Local, which means "run on my own computer", then click Select folder.
  3. Find your 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.
  4. If it asks whether to trust the files in this folder, say yes. It is an empty folder you just made yourself.

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:

ℹ️ About the prompts you will see. Your copy is pre-configured so Claude does not stop to ask permission for its own routine work. The one prompt you are sure to meet is the licence. Prefer to approve each step yourself? Press Shift+Tab to toggle that on and off.
🔐 You will be asked to sign in, once. Claude will warn you just before it happens. A window opens asking for GitHub or Azure DevOps: use the work account your access was granted to, never a personal one. Windows remembers it afterwards.

If a sign-in window ever appears that you were not expecting, close it and ask IT. That is good practice generally, not just here.
⚠️ 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.

Tell Claude you are seeing it and it will clear the saved account and try again.
Step B3 - Check what it tells you

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.

Step B4 - Move into your Studio folder

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 LocalSelect folder again, and this time choose Studio\code. Say yes if it asks about trusting the folder.

⚠️ This step is not optional, and it is easy to miss. Claude Code works inside one folder at a time. Everything that makes this the Studio rather than an ordinary chat, the campaign know-how, your dashboards, the automatic saving, only loads when code is the folder you have open. In the folder above it, nothing will happen and nothing will tell you why.

Your work still lives in data. You never open that folder yourself; the Studio writes to it for you.
Step B5 - Bookmark your Studio home, and start

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.

✅ You do not set up the brand. If you have seen the single-person guide, it ends by having you onboard your business. Skip that. In an organisation it is done once for everyone, not once per person, and re-running it would overwrite work your colleagues depend on. If a campaign ever stops with 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.

Part C - Set up your brands

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.

⚠️ Until this is done, campaigns will not start. Ask the Studio to begin one and it stops with a message like this:
[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.
ℹ️ Why this is not part of Part A. You set the brand up by talking to the Studio, so it needs a working install: it happens after the first person finishes Part B. But it is still an organisation-level job. One person does it once, it saves into the shared folder, and everyone who joins later inherits it without repeating anything.
Step C1 - Gather what you have

All optional. The more you bring, the sharper it starts, but nothing here blocks you and you can add the rest later.

Step C2 - Onboard your first brand

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.

🔁 Come back any time. Return to that Brand setup chat and say "update my brand". It asks only about what changed, never the whole thing again. The foundation is saved to your files, not to the chat, so even if the chat is lost your brand is safe and your colleagues already have it.
Step C3 - Add your other brands, if you have them

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.

💡 Anything genuinely shared between a parent and its sister brands, like a group tone-of-voice floor or common compliance wording, is better kept once in the central library and cited by each brand, rather than pasted into each one. Copies drift; a single cited source does not.
Step C4 - Now anyone can start a campaign

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.

Keeping it up to date

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.

WhatWhoHow often
1. New versions of the StudioAdministrator publishes, each person takes itWhen a release appears
2. The Studio's own improvementsAnyone can raise; one nominated owner decidesContinuous, reviewed monthly
3. Your brandsWhoever owns that brandWhen something real changes
4. Your librariesEveryone, all the timeWhenever you see something good

1. New versions of the Studio

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.

🔒 Your work is never involved. Upgrading replaces the Studio's code only. Your campaigns, brands and library live in the separate 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.

StageWhoWhat happens
1. Bring the version inAdministrator, 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 versionEach person, when they choose Ask Claude to update. Takes under a minute
For the administrator - publish a new version

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
⚠️ The version number must look exactly like 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.

Tag names come from whoever produced the release. Use theirs, so your version numbers still mean something when you compare notes.

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.

For each person - take a new version

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.

⏳ Finish what you are doing first. There is no technical need to wait, but a campaign is easier to reason about when the system underneath it did not change halfway through. Between campaigns is the natural moment.
👥 Agree a version as a team, and the Studio will tell you when you have not. Each person upgrades their own machine, so a team can drift onto different versions while sharing one set of campaigns.

Most of it is harmless: pages are built on each person's own machine, and records keep information a newer version added rather than discarding it. The part that is not harmless is invisible — every safety check lives in each person's own copy, so the protection your shared work actually has is that of the oldest version anyone is running. One person left behind can commit something into shared history that everybody else's machine would have refused, and shared history cannot be taken back.

The health check now reports this, so nobody has to notice it themselves: it names who is on what and gives whoever is behind the one command to catch up. Run python .claude/lib/operator_versions.py at any time to see the whole team.
If you seeWhat it meansWhat 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 doYou 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

2. Improving the Studio itself

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.

👤 Nominate one owner for this, and only one. The backlog is shared, so everybody's ideas land in the same place, which is the point. But deciding what gets done is a judgment call that goes wrong when several people do it independently: the same idea gets filed twice, two people build opposite things, and priority stops meaning anything. Capture is for everyone; triage is for one person.

Pick whoever cares most about how the team works, not the most technical person. It is a prioritisation job, not an engineering one.

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.

3. Keeping your brands current

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.

⚠️ This one is shared, and it is not locked. Campaigns can be claimed so two people cannot work on one at the same time. Brands cannot. An update changes what every future campaign inherits, so agree who owns each brand and say when you are about to change it. Two people refreshing the same brand in the same week will not corrupt anything, but they will quietly overwrite each other's judgment.

Worth doing after anything that changes the story: a repositioning, a new segment, a pricing change, an acquisition, a rebrand.

4. Growing your libraries

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.

LibraryWhat belongs in itSay
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.

💡 This is the cheapest habit with the biggest return. Both libraries feed directly into the work: the Best-Practice Library informs creative, the Insights Library informs strategy. A team of six adding one thing a week each builds something no individual could in a year. Say so when you onboard people, or it quietly becomes one person's hobby.

Working alongside other people

Three things are different from working alone. None of them need a command in normal use.

🔐 Claim a campaign before a long stretch of work on it. Two people editing the same campaign at once is the one thing that can genuinely lose work, because the last save wins. Claude Code warns you if you start changing a campaign someone else is holding, and tells you who and until when. Claims release themselves when you finish, and expire after 8 hours regardless, so a colleague who closes their laptop never blocks you until Monday.
⬆️ Take Studio updates between campaigns, not during one. You are pinned to a version, so nothing changes under you. When a newer one exists you are told, and can read exactly what changed before deciding. From your 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.
🚫 Never put a password, key or token in a file in the data folder. It is shared with everyone and it is permanent: it stays in the history even after you delete it. The Studio scans for this and will refuse to save. Keep those in a .env file, which is never shared.

What your colleagues see

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.

If something looks wrong

What you seeWhat it meansFix
[FAIL] python module: ... MISSINGBlocker. A library the Studio needs did not install during setupSay "fix my setup". Claude installs them for you
[WARN] playwright missing (optional)Ignorable. Only affects the small preview images on the gallery pageLeave it, or say "fix my setup"
[WARN] playwright: chromium not installedIgnorable. Different from the row above: the tool is installed but its browser is not, usually a download that was interruptedSay "fix my setup", or python -m playwright install chromium (~150 MB, once)
[WARN] publish target unsetIgnorable unless you publish to SharePoint. The read-only pages for colleagues without the Studio are switched offOptional. 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 fallbackAsk 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: UNSETYour name would not appear against your approvalsgit config --global user.email you@work.com
[FAIL] hooks not declaredCompany policy may be blocking the automatic page updatesTell whoever set this up. The Studio still works; pages need a manual refresh
[FAIL] DATA repo has NO remoteSetup was not finished, so nothing would reach your colleaguesAdministrator: finish Step A2
BLOCKED - Phase 0 incomplete when starting a campaignThe brand foundation does not exist yet. Not a faultSomeone completes Part C, once for the organisation
Pages look out of dateA refresh was missedpython .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 correctDo 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 StudioYour two folders were never connected. Not a fresh install, whatever it saysDo not accept Setup Studio. Say "finish my setup", or re-run Step B2
You cannot see any campaignsPointed at the wrong folderSay "my studio is pointed at the wrong folder"
Your two folders cloned but are emptyThe repository's default branch is not mainAdministrator: fix it on the repository page (Part A, Step A3), then clone again
Images arrive as small text filesLarge-file storage not switched on for youRun 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