Read this before your next class โ†“

Get your web space in 60 seconds.

Whether you're uploading lecture notes or deploying a capstone project, this guide gets you from zero to live. Quicker than finding a seat in the library during finals week.


Installation

The BestSchoolUS CLI is a Node.js package. You need Node.js 18 or later installed on your machine. If you don't have Node.js, grab it from nodejs.org or use your OS package manager.

terminal
# Install the CLI globally
$ npm install -g @bestschoolus/cli
 
# Verify installation
$ bsu --version
@bestschoolus/cli 3.2.1
Alternative: If you prefer not to install globally, you can use npx @bestschoolus/cli to run any command without a global install. Or use pnpm / yarn โ€” we support all major package managers.

System requirements

RequirementMinimumRecommended
Node.js18.0.020.x LTS
npm8.0.010.x
OSmacOS, Linux, Windows (WSL recommended)
Disk space~25 MB for CLI + dependencies

Authentication

BestSchoolUS uses OAuth authentication through your browser. When you run bsu login, we open your default browser to our auth page where you sign in with your .edu email. The token is stored locally in ~/.bsu/credentials.json.

terminal
$ bsu login
Opening browser for authentication...
Waiting for callback...
 
โœ“ Authenticated as jchen@umich.edu
Token saved to ~/.bsu/credentials.json
Headless environments: If you're deploying from CI/CD or a machine without a browser, generate a deploy token in the dashboard under Settings โ†’ Tokens, then set the BSU_TOKEN environment variable.

Supported email providers

We accept any email ending in .edu, as well as verified K-12 school district domains (e.g., @students.fcps.edu, @pisd.edu, @naperville203.org). This covers most US universities, community colleges, high schools, and middle schools. International institutions and districts with non-standard domains can contact us for manual verification.

Your First Deploy

Let's deploy a simple HTML page. Create a folder, add an index.html file, and deploy it.

terminal
# Create a project directory
$ mkdir my-site && cd my-site
 
# Create a simple HTML file
$ echo '<h1>Hello from BestSchoolUS!</h1>' > index.html
 
# Initialize and deploy
$ bsu init
No framework detected โ€” deploying as static files
Project name: my-site
โœ“ Initialized
 
$ bsu deploy
Uploading 1 file (52 bytes)...
SSL: โœ“ CDN: โœ“
 
โœ“ Live at https://jchen.bestschoolus.com
Deployed in 1.8s ยท Build #1

That's it. Your site is live with HTTPS, served from a CDN. Subsequent deploys from the same directory will update the same project automatically.

Deploying a framework project

If you're using a framework like React, Vue, or Astro, the CLI detects it and runs your build command automatically:

~/react-portfolio
$ bsu init
Detected: React (Create React App)
Build: npm run build
Output: ./build
โœ“ Initialized
 
$ bsu deploy
Running: npm run build
Build completed in 8.2s
Uploading 34 files (1.7 MB)...
 
โœ“ Live at https://jchen-portfolio.bestschoolus.com

Configuration

Most projects need zero configuration. But if you need to customize build commands, output directories, redirects, or headers, create a bsu.json file in your project root.

bsu.json
{
"name": "my-portfolio",
"build": "npm run build",
"output": "./dist",
"headers": {
"/**": {
"X-Frame-Options": "DENY",
"X-Content-Type-Options": "nosniff"
}
},
"redirects": [
{ "from": "/old-page", "to": "/new-page", "status": 301 }
],
"routes": {
"/*": "/index.html"
}
}

Configuration options

FieldTypeDescription
namestringProject name (used for subdomain)
buildstringBuild command to run before uploading
outputstringDirectory containing built files (default: .)
headersobjectCustom response headers by path pattern
redirectsarrayURL redirect rules
routesobjectRewrite rules for SPA routing
envobjectBuild-time environment variables
ignorearrayGlob patterns for files to exclude from upload

Projects

A project is a collection of files served from a single domain. Each project has its own subdomain, deploy history, analytics, and team members. Free accounts can create up to 10 projects.

Projects are identified by name (lowercase alphanumeric + hyphens). The name maps to your subdomain: project my-portfolio becomes my-portfolio.bestschoolus.com.

Project lifecycle

  • Create โ€” bsu init creates a project and links it to your directory
  • Deploy โ€” bsu deploy pushes new files. Each deploy gets a unique build number
  • Update โ€” Change settings, domains, or team members via CLI or dashboard
  • Pause โ€” Temporarily take a project offline. Files are preserved but not served
  • Delete โ€” bsu rm permanently removes the project and all deploys

Deploys & Builds

Every time you run bsu deploy, we create an immutable snapshot of your files. This snapshot is assigned a sequential build number and pushed to the CDN. The previous build stays available for instant rollback.

Build process

  1. CLI runs your build command (if configured)
  2. Output files are hashed and diffed against the previous deploy
  3. Only changed files are uploaded (incremental uploads)
  4. CDN cache is invalidated for changed paths
  5. SSL certificate is verified/renewed if needed
  6. New build goes live atomically

The entire process typically takes 2โ€“8 seconds depending on project size and build complexity. We run builds on our infrastructure, not your machine, so build times are consistent regardless of your local hardware.

Preview deploys

Use bsu deploy --preview to create a preview URL without affecting your production site. Preview URLs look like preview-a3f2c1d.bestschoolus.com and expire after 7 days. Useful for sharing WIP with teammates or professors before going live.

Domains

See the Platform Features page for full details on custom domains and SSL. Quick summary:

  • Every project gets projectname.bestschoolus.com
  • Add custom domains with bsu domains add yourdomain.com
  • SSL certificates are automatic and free (Let's Encrypt)
  • Multiple domains can point to one project

File Hosting

Any file in your deployed directory is accessible via URL. This makes BestSchoolUS a great option for hosting research data, course materials, or any file you need a stable link for.

terminal
# Upload a directory of files
$ bsu deploy --dir ./research-data
 
Uploaded 6 files (14.2 MB)
 
Files available at:
/dataset-2026.csv 8.1 MB
/methodology.pdf 2.3 MB
/figures/fig1.png 840 KB
/figures/fig2.png 1.1 MB
/figures/fig3.png 920 KB
/README.md 4 KB

Git-based Deploys

Connect a GitHub or GitLab repository to your project for automatic deploys on push.

terminal
$ bsu git connect github.com/jchen/portfolio
Installing GitHub webhook...
โœ“ Connected to jchen/portfolio
Production branch: main
Branch previews: enabled

Once connected, every push to main triggers a production deploy. Pushes to other branches create preview deploys. You can customize which branches trigger deploys in your project settings.

Team Projects

Invite collaborators by email. Each team member needs a BestSchoolUS account (free).

terminal
$ bsu team add arahman@gatech.edu --role developer
โœ“ Invitation sent to arahman@gatech.edu
 
$ bsu team ls
maria@gatech.edu owner
jchen@gatech.edu developer
arahman@gatech.edu developer (pending)

Rollbacks

Every deploy is immutable. Roll back to any previous build instantly:

terminal
$ bsu deploys
#12 live 2 min ago 47 files 2.3 MB a3f2c1d
#11 4 hours ago 45 files 2.1 MB b7e4a90
#10 yesterday 44 files 2.0 MB c1d8f23
 
$ bsu rollback 11
โœ“ Rolled back to build #11
Completed in 0.8s

Rollbacks are instant because we don't rebuild โ€” we just point the CDN to a previous snapshot. Free plans retain the last 10 builds. Pro plans retain all builds indefinitely.

CLI Reference

CommandDescription
bsu loginAuthenticate via browser OAuth
bsu logoutClear stored credentials
bsu initInitialize new project in current directory
bsu deployBuild and deploy to production
bsu deploy --previewCreate a preview deploy
bsu lsList your projects
bsu logs [--follow]View or tail access logs
bsu domains add <domain>Add custom domain
bsu domains lsList domains for current project
bsu rollback <build>Roll back to a specific build
bsu deploysList deploy history
bsu team add <email>Invite team member
bsu team lsList team members
bsu env set KEY=VALUESet build environment variable
bsu git connect <repo>Connect GitHub/GitLab repo
bsu rmDelete current project
bsu openOpen project URL in browser

Limits & Quotas

ResourceFreeProDepartment
Storage5 GB50 GB200 GB
Bandwidth / month100 GB1 TB5 TB
Projects1050Unlimited
Custom domains1 per project10 per projectUnlimited
Team members per project315Unlimited
Max file size100 MB500 MB2 GB
Build timeout5 min15 min30 min
Deploy retention10 buildsUnlimitedUnlimited
Analytics retention90 days1 year2 years

FAQ

What happens when I graduate?

Your account stays active for 12 months after your .edu email stops working. After that, projects are paused (not deleted). You can reactivate by upgrading to a Pro plan or re-verifying with a new .edu email.

Can I use BestSchoolUS for a production app?

We're designed for static sites and files, not full-stack apps. If your app has a backend, you'll need to host that elsewhere and just use BSU for the frontend. That said, many students use BSU as their primary hosting with great results.

Is my content backed up?

Every deploy is stored in redundant object storage (3 copies across 2 regions). We also recommend keeping your source code in Git as an independent backup.

What's not allowed?

No malware, phishing, or illegal content. No crypto mining scripts. No sites that exist solely to game SEO. No hosting of copyrighted content you don't have rights to. See our Acceptable Use Policy for the full list.

How do you make money?

The free tier is funded by Pro and Department plan revenue plus university partnership agreements. We don't sell data, show ads, or inject anything into your sites.

Can I contribute?

The CLI is open source. Bug reports, feature requests, and pull requests are welcome on our GitHub. The platform itself is closed source but we publish our roadmap publicly.