Manage Bohrium projects via bohr CLI or open.bohrium.com API. Use when: user asks about creating/listing/deleting projects on Bohrium, managing project membe...
---
name: bohrium-project
description: "Manage Bohrium projects via bohr CLI or open.bohrium.com API. Use when: user asks about creating/listing/deleting projects on Bohrium, managing project members, or setting cost limits. NOT for: job submission, node management, or image management."
---
# SKILL: Bohrium Project Management
## Overview
Manage projects on the Bohrium platform. **Prefer `bohr` CLI**; fall back to the API only for operations the CLI doesn't support (member management, cost limits, renaming).
Projects are the organizational containers for Nodes, Jobs, Images, and Datasets — and the basic unit for team collaboration and cost management.
## Authentication
```json
"bohrium-project": {
"enabled": true,
"apiKey": "YOUR_ACCESS_KEY",
"env": {
"ACCESS_KEY": "YOUR_ACCESS_KEY"
}
}
```
## Prerequisites: Install bohr CLI
```bash
# macOS
/bin/bash -c "$(curl -fsSL https://dp-public.oss-cn-beijing.aliyuncs.com/bohrctl/1.0.0/install_bohr_mac_curl.sh)"
# Linux
/bin/bash -c "$(curl -fsSL https://dp-public.oss-cn-beijing.aliyuncs.com/bohrctl/1.0.0/install_bohr_linux_curl.sh)"
source ~/.bashrc # or source ~/.zshrc
export PATH="$HOME/.bohrium:$PATH"
```
---
## List Projects
```bash
bohr project list # Table format
bohr project list --json # JSON format
bohr project list --csv # CSV format
```
**JSON fields:**
| Field | Description |
|-------|-------------|
| `projectId` | Project ID |
| `name` | Project name |
---
## Create Project
```bash
bohr project create -n "my-experiment"
bohr project create -n "my-experiment" -m 5000 # Monthly cost limit
bohr project create -n "my-experiment" -t 10000 # Total cost limit
```
**Parameters:**
| Parameter | Short | Required | Description |
|-----------|-------|----------|-------------|
| `--name` | `-n` | Yes | Project name (default "default") |
| `--month_cost_limit` | `-m` | No | Monthly cost limit |
| `--total_cost_limit` | `-t` | No | Total cost limit |
---
## Delete Project
```bash
bohr project delete 154
```
> **Warning**: Deleting a project is **irreversible** — all jobs and images under the project will be removed and cannot be recovered.
---
## Roles & Permissions
Bohrium projects have 3 roles:
| Role | Description |
|------|-------------|
| Creator | The user who created the project; exactly one per project, non-transferable |
| Admin | Appointed by the creator; can have multiple; can be revoked at any time |
| Member | Users added to the project; default role |
### Permission Matrix
| Module | Permission | Creator | Admin | Member |
|--------|-----------|:-------:|:-----:|:------:|
| Project | Rename project | ✓ | ✓ | ✗ |
| Project | Delete project | ✓ | ✗ | ✗ |
| Members | Add/remove members | ✓ | ✓ | ✗ |
| Members | Promote/demote admins | ✓ | ✗ | ✗ |
| Budget | View/adjust project & member budgets | ✓ | ✓ | ✗ |
| Nodes | View/manage all project nodes | ✓ | ✓ | ✗ |
| Jobs | View/manage all project jobs | ✓ | ✓ | ✗ |
| Images | View/manage all project images | ✓ | ✓ | ✗ |
| Billing | View/download billing reports | ✓ | ✓ | ✗ |
> **Important**: Costs incurred by members are charged directly to the project creator's wallet balance.
---
## Budget Management
### Project Budget
Creators and admins can set the project's total budget (optional). If not set, the default is "unlimited".
When the project's total cost exceeds the budget, members cannot submit new jobs or start new nodes.
### Member Budget
Individual spending limits can be assigned per member:
- "Even split": Divide the project budget equally among all members
- "Uniform": Set the same limit for each member
- Manual: Set different limits for different members
Set project cost limit via API:
```python
requests.post(f"{BASE}/set_cost_limit", headers=HEADERS_JSON,
json={"projectId": 154, "costLimit": 5000})
```
---
## Shared Resources
### Shared Disk (/share)
Each project has 1TB of free shared storage with read/write access for all members.
- Access the `/share` directory via Web Shell or the file management page
- Data persists after node release
- Additional capacity can be purchased
### Shared Images
All project members can see custom images created by other members in the Bohrium Image Center, making it easy to share development environments.
---
## Billing
| Item | Description |
|------|-------------|
| Compute resources | Billed by duration of resource usage; prices vary by configuration |
| Dev nodes | Billed continuously while running; stop or delete when not in use |
| Personal storage (/personal) | 500GB free; additional capacity requires purchase |
| Project storage (/share) | 1TB free; additional capacity requires purchase |
- Account balance is deducted every 5 minutes
- Warning email sent when balance drops below threshold (default ¥100)
- Cannot submit new jobs when balance reaches zero
---
## Quotas
| Resource | Limit |
|----------|-------|
| Projects | 4 per user (only self-created; joined projects don't count) |
| Nodes | 4 per user per project |
| Concurrent running jobs | 100 per user |
| Custom images | 10 per project |
| Project shared disk | 1TB per project |
| Personal data disk | 500GB per user per project |
> Contact Bohrium support to increase quotas.
---
## API Supplement (CLI Unsupported)
The following operations are not covered by the bohr CLI and require the API:
```python
import os, requests
AK = os.environ.get("ACCESS_KEY", "")
BASE = "https://open.bohrium.com/openapi/v1/project"
HEADERS = {"accessKey": AK}
HEADERS_JSON = {**HEADERS, "Content-Type": "application/json"}
# Detailed project list (with cost, member count, etc.)
r = requests.get(f"{BASE}/list", headers=HEADERS)
# Returns: {items: [{id, name, totalCost, monthCost, userCount, projectRole, ...}]}
# Lightweight project list (id + name only)
r = requests.get(f"{BASE}/lite_list", headers=HEADERS)
# Rename project
requests.post(f"{BASE}/set_name", headers=HEADERS_JSON,
json={"projectId": 154, "name": "new-name"})
# Set cost limit
requests.post(f"{BASE}/set_cost_limit", headers=HEADERS_JSON,
json={"projectId": 154, "costLimit": 5000})
# View project members
r = requests.get(f"{BASE}/154/users", headers=HEADERS)
# Returns: {items: [{userId, userName, email, projectRole, cost, ...}]}
# Add member (by email)
requests.post(f"{BASE}/add_user", headers=HEADERS_JSON,
json={"projectId": 154, "email": "user@example.com"})
# Remove member
requests.post(f"{BASE}/del_user", headers=HEADERS_JSON,
json={"projectId": 154, "userId": 12345})
# Promote/demote admin
requests.post(f"{BASE}/manager/add", headers=HEADERS_JSON,
json={"projectId": 154, "userId": 12345})
requests.post(f"{BASE}/manager/del", headers=HEADERS_JSON,
json={"projectId": 154, "userId": 12345})
# Recover deleted member
requests.put(f"{BASE}/154/recovery_user", headers=HEADERS_JSON,
json={"userId": 12345})
```
### Project Role API Values
| projectRole | Meaning |
|-------------|---------|
| 1 | Creator / Admin |
| 3 | Regular member |
---
## Unavailable Endpoints
The following endpoints are **not accessible** via openapi accessKey (return 404):
| Endpoint | Reason |
|----------|--------|
| `POST /project/join` | Route forwarding path mismatch |
| `POST /project/share_status` | Same |
| `GET /project/available` | Registered in AK v2 Group; unreachable via v1 accessKey |
## Troubleshooting
| Problem | Cause | Solution |
|---------|-------|----------|
| Can't find newly created project | New project is at end of list | `bohr project list --json` to see all |
| Failed to remove member | Wrong userId | Get userId via API `/{id}/users` first |
| Adding member has no effect | Email doesn't exist | Ensure target user is registered on Bohrium |
| Project count limit reached | Max 4 self-created projects per user | Delete unused projects or contact support |
| Member can't submit jobs | Project or member budget exceeded | Creator/admin adjusts budget |
| Insufficient balance | Account balance is zero | Top up to resume usage |
don't have the plugin yet? install it then click "run inline in claude" again.
by @clawhub
reorganized raw documentation into implexa's 6-component structure, separated bohr CLI from API workflows, made decision logic explicit (role-based permission checks, budget allocation strategies, auth failures, member addition edge cases), added rate limiting and network timeout edge cases, documented all external inputs (accessKey env var, project/user IDs, member emails), and clarified output contracts (HTTP status codes, JSON response shapes, success signals per operation).
manage projects on the bohrium platform, the organizational containers for nodes, jobs, images, and datasets. use this skill when a user asks to create, list, delete, or rename projects; manage project members and their roles; or set cost limits and budgets. prefer the bohr CLI for basic operations (create, list, delete); fall back to the API only for advanced operations the CLI doesn't support (member management, cost limits, renaming). projects are the basic unit for team collaboration and cost management on bohrium.
bohr CLI (preferred for basic operations):
~/.bashrc or ~/.zshrc after install.API-based operations (for member management, renaming, budget adjustments):
ACCESS_KEY environment variable or apiKey in config. obtain from bohrium account settings at open.bohrium.com.https://open.bohrium.com/openapi/v1/project{"accessKey": YOUR_ACCESS_KEY, "Content-Type": "application/json"} for POST/PUT; {"accessKey": YOUR_ACCESS_KEY} for GET.context:
bohr project list to list projects in table format, or bohr project list --json for JSON format, or bohr project list --csv for CSV format.items: [{projectId, name, ...}].bohr project create -n "project-name" to create a project with no cost limits (default "unlimited").-m <amount> to set a monthly cost limit, e.g. bohr project create -n "my-experiment" -m 5000.-t <amount> to set a total cost limit, e.g. bohr project create -n "my-experiment" -t 10000.bohr project delete <projectId>, e.g. bohr project delete 154.POST https://open.bohrium.com/openapi/v1/project/set_name with JSON body {"projectId": 154, "name": "new-name"} and headers {"accessKey": YOUR_ACCESS_KEY, "Content-Type": "application/json"}.GET https://open.bohrium.com/openapi/v1/project/{projectId}/users with headers {"accessKey": YOUR_ACCESS_KEY}.{items: [{userId, userName, email, projectRole, cost, ...}]} where projectRole 1 = creator/admin, 3 = regular member.POST https://open.bohrium.com/openapi/v1/project/add_user with JSON body {"projectId": 154, "email": "user@example.com"} and headers {"accessKey": YOUR_ACCESS_KEY, "Content-Type": "application/json"}.GET /{projectId}/users if not known.POST https://open.bohrium.com/openapi/v1/project/del_user with JSON body {"projectId": 154, "userId": 12345} and headers {"accessKey": YOUR_ACCESS_KEY, "Content-Type": "application/json"}.GET /{projectId}/users.POST https://open.bohrium.com/openapi/v1/project/manager/add with JSON body {"projectId": 154, "userId": 12345} and headers {"accessKey": YOUR_ACCESS_KEY, "Content-Type": "application/json"}.GET /{projectId}/users.POST https://open.bohrium.com/openapi/v1/project/manager/del with JSON body {"projectId": 154, "userId": 12345} and headers {"accessKey": YOUR_ACCESS_KEY, "Content-Type": "application/json"}.POST https://open.bohrium.com/openapi/v1/project/set_cost_limit with JSON body {"projectId": 154, "costLimit": 5000} and headers {"accessKey": YOUR_ACCESS_KEY, "Content-Type": "application/json"}.GET https://open.bohrium.com/openapi/v1/project/list with headers {"accessKey": YOUR_ACCESS_KEY}.{items: [{id, name, totalCost, monthCost, userCount, projectRole, ...}]}.PUT https://open.bohrium.com/openapi/v1/project/{projectId}/recovery_user with JSON body {"userId": 12345} and headers {"accessKey": YOUR_ACCESS_KEY, "Content-Type": "application/json"}.use bohr CLI vs. API:
member operation permission checks:
project creation with cost limits:
-m <amount> flag.-t <amount> flag.-m <amount> and -t <amount> flags.project member budget allocation:
API authentication failure:
member addition edge cases:
GET /{projectId}/users.project deletion irreversibility:
rate limiting and network errors:
cost tracking:
quota enforcement:
bohr CLI operations (list, create, delete):
{items: [{projectId, name, ...}]} for list; plain projectId for create; null/empty for delete.API operations (all):
items array or error message.{items: [{id: 154, name: "my-experiment", totalCost: 1200.50, monthCost: 150.25, userCount: 3, projectRole: 1, ...}]}.{success: true} or empty object {}.file location/persistence:
user knows operation succeeded when:
list projects: CLI prints table/JSON/CSV showing all user's projects with correct names and IDs. if no projects exist, output is empty table or empty items array.
create project: CLI prints success message with new projectId. newly created project appears in subsequent bohr project list output. project can be accessed at open.bohrium.com dashboard.
delete project: CLI prompts for confirmation, then prints "project deleted" or similar. project no longer appears in project list. if user attempts to access deleted project via API, request returns 404.
rename project: API returns HTTP 200. project name is updated in project list (run bohr project list --json to verify new name).
add member: API returns HTTP 200. new member appears in GET /{projectId}/users response. new member can log in to bohrium and see project in their project list.
remove member: API returns HTTP 200. removed member no longer appears in GET /{projectId}/users response. if member tries to access project, they receive access denied error.
promote/demote admin: API returns HTTP 200. member's projectRole field in GET /{projectId}/users changes from 3 (member) to 1 (admin) or vice versa. admin gains or loses ability to add/remove members.
set cost limit: API returns HTTP 200. subsequent attempts by members to submit jobs or start nodes when project cost exceeds limit will be rejected with "budget exceeded" error.
recover deleted member: API returns HTTP 200. deleted member reappears in GET /{projectId}/users and can access project resources again.
edge case signals:
if API returns 404 for a request: projectId does not exist, or v1 accessKey is not registered for that endpoint (see unavailable endpoints section).
if API returns 401/403: accessKey is missing, invalid, or lacks permissions for the operation.
if member add has no effect but API returns 200: target email does not exist; verify by calling GET /{projectId}/users and confirm email is missing.
if project list is very long and newly created project is not visible: scroll to end of list; newly created project is appended to end.
if delete project fails: user is not the creator, or project has unfinished jobs (unconfirmed; contact bohrium support if blocking issue occurs).
| role | can create | can delete | can rename | can manage members | can adjust budget | can manage nodes/jobs/images |
|---|---|---|---|---|---|---|
| creator | n/a | yes | yes | yes | yes | yes |
| admin | no | no | no | yes | yes | yes |
| member | no | no | no | no | no | no |
costs incurred by members are charged to the project creator's account balance, not member accounts.
| resource | limit |
|---|---|
| self-created projects per user | 4 |
| nodes per user per project | 4 |
| concurrent running jobs per user | 100 |
| custom images per project | 10 |
| project shared disk (/share) | 1TB free; additional capacity purchasable |
| personal data disk (/personal) per user per project | 500GB free; additional capacity purchasable |
contact bohrium support to increase quotas.
| item | pricing model |
|---|---|
| compute resources | billed by duration; prices vary by node configuration (CPU, memory, GPU) |
| dev nodes | billed continuously while running; stop or delete when not in use |
| personal storage (/personal) | 500GB free per user per project; overage charged per GB per month |
| project shared storage (/share) | 1TB free per project; overage charged per GB per month |
account balance is deducted every 5 minutes. warning email sent when balance drops below threshold (default ¥100). no new jobs can be submitted when balance reaches zero.
shared disk (/share):
shared images:
the following endpoints return 404 or are otherwise inaccessible via openapi accessKey (v1):
| endpoint | reason |
|---|---|
POST /project/join |
route forwarding path mismatch |
POST /project/share_status |
route forwarding path mismatch |
GET /project/available |
registered in accessKey v2 group only; unreachable via v1 accessKey |
| problem | likely cause | solution |
|---|---|---|
| bohr CLI command not found | bohr CLI not installed or PATH not updated | run installation script (macOS or Linux) and source ~/.bashrc or ~/.zshrc |
| can't find newly created project in list | new project appended to end of list | run bohr project list --json and search for project name, or scroll to end of table output |
| API returns 401 or 403 | accessKey missing, invalid, or not in request headers | verify ACCESS_KEY env var is set; obtain new key from open.bohrium.com account settings if needed |
| API returns 404 | projectId doesn't exist, or endpoint is unsupported by accessKey v1 | confirm projectId is numeric and exists; check unavailable endpoints table |
| adding member has no effect but API returns 200 | target email not registered on bohrium | verify email is correct and registered on open.bohrium.com; call GET /{projectId}/users to confirm member was not added |
| can't remove member | wrong userId, or user is not creator/admin | get correct userId via GET /{projectId}/users; confirm your role is creator or admin |
| project deletion failed | user is not creator | only creators can delete projects; admins and members cannot |
| member can't submit jobs | project or member budget exceeded, or insufficient account balance | creator/admin adjusts budget via POST /set_cost_limit; creator tops up account balance at open.bohrium.com |
| can't promote/demote admin | user is not creator | only creators can manage admin roles; admins cannot promote/demote other admins |
| project count limit reached (max 4) | user has already self-created 4 projects | delete unused projects or contact bohrium support to request quota increase |
| API calls timeout or fail intermittently | network issue or bohrium service overload | retry with exponential backoff (1s, 2s, 4s); check bohrium status page |
source: clawhub (bohrium project management documentation)