Browse by type
This is HASH's public monorepo which contains our public code, docs, and other key resources.
HASH supports turning raw information into knowledge and process graphs, helping create graph-backed world models that power process automation, optimization, decision making, and AI. In essence, HASH is a self-building, open-source database which grows, structures and checks itself. Integrating data in (near-)realtime, it provides a powerful set of interfaces so that information can be understood and used in any context. Intelligent, autonomous agents can be deployed to grow, check, and maintain the database, collating and structuring information from the public internet — as well as your own connected private sources — in a standardized semantic form. Users, including those who are non-technical, are able to visually browse and manage both entities (data) and types (schemas). HASH acts as a source of truth for critical data, no matter its source, and provides a platform for high-trust, safety-assured decision-making. Read our blog post →
Many of HASH's features are unique to a platform of its kind, including its support for bitemporality, which provides first-order support for recording and querying both when something happened and, separately, when it became known. This capability is central to our support for better process modeling.
Instructions for using HASH can be found in the HASH Developer Docs.
Option 1. Use hash.ai — recommended (quick-start: <5 mins) 🚀
Create an account to get started.
Sign in to access your account.
When you first create an account you may be placed on a waitlist. To jump the queue, once signed in, follow the instructions shown in your HASH dashboard. All submissions are reviewed by a member of the team.
Option 2. Run HASH locally
These instructions set up HASH for working on the codebase — the app services run natively with hot-reload against containerised infrastructure. To run the whole stack from container images instead (no toolchain required on the host), follow the setup guide.
Install these on the host first:
Give Docker at least 8 GB RAM (Preferences → Resources) and keep ~15 GB of disk free for build artefacts, images and volumes.
Check your versions:
git --version # ≥ 2.17
docker --version # ≥ 20.10
docker compose version # ≥ 2.17
docker buildx version # ≥ 0.10
mise --version # ≥ 2026.4.22
sh
git clone https://github.com/hashintel/hash.git && cd hash
mise trust is required once per clone), then activate mise in your shell:sh
mise trust && mise install
sh
yarn install
.env.local in the repository root. Real keys are only needed for AI features — dummy values work otherwise:sh
OPENAI_API_KEY=dummy
ANTHROPIC_API_KEY=dummy
HASH_TEMPORAL_WORKER_AI_AWS_ACCESS_KEY_ID=dummy
HASH_TEMPORAL_WORKER_AI_AWS_SECRET_ACCESS_KEY=dummy
.env.local is git-ignored and overrides .env and .env.development. Don't edit the other .env files unless you mean to change the defaults.
sh
yarn compose up -d
This runs the dev and observability profiles — Postgres, Redis, Kratos, Hydra, Temporal, Vault and MinIO, plus the Grafana stack (http://localhost:3001) and the Temporal UI (http://localhost:3100/namespaces/HASH). The graph layer is not included; you run it as part of the app below.
sh
yarn start
For hot-reload on the api and frontend, run the graph and the app in separate terminals instead:
sh
yarn start:graph # terminal 1 — compiles and runs the graph
yarn dev # terminal 2 — api + frontend with hot-reload
The dev-mode API seeds three users (password password): alice@example.com, bob@example.com (regular) and admin@example.com (admin). Visit http://localhost:3000 once the API logs localhost:5001.
If you're not working on the graph itself, run it in Docker instead of compiling Rust locally — add the hgres profile and start only the api + frontend natively:
yarn compose --profile hgres up -d # infrastructure + graph in Docker
yarn dev # api + frontend only
If you need to run the browser plugin locally, see the README.md in the apps/plugin-browser directory.
If you need to reset the local database, to clear out test data or because it has become corrupted during development:
yarn compose down -v (this will take the Docker services down and drop the volumes)yarn compose up -d to start everything againEmail-sending in HASH is handled by either Kratos (in the case of authentication-related emails) or through the HASH API Email Transport (for everything else).
To use AwsSesEmailTransporter, set export HASH_EMAIL_TRANSPORTER=aws in your terminal before running the app, along with SYSTEM_EMAIL_ADDRESS and SYSTEM_EMAIL_SENDER_NAME (which control what address and name the email appears to be from). Valid AWS credentials are required for this email transporter to work.
Transactional emails templates are located in the following locations:
./infra/compose/kratos/templates/. This directory contains the following templates:recovery_code - Email templates for the account recovery flow using a code for the UI.valid template, otherwise the invalid template is used.verification_code - Email verification templates for the account registration flow using a code for the UI.valid template, otherwise the invalid template is used.apps/hash-api/src/email/index.tsOption 3. Deploying HASH to the cloud
See the self-hosting guide for running HASH on infrastructure you operate. The full Docker Compose topology — graph, API, frontend, auth, workflows, storage and observability — lives in infra/compose/ and is the starting point for a self-hosted deployment.
Discover ways to use HASH by browsing the use cases directory, or check out the Awesome HASH repository for more inspiration.
Browse the HASH development roadmap for more information about currently in-flight and upcoming features.
Repository structure
This repository's contents is divided across several primary sections:
/apps contains the primary code powering our runnable applications/blocks contains our public Block Protocol blocks/infra houses deployment scripts, utilities and other infrastructure useful in running our apps/libs contains libraries including npm packages and Rust crates/tests contains end-to-end and integration tests that span across one or more apps, blocks or libsEnvironment variables
Here's a list of possible environment variables. Everything that's necessary already has a default value.
You do not need to set any environment variables to run the application.
NODE_ENV: ("development" or "production") the runtime environment. Controls
default logging levels and output formatting.PORT: the port number the API will listen on.If you want to use AWS for file uploads or emails, you will need to have it configured:
AWS_REGION: The region, eg. us-east-1AWS_ACCESS_KEY_ID: Your AWS access keyAWS_SECRET_ACCESS_KEY: Your AWS secret keyAWS_S3_UPLOADS_BUCKET: The name of the bucket to use for file uploads (if you want to use S3 for file uploads), eg: my_uploads_bucketAWS_S3_UPLOADS_ACCESS_KEY_ID: (optional) the AWS access key ID to use for file uploads. Must be provided along with the secret access key if the API is not otherwise authorized to access the bucket (e.g. via an IAM role).AWS_S3_UPLOADS_SECRET_ACCESS_KEY: (optional) the AWS secret access key to use for file uploads.AWS_S3_UPLOADS_ENDPOINT: (optional) the endpoint to use for S3 operations. If not, the AWS S3 default for the given region is used. Useful if you are using a different S3-compatible storage provider.AWS_S3_UPLOADS_FORCE_PATH_STYLE: (optional) set true if your S3 setup requires path-style rather than virtual hosted-style S3 requests.For some in-browser functionality (e.g. document previewing), you must configure a Access-Control-Allow-Origin header on your bucket to be something other than '*'.
By default, files are uploaded locally, which is not recommended for production use. It is also possible to upload files on AWS S3.
FILE_UPLOAD_PROVIDER: Which type of provider is used for file uploads. Possible values LOCAL_FILE_SYSTEM, or AWS_S3. If choosing S3, then you need to configure the AWS_S3_UPLOADS_ variables above.LOCAL_FILE_UPLOAD_PATH: Relative path to store uploaded files if using the local file system storage provider. Default is var/uploads (the var folder is the folder normally used for application data)During development, the dummy email transporter writes emails to a local folder.
HASH_EMAIL_TRANSPORTER: dummy, aws, or smtp. If set to dummy, the local dummy email transporter will be used in development or test environments (it logs to the console).DUMMY_EMAIL_TRANSPORTER_FILE_PATH: Default is var/api/dummy-email-transporter/email-dumps.ymlSYSTEM_EMAIL_SENDER_NAME: the display name