{"id":24291251,"url":"https://github.com/somritdasgupta/quefork","last_synced_at":"2026-03-08T22:03:01.369Z","repository":{"id":272617497,"uuid":"917047238","full_name":"somritdasgupta/queFork","owner":"somritdasgupta","description":"queFork is a simple, lightweight web API testing platform. Supports REST HTTP requests and real-time websockets protocols.","archived":false,"fork":false,"pushed_at":"2025-12-14T16:29:22.000Z","size":4704,"stargazers_count":3,"open_issues_count":5,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-12-17T01:55:33.276Z","etag":null,"topics":["api-documentation","api-testing","rest-api","serverless-framework","websocket"],"latest_commit_sha":null,"homepage":"https://quefork.somritdasgupta.in","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/somritdasgupta.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-01-15T08:54:22.000Z","updated_at":"2025-12-14T16:29:03.000Z","dependencies_parsed_at":"2025-02-28T15:18:53.954Z","dependency_job_id":null,"html_url":"https://github.com/somritdasgupta/queFork","commit_stats":null,"previous_names":["somritdasgupta/quefork"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/somritdasgupta/queFork","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/somritdasgupta%2FqueFork","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/somritdasgupta%2FqueFork/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/somritdasgupta%2FqueFork/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/somritdasgupta%2FqueFork/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/somritdasgupta","download_url":"https://codeload.github.com/somritdasgupta/queFork/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/somritdasgupta%2FqueFork/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30274876,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-08T20:45:49.896Z","status":"ssl_error","status_checked_at":"2026-03-08T20:45:49.525Z","response_time":56,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["api-documentation","api-testing","rest-api","serverless-framework","websocket"],"created_at":"2025-01-16T14:00:42.350Z","updated_at":"2026-03-08T22:03:01.362Z","avatar_url":"https://github.com/somritdasgupta.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"public/icon-512.png\" alt=\"queFork\" width=\"72\" height=\"72\" /\u003e\n\u003c/p\u003e\n\n\u003ch1 align=\"center\"\u003equeFork\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003eFast API testing client for REST, GraphQL, SOAP, WebSocket, SSE and Socket.IO\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/somritdasgupta/queFork/actions/workflows/edge-deploy.yml\"\u003e\u003cimg src=\"https://img.shields.io/github/actions/workflow/status/somritdasgupta/queFork/edge-deploy.yml?branch=main\u0026label=build\u0026style=flat-square\" alt=\"Build\" /\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/somritdasgupta/queFork/actions/workflows/docker-publish.yml\"\u003e\u003cimg src=\"https://img.shields.io/github/actions/workflow/status/somritdasgupta/queFork/docker-publish.yml?branch=main\u0026label=docker\u0026style=flat-square\" alt=\"Docker\" /\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/somritdasgupta/queFork/blob/main/LICENSE\"\u003e\u003cimg src=\"https://img.shields.io/github/license/somritdasgupta/queFork?style=flat-square\" alt=\"License\" /\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/somritdasgupta/queFork\"\u003e\u003cimg src=\"https://img.shields.io/github/stars/somritdasgupta/queFork?style=flat-square\" alt=\"Stars\" /\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/somritdasgupta/queFork/issues\"\u003e\u003cimg src=\"https://img.shields.io/github/issues/somritdasgupta/queFork?style=flat-square\" alt=\"Issues\" /\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/somritdasgupta/queFork/pulls\"\u003e\u003cimg src=\"https://img.shields.io/github/issues-pr/somritdasgupta/queFork?style=flat-square\" alt=\"PRs\" /\u003e\u003c/a\u003e\n  \u003cimg src=\"https://img.shields.io/github/repo-size/somritdasgupta/queFork?style=flat-square\" alt=\"Repo Size\" /\u003e\n  \u003cimg src=\"https://img.shields.io/github/last-commit/somritdasgupta/queFork?style=flat-square\" alt=\"Last Commit\" /\u003e\n\u003c/p\u003e\n\n---\n\n## Table of Contents\n\n- [Overview](#overview)\n- [Supported Protocols](#supported-protocols)\n- [Features](#features)\n- [Getting Started](#getting-started)\n- [Docker](#docker)\n- [Chrome Extension](#chrome-extension)\n- [queFork Agent](#quefork-agent)\n- [Custom CORS Proxy](#custom-cors-proxy)\n- [Project Structure](#project-structure)\n- [Tech Stack](#tech-stack)\n- [Deployment](#deployment)\n- [CI/CD](#cicd)\n- [Contributing](#contributing)\n- [License](#license)\n\n---\n\n## Overview\n\nqueFork is a browser-based API testing client that works entirely offline after first load. It supports six protocols, runs as a PWA for localhost testing, and requires zero backend setup. All data is stored locally in the browser.\n\n---\n\n## Supported Protocols\n\n| Protocol | Capabilities |\n|----------|-------------|\n| REST | GET, POST, PUT, PATCH, DELETE, OPTIONS, HEAD with headers, params, and body |\n| GraphQL | Query editor, variables panel, schema introspection |\n| SOAP | XML envelope editor, Content-Type auto-detection |\n| WebSocket | Bidirectional messaging, sub-protocol support |\n| Socket.IO | Event-based messaging, transport configuration, event listeners |\n| SSE | Auto-reconnect, event buffering, real-time statistics |\n\n---\n\n## Features\n\n| Category | Details |\n|----------|---------|\n| Scripting | Pre/post request JavaScript with `qf.*` API |\n| Variables | Environment variables using `{{variable}}` syntax |\n| Collections | Organize requests into folders with workspace isolation |\n| Code Export | cURL import and export to 14 languages |\n| CORS | Built-in proxy cascade with custom proxy support |\n| History | Searchable request history with date grouping |\n| Auth | OAuth 2.0, Bearer, Basic, API Key |\n| Themes | Dark and light mode |\n| Offline | Full PWA support for localhost testing without internet |\n| Dynamic Favicon | Green/red status dot on favicon based on response codes |\n\n---\n\n## Getting Started\n\n### Prerequisites\n\n- Node.js 18 or higher\n- npm (included with Node.js)\n\n### Steps\n\n1. Clone the repository\n\n```bash\ngit clone https://github.com/somritdasgupta/queFork.git\n```\n\n2. Navigate to the project directory\n\n```bash\ncd queFork\n```\n\n3. Install dependencies\n\n```bash\nnpm install\n```\n\n4. Start the development server\n\n```bash\nnpm run dev\n```\n\n5. Open the app at `http://localhost:8080`\n\n### Available Scripts\n\n| Command | Description |\n|---------|-------------|\n| `npm run dev` | Start development server with hot reload |\n| `npm run build` | Create production build |\n| `npm run preview` | Preview production build locally |\n| `npm run lint` | Run ESLint checks |\n| `npm test` | Run test suite |\n| `npm run secrets:vercel` | Auto-set `VERCEL_*` GitHub secrets from local Vercel config |\n\n---\n\n## Docker\n\n### Build and run locally\n\n```bash\ndocker compose up -d\n```\n\nThe app will be available at `http://localhost:3000`.\n\n### Manual build\n\n```bash\ndocker build -t quefork .\ndocker run -d -p 3000:80 quefork\n```\n\n### Pull from GitHub Container Registry\n\n```bash\ndocker pull ghcr.io/somritdasgupta/quefork:latest\ndocker run -d -p 3000:80 ghcr.io/somritdasgupta/quefork:latest\n```\n\n### Docker configuration\n\n| File | Purpose |\n|------|---------|\n| `Dockerfile` | Multi-stage build: Node 20 Alpine for build, Nginx Alpine for serving |\n| `docker-compose.yml` | Single-command setup with health checks |\n| `docker/nginx.conf` | Gzip, SPA routing, caching, security headers |\n| `.dockerignore` | Excludes node_modules, .git, and non-essential files |\n\n---\n\n## Chrome Extension\n\nA side-panel extension for CORS-free API testing directly inside Chrome.\n\n### Installation\n\n1. Open Chrome and navigate to `chrome://extensions`\n2. Enable \"Developer mode\" in the top right\n3. Click \"Load unpacked\"\n4. Select the `chrome-extension/` folder from this repository\n5. Click the queFork icon in the toolbar to open the side panel\n\nAll requests route through Chrome's background service worker, bypassing CORS restrictions entirely.\n\n---\n\n## queFork Agent\n\nA lightweight local proxy for testing against localhost, private networks, and APIs that block browser requests.\n\n### Installation\n\n```bash\nnpm install -g quefork-agent\nquefork-agent\n```\n\n### Options\n\n| Flag | Description |\n|------|-------------|\n| `--port 9120` | Custom port |\n| `--verbose` | Enable verbose logging |\n\nAgent status appears in the app footer. When the agent is running, all requests are routed through it instead of the built-in CORS proxy.\n\n---\n\n## Custom CORS Proxy\n\nDeploy your own proxy on Vercel for persistent CORS bypass:\n\n```javascript\n// api/proxy.js\nexport default async function handler(req, res) {\n  res.setHeader('Access-Control-Allow-Origin', '*');\n  res.setHeader('Access-Control-Allow-Methods', 'GET,POST,PUT,PATCH,DELETE,OPTIONS');\n  res.setHeader('Access-Control-Allow-Headers', '*');\n\n  if (req.method === 'OPTIONS') return res.status(200).end();\n\n  const { url, method, headers, body } = req.body;\n  const response = await fetch(url, {\n    method: method || 'GET',\n    headers: headers || {},\n    body: body ? JSON.stringify(body) : undefined,\n  });\n\n  const data = await response.text();\n  res.status(200).json({ status: response.status, body: data });\n}\n```\n\n```bash\nvercel deploy\n```\n\n---\n\n## Project Structure\n\n```\nquefork/\n├── src/\n│   ├── components/          UI components\n│   │   ├── AuthEditor       OAuth 2.0, Bearer, Basic, API Key\n│   │   ├── CodeEditor       CodeMirror-based editor\n│   │   ├── KeyValueEditor   Drag-and-drop key-value pairs\n│   │   ├── RealtimePanel    WebSocket and Socket.IO\n│   │   ├── RequestTabs      Params, Headers, Body, Scripts\n│   │   ├── ResponsePanel    Body, Preview, Headers, Tests\n│   │   └── ui/              shadcn/ui primitives\n│   ├── lib/\n│   │   ├── api-client       Request execution and CORS cascade\n│   │   ├── curl-parser      Import/export for 14 languages\n│   │   ├── dynamic-favicon  Status dot overlay on favicon\n│   │   └── secure-storage   Encrypted localStorage\n│   ├── assets/\n│   │   └── brand/           Master brand assets (single source of truth)\n│   ├── pages/\n│   │   └── Index            Main app layout and state management\n│   └── types/\n│       └── api              TypeScript interfaces\n├── chrome-extension/        Chrome side panel extension\n├── docker/                  Nginx configuration\n├── .github/workflows/       CI/CD pipelines\n├── Dockerfile               Multi-stage production build\n└── docker-compose.yml       Container orchestration\n```\n\n---\n\n## Tech Stack\n\n| Technology | Role |\n|-----------|------|\n| React 18 | UI framework |\n| TypeScript | Type safety |\n| Vite | Build tooling and dev server |\n| Tailwind CSS | Utility-first styling |\n| shadcn/ui | Component primitives |\n| CodeMirror 6 | Code editors |\n| socket.io-client | Socket.IO protocol support |\n| vite-plugin-pwa | PWA and offline support |\n| Nginx | Production static file serving |\n\n---\n\n## Deployment\n\n### Vercel\n\n```bash\nnpm install -g vercel\nvercel login\nvercel link\nnpm run secrets:vercel\n```\n\nWhen Vercel asks for your code directory, use `.` (repository root).\n\nRequired repository secrets for deploy workflows:\n\n- `VERCEL_TOKEN`\n- `VERCEL_ORG_ID`\n- `VERCEL_PROJECT_ID`\n\nThe `npm run secrets:vercel` command sets all three automatically after `vercel login` and `vercel link`.\n\n### Netlify\n\n```bash\nnpm run build\n# Deploy the dist/ folder via Netlify dashboard or CLI\n```\n\n### Docker\n\nSee the [Docker](#docker) section above.\n\n### Self-hosted\n\n```bash\nnpm run build\n# Serve the dist/ folder with any static file server\nnpx serve dist\n```\n\n---\n\n## CI/CD\n\n| Workflow | Trigger | Description |\n|----------|---------|-------------|\n| `ci.yml` | Push to main/develop, pull requests | Lint, test, and build matrix checks |\n| `build-deploy.yml` | Push to main, manual dispatch | Build + deploy summary workflow |\n| `edge-deploy.yml` | Push to main/develop, pull requests, manual dispatch | Type check, build, deploy to Vercel |\n| `docker-publish.yml` | Push to main, tags, manual dispatch | Build and push Docker image to GHCR |\n| `extension-release.yml` | Tag push `extension-v*`, manual dispatch | Package Chrome extension and publish GitHub release |\n| `dependency-update.yml` | Weekly schedule, manual dispatch | Update dependencies, verify build, create PR |\n\n### Extension Release Automation\n\nAutomatic release from tag:\n\n```bash\ngit tag extension-v2.1.0\ngit push origin extension-v2.1.0\n```\n\nManual release is still available from the Actions tab via `workflow_dispatch`.\n\n### Badge Status Note\n\nGitHub Actions badges show `no status` until that workflow has at least one run on the default branch.\n\n---\n\n## Contributing\n\n1. Fork the repository\n2. Clone your fork\n\n```bash\ngit clone https://github.com/YOUR_USERNAME/queFork.git\ncd queFork\nnpm install\n```\n\n3. Create a feature branch\n\n```bash\ngit checkout -b feature/your-feature\n```\n\n4. Make changes and test\n\n```bash\nnpm run dev\nnpm test\nnpm run lint\n```\n\n5. Commit and push\n\n```bash\ngit add .\ngit commit -m \"Add your feature\"\ngit push origin feature/your-feature\n```\n\n6. Open a pull request on GitHub\n\n---\n\n## License\n\nMIT -- [Somrit Dasgupta](https://github.com/somritdasgupta)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsomritdasgupta%2Fquefork","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsomritdasgupta%2Fquefork","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsomritdasgupta%2Fquefork/lists"}