{
  "markdown": "\n[![CI](https://github.com/haru/sealion/actions/workflows/ci.yml/badge.svg)](https://github.com/haru/sealion/actions/workflows/ci.yml)\n[![Maintainability](https://qlty.sh/badges/14808c46-bf1a-4aaa-b3cc-788ee066fd9c/maintainability.svg)](https://qlty.sh/gh/haru/projects/sealion)\n[![codecov](https://codecov.io/gh/haru/sealion/graph/badge.svg?token=6bvf18kWxq)](https://codecov.io/gh/haru/sealion)\n[![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/haru/sealion)\n\n# Sealion\n\n<p align=\"center\">\n  <img src=\"public/sealion.svg\" alt=\"Sealion\" width=\"120\" /><br/>\n  <b>All Your TODOs, One Place.</b>\n</p>\n\n\n**Sealion is a self-hosted web app that aggregates issues from multiple issue trackers into a single TODO list.**\n\nIt collects all issues assigned to you into one unified view so you can focus on getting things done.\n\n[日本語](README.ja.md)\n\n![image](https://github.com/user-attachments/assets/557aae6d-8703-40fd-bda6-98ef5aa9fbb0)\n\n## Supported Issue Trackers\n\nThe following issue trackers are currently supported:\n\n- GitHub\n- GitLab\n- Jira\n- Redmine\n- Linear\n- Asana\n- Trello\n- Backlog\n\n---\n\n## Features\n\n| Feature | Description |\n|---------|-------------|\n| **Unified TODO list** | Automatically fetches and displays issues from each tracker in one place |\n| **Today's Tasks** | Drag and drop issues into your daily plan |\n| **Pin important tasks** | Pin tasks to the top of your list |\n| **Complete tasks** | Mark an issue as done and it closes in the source tracker too (with optional comment) |\n| **Multiple connections** | Connect multiple instances of the same service (e.g. work Redmine + client Redmine) |\n| **Project selection** | Choose which projects/repos to sync per connection |\n| **Board customization** | Configure which fields to show and how to sort your list |\n| **Multi-user** | Each user manages their own connections, projects, and TODO list |\n| **External authentication (OIDC / OAuth2)** | Sign in with Google / GitHub / Microsoft Entra ID / generic OIDC, in addition to local username & password |\n| **Internationalization** | English and Japanese UI |\n| **Encrypted credentials** | API tokens are stored encrypted with AES-256-GCM |\n\n---\n\n## Requirements\n\nAn environment where docker compose is available\n\n---\n\n## Installation\n\n### Create docker-compose.yml\n\nCreate a directory of your choice (e.g. `~/sealion`) and save a `docker-compose.yml` with the following content:\n\n```yaml\nname: sealion\n\nservices:\n  sealion:\n    image: haru/sealion\n    environment:\n      DATABASE_URL: \"postgresql://${POSTGRES_USER:-postgres}:${POSTGRES_PASSWORD:-password}@db:5432/${POSTGRES_DB:-sealion_dev}\"\n      AUTH_SECRET: \"${AUTH_SECRET}\"\n      AUTH_URL: \"${AUTH_URL:-http://localhost:3000}\"\n      CREDENTIALS_ENCRYPTION_KEY: \"${CREDENTIALS_ENCRYPTION_KEY}\"\n      DB_HOST: db\n      AUTH_TRUST_HOST: \"true\"\n    ports:\n      - \"${HOST_PORT:-3000}:3000\"\n    depends_on:\n      db:\n        condition: service_healthy\n  db:\n    image: postgres:16-alpine\n    environment:\n      POSTGRES_USER: ${POSTGRES_USER:-postgres}\n      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-password}\n      POSTGRES_DB: ${POSTGRES_DB:-sealion_dev}\n    volumes:\n      - postgres_data:/var/lib/postgresql/data\n    healthcheck:\n      test: [\"CMD-SHELL\", \"pg_isready -U ${POSTGRES_USER:-postgres}\"]\n      interval: 5s\n      timeout: 5s\n      retries: 5\n      start_period: 10s\nvolumes:\n  postgres_data:\n```\n\n### 2. Configure environment variables\n\nCreate a `.env` file in the same directory as `docker-compose.yml` and set the required environment variables:\n\n```dotenv\n# Auth.js (generate with: openssl rand -base64 32)\nAUTH_SECRET=\"\"\n\n# Credential encryption key — exactly 32 bytes hex = 64 hex chars\n# Generate with: node -e \"console.log(require('crypto').randomBytes(32).toString('hex'))\"\nCREDENTIALS_ENCRYPTION_KEY=\"\"\n\n# Server URL\n# Change to your public URL in production\nAUTH_URL=\"http://localhost:3000\"\n\n# Optional: DB variables \n# DB_HOST=db\n# DB_PORT=5432\n# DB_USER=postgres\n# POSTGRES_PASSWORD=password\n# DB_MAX_RETRIES=30\n# DB_RETRY_INTERVAL=2\n```\n\nNext, generate the keys for authentication and encryption and paste them into `.env`:\n\n```bash\ndocker compose run --rm --no-deps sealion generate-keys\n```\n\nExample output:\n\n```\nPlease add the following values to your .env file:\n\nAUTH_SECRET=\"<base64-encoded value>\"\nCREDENTIALS_ENCRYPTION_KEY=\"<64-char hex value>\"\n```\n\nCopy the two lines and paste them into `.env`.\n\n#### Alternative (if openssl is available on the host)\n\n```bash\n# Generate AUTH_SECRET\nopenssl rand -base64 32\n\n# Generate CREDENTIALS_ENCRYPTION_KEY (64 hex characters)\nopenssl rand -hex 32\n```\n\n### Start the app\n\n```bash\ndocker compose up -d\n```\n\nOpen [http://localhost:3000](http://localhost:3000) in your browser.\n\n> To use a different port, set `HOST_PORT=8080` in `.env`.\n\n### Create your first user\n\nWhen you access the app for the first time, you will be prompted to create an admin user. Enter your email address and password to create an account.\n\n### Stop the app\n\n```bash\ndocker compose stop\n```\n\n---\n\n## External Authentication (OIDC / OAuth2)\n\nIn addition to local username & password, Sealion can let users sign in with external identity providers. The following are supported out of the box:\n\n- Google\n- GitHub\n- Microsoft Entra ID\n- Generic OIDC (any IdP that exposes a `.well-known/openid-configuration` endpoint, e.g. Keycloak, Okta, Auth0)\n\n### Setup\n\n1. Sign in as an admin and open **`/admin/auth-providers`**.\n2. Click **\"Add provider\"** and choose a type (Google / GitHub / Entra ID / Generic OIDC).\n3. Enter the **Client ID** and **Client Secret** issued by the IdP. For Generic OIDC also enter the **Issuer URL**.\n4. Set the IdP's **Authorized redirect URI** to:\n   ```\n   {AUTH_URL}/api/auth/callback/{providerId}\n   ```\n   For example, with `AUTH_URL=https://sealion.example.com` and Provider ID `google`:\n   `https://sealion.example.com/api/auth/callback/google`\n5. Save and toggle **Enabled**. The button appears on `/login` immediately.\n\nUsers can review and unlink connected IdPs from their profile settings page. The last remaining sign-in method (local password or IdP link) cannot be removed.\n\n\n---\n\n## Updating\n\n```bash\ndocker compose pull\ndocker compose up -d\n```\n\nDatabase migrations run automatically on container startup.\n\n---\n\n## Tech Stack\n\n| Category | Technology |\n|----------|-----------|\n| Framework | Next.js 16 (App Router) + TypeScript |\n| UI | MUI (Material UI) v7 |\n| Auth | Auth.js v5 (credentials, OIDC, OAuth2) |\n| Database | PostgreSQL 16 + Prisma 7 |\n| i18n | next-intl v4 |\n\n---\n\n## Contributing\n\nThis project uses git-flow. Please submit pull requests against the `develop` branch.\n\n---\n\n## License\n\n[MIT](LICENSE)\n",
  "bytes": 6698,
  "sha": "48d1e285c502f1a515d9d2772d3e0b2151d4c8c357a1128a3c3061e053dbed11",
  "repo_slug": "haru/sealion",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/okf_haru_sealion_openwiki_index_md_24355c43/readme"
}