Thank you for your interest in contributing to dbportal!
Whether you're fixing a typo, adding a feature, or improving documentation — every contribution matters. This guide will walk you through everything you need to get started.
- Code of Conduct
- Getting Started
- Project Structure
- Development Setup
- Finding Issues to Work On
- Making Changes
- Commit Message Format
- Opening a Pull Request
- Code Style Guidelines
- GSSoC Participants
By participating in this project, you agree to abide by our Code of Conduct. Please read it before contributing.
Make sure you have the following installed:
| Tool | Version |
|---|---|
| Node.js | >= 18.x |
| npm | >= 9.x |
| Git | any recent version |
You will also need access to at least one database to test against (PostgreSQL, MongoDB, MySQL, SQLite, SQL Server, or Redis).
dbportal/
├── src/ # Backend — Node.js + Express + TypeScript
│ ├── index.ts # Express server, route definitions
│ ├── cli.ts # CLI entry point + all API route handlers
│ ├── docker-service.ts # Docker daemon adapter (containers, images, volumes)
│ └── drivers/ # Database-specific driver implementations
│ ├── types.ts # Shared driver interface
│ ├── postgres-driver.ts
│ ├── mongodb-driver.ts
│ ├── mysql-driver.ts
│ ├── sqlite-driver.ts
│ ├── mssql-driver.ts
│ └── redis-driver.ts
├── frontend/ # Frontend — React + Vite + TypeScript
│ └── src/
│ ├── App.tsx # Root component and app state (db + docker modes)
│ ├── index.css # Global styles and design tokens
│ └── components/ # UI components
│ ├── Icons.tsx # Shared SVG icon set (no emoji, no icon library)
│ ├── Sidebar.tsx # Database mode sidebar
│ ├── DockerSidebar.tsx # Docker mode sidebar with bulk select
│ ├── Toolbar.tsx
│ ├── EmptyState.tsx
│ └── views/
│ ├── DockerDashboardView.tsx # Container metrics + logs
│ ├── DockerRunnerView.tsx # Container launcher + compose export
│ ├── DockerImagesView.tsx # Local images browser
│ ├── DockerVolumesView.tsx # Local volumes browser
│ └── ... # Database Explorer view modes
├── bin/
│ └── cli.js # Compiled CLI launcher (do not edit directly)
├── dist/ # Compiled backend output (git-ignored)
├── .github/ # Issue/PR templates and CI workflows
├── .env.example # Environment variable template
├── package.json
└── tsconfig.json
# Fork the repo on GitHub, then:
git clone https://github.com/<your-username>/dbportal.git
cd dbportal# Root dependencies (backend)
npm install
# Frontend dependencies
cd frontend && npm install && cd ..# Copy the example env file
cp .env.example .envEdit .env and add at least one database connection:
DATABASE_URL=postgres://user:password@localhost:5432/my_db
PORT=3000You need two terminals running simultaneously:
Terminal 1 — Backend (with hot reload):
npm run devTerminal 2 — Frontend (Vite dev server):
npm run dev:uiThen open http://localhost:5173 in your browser. The frontend proxies API calls to the backend at http://localhost:3000.
Testing Docker mode locally: start the backend with
npm run devthen add--dockerto the nodemon command (or runnode dist/cli.cjs --docker --port 5656after a build). The frontend Vite server at port 5173 proxies all/api/requests to the backend.
npm run buildThis compiles both frontend and backend and bundles them for npm publishing.
npm run lintThis runs tsc --noEmit to check for TypeScript errors without emitting files.
- Browse open issues
- Filter by
good-first-issuefor beginner-friendly tasks - Filter by
help-wantedfor more involved contributions - Check Discussions if you want to propose something before opening an issue
Always comment on an issue before starting work to avoid duplicate effort. Wait for a maintainer to assign it to you.
Always branch off from main:
git checkout main
git pull origin main
git checkout -b feat/your-feature-nameBranch naming convention:
| Type | Example |
|---|---|
| Feature | feat/add-csv-export |
| Bug fix | fix/sidebar-filter-crash |
| Docs | docs/update-readme |
| Refactor | refactor/query-handler |
| Test | test/add-driver-unit-tests |
| CI | ci/add-github-actions |
- Keep changes focused — one concern per PR
- Add comments for non-obvious logic
- Do not commit
.env,node_modules, ordist/
# Type check — must pass with zero errors
npm run lint
# Format code (if prettier is configured)
npm run formatWe follow the Conventional Commits spec:
<type>(<scope>): <short description>
Types:
| Type | When to use |
|---|---|
feat |
New feature |
fix |
Bug fix |
docs |
Documentation only |
style |
Formatting, no logic change |
refactor |
Code restructure, no behavior change |
test |
Adding or updating tests |
ci |
CI/CD config changes |
chore |
Tooling, dependencies, build scripts |
Examples:
feat(frontend): add copy-to-clipboard button in query results
fix(postgres-driver): handle null values in schema query
docs: add screenshots to README
ci: add GitHub Actions workflow for type checking
- Push your branch:
git push origin feat/your-feature-name - Open a PR against the
mainbranch on GitHub - Fill in the PR template completely
- Link the issue your PR resolves (e.g.,
Closes #12) - Wait for a review — a maintainer will respond within a few days
-
npm run lintpasses with no errors - Changes are tested locally against a real database connection or Docker daemon
- No unrelated files are changed
- The PR description clearly explains what and why
- TypeScript: strict mode is enabled; avoid
anyunless absolutely necessary - Formatting: Prettier is configured — run
npm run formatbefore committing - No ORM: database access uses native drivers only (by design)
- No frontend framework additions: the frontend uses React + Vite; do not add large dependencies without discussion
- Icons: use the shared
Icons.tsxSVG set — do not add emoji or third-party icon libraries. Add new icons toIcons.tsxif needed. - Read-only guarantee: do not add write/mutate endpoints to the database backend — this is a core design constraint (Docker management endpoints are an intentional exception)
- Component scope: keep React components focused and small; extract logic into hooks or utilities when components grow large
Welcome to GSSoC! Here are some tips to get started quickly:
- Star and fork the repository first
- Look for issues labeled
good-first-issue+gssoc - Comment on the issue: "Hey, I'd like to work on this as part of GSSoC — could you assign it to me?"
- Set up the project locally (takes ~10 min, see Development Setup)
- Keep your PRs small and focused — one issue per PR
- Reach out in Discussions if you're stuck
All GSSoC contributions are tracked via the
gssoclabel on issues and PRs.
- Join our Discord Server — chat with maintainers, get help setting up, or collaborate with fellow contributors
- GitHub Discussions — general questions, ideas, and feedback
- Open an Issue — for bug reports and feature requests
Thank you for contributing!