🌐 Safe{Wallet} web app ・ 📱 Safe{Wallet} mobile app
Welcome to the Safe{Wallet} monorepo! Safe (formerly Gnosis Safe) is a multi-signature smart contract wallet for Ethereum and other EVM chains, requiring multiple signatures to execute transactions.
This repository houses both web and mobile applications along with shared packages, managed under a unified structure using Yarn Workspaces. The monorepo setup simplifies dependency management and ensures consistent development practices across projects.
- apps/web - Next.js web application
- apps/mobile - Expo/React Native mobile application
- packages/store - Shared Redux store used by both platforms
- packages/utils - Shared utilities and TypeScript types
- config/ - Shared configuration files
To get started, ensure you have the required tools installed and follow these steps:
- Node.js: Install the latest stable version from Node.js.
- Yarn: Use Yarn version 4.5.3 or later
to install it with the latest node version you can simply do
corepack enableand then just run
yarnThis will install the required version of yarn and resolve all dependencies.
Note
Corepack is a tool to help with managing versions of your package managers. It exposes binary proxies for each supported package manager that, when called, will identify whatever package manager is configured for the current project, download it if needed, and finally run it.
- Clone the repository:
git clone <repo-url>
cd monorepo- Install dependencies:
yarn install# Run web app in development mode
yarn workspace @safe-global/web dev
# Run mobile app in development mode
yarn workspace @safe-global/mobile start
# Run tests for web
yarn workspace @safe-global/web test
# Run Storybook for web
yarn workspace @safe-global/web storybookHere are some essential commands to help you navigate the monorepo:
- Run a script in a specific workspace:
yarn workspace <workspace-name> <script>Example:
yarn workspace @safe-global/web dev- Add a dependency to a specific workspace:
yarn workspace <workspace-name> add <package-name>- Remove a dependency from a specific workspace:
yarn workspace <workspace-name> remove <package-name>Note
Yarn treats commands that contain a colon as global commands. For example if you have a command in a workspace that has a colon and there isn't another workspace that has the same command, you can run the command without specifying the workspace name. For example:
yarn cypress:openis equivalent to:
yarn workspace @safe-global/web cypress:open- Run ESLint across all workspaces:
yarn lint- Run Prettier to check formatting:
yarn prettier- Run type-check for a workspace:
yarn workspace @safe-global/web type-check
yarn workspace @safe-global/mobile type-check- Run unit tests across all workspaces:
yarn test- Run E2E tests (web only):
yarn workspace @safe-global/web cypress:open # Interactive mode
yarn workspace @safe-global/web cypress:run # Headless mode- Create a new directory under
apps/orpackages/. - Add a
package.jsonfile with the appropriate configuration. - Run:
yarn install- Use Yarn Workspaces commands for managing dependencies.
- Ensure type-check, lint, prettier, and tests pass before pushing changes.
- Follow the semantic commit message guidelines.
- For AI contributors, see AGENTS.md for detailed guidelines.
- Husky: Pre-commit hooks for linting, formatting, and type-checking.
- ESLint & Prettier: Enforce coding standards and formatting.
- Jest: Unit testing framework.
- Cypress: E2E testing for the web app.
- Storybook: Component documentation and development for the web app.
- Expo: Mobile app framework for the
mobileworkspace. - Next.js: React framework for the
webworkspace. - Tamagui: UI component library for the mobile app.
For information on releasing the web app, see the Automated Release Procedure.
- Yarn Workspaces Documentation
- Expo Documentation
- Next.js Documentation
- Storybook Documentation
- Jest Documentation
- ESLint Documentation
- Prettier Documentation
- Safe Developer Docs
If you have any questions or run into issues, feel free to open a discussion or contact the maintainers. Happy coding! 🚀