Artist: Daryna Mikhailenko
English | Українська | Русский | Deutsch | Français | Español | Português | 日本語 | 中文
Boot.gs is a lightweight framework designed to help build structured Google Apps Script applications. It aims to bring familiar development patterns, such as decorators and dependency injection, to the Apps Script environment to aid in code organization.
Your controllers stay environment-agnostic: the same code handles doGet/doPost web requests, google.script.run
calls from sidebars and dialogs, and Google Workspace events such as onOpen or onEdit.
- Decorator-based Routing: Intuitive mapping of HTTP and Apps Script events (GET, POST, etc.).
- Spring Boot & NestJS Patterns: Familiar decorators like
@RequestMapping,@RestController,@ResponseBody, and theResponseEntityclass. - Flexible Responses: Full control over HTTP status codes, headers, and MIME types using
ResponseEntity. - Validation: Declarative parameter validation using Spring Boot-style decorators like
@Min,@Max,@Email, etc. - Pipes & Validation: Transform and validate incoming data with
@UsePipesand built-in pipes (e.g.,ParseNumberPipe). - Global Error Handling: Centralized exception management using
@ControllerAdviceand@ExceptionHandler. - Dependency Injection: Fully-featured DI for better decoupling and testability.
- Type Safety: Built with TypeScript for a robust development experience.
- Modern Architecture: Inspired by frameworks like NestJS and Spring Boot.
- A Google Apps Script project on the V8 runtime, typically managed locally with clasp.
- TypeScript with
experimentalDecoratorsandemitDecoratorMetadataenabled intsconfig.json. - Node.js
>=22.14.0and npm for installing and building.
Install the framework via npm:
npm install bootgsCreate a class to handle your application's logic. Decorators map methods to specific endpoints or events.
import {Get, RestController} from "bootgs";
@RestController("api/sheet")
export class SheetController {
/**
* Handles GET requests to /api/sheet/active-range
*/
@Get("active-range")
getActiveRange(): string {
return "This action returns the active sheet range.";
}
}Create an App instance and delegate the standard Apps Script entry points to it, so the framework can intercept and
route incoming events.
import {App} from "bootgs";
import {SheetController} from "./SheetController";
/**
* Global entry point for GET requests.
*/
export function doGet(event: GoogleAppsScript.Events.DoGet) {
const app = App.create({
controllers: [SheetController]
});
return app.doGet(event);
}The full walkthrough, including doPost and the asynchronous AsyncApp, is in the
Quick Start guide.
- Quick Start: synchronous
Appand asynchronousAsyncAppsetup. - Calling the API (Virtual Transport Layer): request parameters, MIME types,
google.script.runand Web App URL calls, response wrapping. - Decorators: class, method and parameter decorators, validation and built-in pipes.
- Controlling the Response:
ResponseEntityand@ResponseBody. - Advanced Examples: pipes and global error handling.
- AI Agent Skills: the full skill list and installation options.
- Boot.gs vs Spring Boot vs NestJS: architecture comparison.
Working with an AI coding agent (Claude Code, Gemini CLI, Cursor, etc.)? The bootgs/skills repository provides Agent Skills that teach it how to scaffold, structure, and validate Boot.gs applications, plus framework-agnostic skills for Google Apps Script development.
/plugin marketplace add bootgs/skills
/plugin install bootgs@bootgs-skillsSee AI Agent Skills for the full list and for Gemini CLI and npx skills installation.
Tip
For enhanced development with Google Apps Script, we recommend using @bootgs/utils, a collection of utility functions and classes that complement this framework.
We welcome contributions! Please see our Contributing Guidelines for details on our code of conduct, and the process for submitting pull requests. To report a vulnerability, follow the Security Policy.
Check out our Roadmap to see what we have planned for future releases.
For a detailed list of changes and updates, please refer to the CHANGELOG.
Questions and bug reports go to GitHub Issues. If the project helps you, you can support it via GitHub Sponsors or Buy Me a Coffee.
This project is licensed under the Apache-2.0 License.
⭐ Like this project? Give it a star on GitHub!

