# Getting Started

Build HakoRun from source, add the language runtimes, and upload and invoke your first function.

## Prerequisites

| Item | Requirement |
|------|-------------|
| Go | 1.25 or higher (`go.mod`) |
| OS | Linux: `bwrap`, `systemd-run`, and a working systemd user session; macOS: the built-in `sandbox-exec` |
| Python | `python3` |
| Node.js | `node` and `npm` |
| TypeScript | Global `tsx`, `typescript`, `esbuild`, plus a local `esbuild` in the project root |
| Redis | Only when built with `-tags redis` |

## Install

```bash
git clone https://github.com/pardnchiu/HakoRun.git
cd HakoRun
npm install -g tsx typescript esbuild
npm install esbuild
make build          # ToriiDB by default, outputs bin/hako
make build redis    # Redis storage instead
```

HakoRun resolves `internal/resource/wrapper.{py,js,ts}` against the working directory at startup, so start the binary from the project root; a standalone binary from `go install` cannot find the wrappers.

On Linux, when `node`, `tsc`, `esbuild`, or `python3` is missing at startup, HakoRun installs `bubblewrap`, `nodejs`, `npm`, and `python3` through `sudo` and `apt`/`dnf`/`pacman`/`apk`. Auto-install does not cover `tsc` or `esbuild`; install them first, or every startup re-triggers the install.

## Start

```bash
cp .env.example .env   # the Makefile loads .env
make run               # or ./bin/hako
```

The server listens on `:8080` by default and shuts down gracefully within 5 seconds on `SIGINT` or `SIGTERM`.

## First Function

Upload it, then call it by path:

```bash
curl --fail-with-body -X POST http://localhost:8080/upload \
  -H "Content-Type: application/json" \
  -d '{"path": "math/add", "language": "python", "code": "return event[\"a\"] + event[\"b\"]"}'

curl --fail-with-body -X POST http://localhost:8080/run/math/add \
  -H "Content-Type: application/json" \
  -d '{"input": "{\"a\": 3, \"b\": 5}"}'
```

The second request returns:

```json
{ "data": 8, "type": "number" }
```

## Related Pages

- [Configuration](/configuration)
- [Core Concepts](/core-concepts)
- [API Reference](/api-reference)
