Nous Research has added a Blank Slate setup mode to its open-source Hermes Agent. It inverts the usual onboarding. Instead of a fully loaded default, you start with almost nothing.
Hermes Agent is the self-improving agent framework from Nous Research. It runs on your own machine. The team announced the new mode on X. Blank Slate now joins two existing options: Quick Setup and Full Setup.
TL;DR
- Blank Slate boots an agent with everything off except provider & model, File Operations, and Terminal.
- Web, browser, code execution, vision, memory, delegation, cron, skills, plugins, and MCP stay disabled.
- It writes an explicit
platform_toolsets.clilist plusagent.disabled_toolsetsto pin the surface. - Nothing you skipped loads later — not even after
hermes update. - Re-enable anything with
hermes tools,hermes skills opt-in --sync, orhermes setup agent.
What is Blank Slate
On a fresh install, hermes setup now offers three modes. The choice sets your starting surface area.
- Quick Setup uses the Nous Portal. It needs no API keys and uses a free OAuth login. It sets up a model plus the Tool Gateway tools. The docs call it the recommended fast path.
- Full Setup is the opposite. You walk through every provider, tool, and option yourself. You bring your own keys.
- Blank Slate is the minimal third path. It is for building an agent from the ground up. Everything starts off except the bare minimum needed to run an agent. That minimum is three pieces: provider & model, the File Operations toolset, and the Terminal toolset.
The disabled list is explicit. Off by default: web, browser, code execution, vision, memory, delegation, cron, skills, plugins, and MCP servers. Compression, checkpoints, smart routing, and memory capture are also disabled.
The Two Paths After the Baseline
Blank Slate does not stop at the baseline. After the minimal baseline is applied, you choose one of two paths.
- The first path keeps everything disabled. You finish now with the minimal agent. You get file and terminal access, and nothing else.
- The second path walks through all configurations. You opt in to tools, skills, plugins, MCP, and messaging. You enable only what each workflow needs.
Pick Blank Slate when you want a minimal, fully-controlled agent. The point is to enable exactly what you need and no more.
Why the Config Format Matters
Blank Slate does not just toggle features at runtime. It writes the decision to disk.
The mode writes an explicit platform_toolsets.cli list. It also writes agent.disabled_toolsets. Together, these two keys pin your agent’s surface.
The effect is durable. Nothing you did not choose ever loads. That holds even after hermes update. An update cannot silently re-enable a toolset you left off.
Hermes also separates secrets from settings. Tokens live in ~/.hermes/.env. Non-secret settings live in ~/.hermes/config.yaml. The CLI routes each value to the correct file.
Setup Modes Compared
| Mode | Enabled by default | Keys / auth | Best for |
|---|---|---|---|
| Quick Setup (Nous Portal) | Model + Tool Gateway tools | Free OAuth, no API keys | Fastest first run |
| Full Setup | Every tool and option you pick | Bring your own keys | Hand-tuned, full control |
| Blank Slate | Provider & model, File Operations, Terminal | Provider auth only | Minimal, fully-controlled setups |
Use Cases With Examples
Three situations fit Blank Slate well:
- A security-sensitive deployment is the first. You want an agent with no web and no browser. Blank Slate ships file and terminal access only. Nothing reaches the network unless you add it.
- A reproducible team setup is the second. You pin one known toolset across every machine. Updates will not drift the configuration. New tools never appear without an explicit opt-in.
- A teaching or audit environment is the third. You start minimal and add one toolset at a time. Each capability becomes a deliberate choice.
Here is a minimal flow. Install, run setup, choose Blank Slate, then finish now.
curl -fsSL https://hermes-agent.nousresearch.com/install.sh | bash
source ~/.bashrc # or source ~/.zshrc
hermes setup # choose Blank Slate, then "finish now"
hermes # file + terminal onlyLater, add one capability when a task needs it.
hermes tools # re-enable a toolset, e.g. web
hermes skills opt-in --sync # seed skills on demand
hermes setup agent # tune compression, routing, memoryA Note for Local Setups
Hermes Agent requires a model with at least 64,000 tokens of context. Smaller windows are rejected at startup. Most hosted models meet this easily.
Local models need an explicit context size of 64K. For example, use --ctx-size 65536 for llama.cpp. A minimal Blank Slate agent on a local model still has to clear this floor.
Interactive Explainer
function esc(s){return s;}
function syncPath(){
var anyOn = ALL.some(function(x){return state[x.id];});
if(anyOn){ pWalk.classList.add(‘active’); pMin.classList.remove(‘active’); }
else { pMin.classList.add(‘active’); pWalk.classList.remove(‘active’); }
}
function render(){
// rows
ALL.forEach(function(x){
var row = listEl.querySelector(‘[data-id=”‘+x.id+'”]’);
if(state[x.id]) row.classList.add(‘on’); else row.classList.remove(‘on’);
});
// counts
var enabledTs = TOOLSETS.filter(function(t){return state[t.id];}).length;
var disabledTs = TOOLSETS.length – enabledTs;
document.getElementById(‘hbs-count’).textContent = (enabledTs)+’ enabled’;
document.getElementById(‘hbs-m-on’).textContent = 2 + enabledTs; // + baseline file_ops, terminal
document.getElementById(‘hbs-m-off’).textContent = disabledTs;
// build config
var cli = [‘file_operations’,’terminal’];
TOOLSETS.forEach(function(t){ if(state[t.id]) cli.push(t.id); });
var disabled = TOOLSETS.filter(function(t){return !state[t.id];}).map(function(t){return t.id;});
var lines = [];
lines.push(‘# Blank Slate writes these keys explicitly.‘);
lines.push(‘# Nothing else loads — even after `hermes update`.‘);
lines.push(”);
lines.push(‘model: nous-portal/hermes-4′);
lines.push(”);
lines.push(‘platform_toolsets:’);
lines.push(‘ cli:’);
cli.forEach(function(c){ lines.push(‘ – ‘+c+’‘); });
lines.push(”);
lines.push(‘agent:’);
lines.push(‘ disabled_toolsets:’);
if(disabled.length===0){
lines.push(‘ [] # all toolsets opted in‘);
} else {
disabled.forEach(function(d){ lines.push(‘ – ‘+d+’‘); });
}
SETTINGS.forEach(function(s){
var v = state[s.id] ? ‘on‘ : ‘off‘;
lines.push(‘ ‘+s.id+’: ‘+v);
});
document.getElementById(‘hbs-code’).innerHTML = lines.join(‘\n’);
postHeight();
}
// path buttons
var pMin = document.getElementById(‘hbs-p-min’);
var pWalk = document.getElementById(‘hbs-p-walk’);
pMin.addEventListener(‘click’, function(){
pMin.classList.add(‘active’); pWalk.classList.remove(‘active’);
ALL.forEach(function(x){state[x.id]=false;}); render();
});
pWalk.addEventListener(‘click’, function(){
pWalk.classList.add(‘active’); pMin.classList.remove(‘active’); render();
});
document.getElementById(‘hbs-reset’).addEventListener(‘click’, function(){
pMin.classList.add(‘active’); pWalk.classList.remove(‘active’);
ALL.forEach(function(x){state[x.id]=false;}); render();
});
document.getElementById(‘hbs-all’).addEventListener(‘click’, function(){
pWalk.classList.add(‘active’); pMin.classList.remove(‘active’);
ALL.forEach(function(x){state[x.id]=true;}); render();
});
// auto-resize for WordPress embed
function postHeight(){
try{
var h = root.offsetHeight + 40;
parent.postMessage({hbsHeight:h}, ‘*’);
}catch(e){}
}
window.addEventListener(‘load’, postHeight);
window.addEventListener(‘resize’, postHeight);
render();
})();
