A canvas-based API testing tool where you create visual flows using blocks and arrows to construct and execute API requests. Think tldraw meets Postman, but more intuitive and visual.
- Base URL Block (blue): Your API's base URL (e.g.,
http://localhost:3000) - Resource Block (pink): API endpoints and path segments (e.g.,
users,posts) - Method Block (color-coded): HTTP methods (GET, POST, PUT, DELETE, PATCH)
- Arrow Connections: Connect blocks to build your API path visually
- Live URL Preview: See your constructed URL in real-time
- Request Configuration: Configure headers and request body with ease
- Response Viewer: View response data with tabs for body, headers, and raw data
- Parameter Support: Use
{variableName}in resource blocks for dynamic parameters
- π Auto-Save: All your work is automatically saved to browser storage (IndexedDB)
- π¦ Default Starter State: New projects start with helpful example endpoints
- ποΈ Erase All: Reset to default state with one click
- π Request History: Track your recent API calls with expandable history panel
- π₯ OpenAPI Import: Import API schemas from OpenAPI/Swagger files (JSON & YAML supported)
- Automatically creates visual blocks and connections from your API specification
- Extracts request body fields from schemas
npm installnpm run devThe application will be available at http://localhost:5173/
npm run buildWhen you first open TLDFetch, you'll see example endpoints already set up:
http://localhost:3000β/healthβ GEThttp://localhost:3000β/auth/loginβ POST (with email/password fields)
- Click on the GET method block connected to
/health - Click "Send Request" in the right panel
- View the response in the bottom-right panel
Use the toolbar at the top-left to add blocks:
- Base URL: Click to add a base URL block
- Resource: Click to add a resource/endpoint block
- GET/POST/PUT/DELETE/PATCH: Click to add a method block
- Click and drag from a block's connection point (circular handles)
- Release on another block to create a connection
- The path flows: Base URL β Resources β Method
Example flow:
[Base URL: https://api.github.com] β [users] β [octocat] β [GET]
Result: https://api.github.com/users/octocat
- Double-click any block to edit its value
- Base URL: Enter the full base URL with protocol
- Resources: Enter the path segment (or use
{param}for dynamic values) - Methods: Cannot be edited (fixed values)
Create dynamic URLs with parameters:
- Create a resource block
- Double-click to edit it
- Enter a value with curly braces:
{userId} - The block will turn orange, indicating it's a parameter
Once you have a valid path (Base URL β Resources β Method):
- The Active URL display will show your constructed URL
- A Request Panel appears with configuration options
- Add headers if needed (default:
Content-Type: application/json) - Add request body for POST/PUT/PATCH (use key-value fields or JSON)
- Click "Send Request"
- View the response in the bottom-right panel
Extract values from API responses and use them in subsequent requests:
- Send a request (e.g., login to get a token)
- In the response viewer, drag any field from the JSON response
- Drop it onto any request field (headers, body fields, or URL parameters)
- Perfect for workflows like: login β get token β use token in authenticated requests
Example workflow:
- Login via
/auth/loginPOST β gettokenfrom response - Drag the
tokenvalue from response - Drop it onto the Authorization header of your next request
- All successful requests are saved to your history
- View history in the collapsible panel above the response viewer
- Click any history item to expand and see the full response
- Delete individual items with the β button
Click the red "Erase All" button in the toolbar to:
- Clear all blocks and connections
- Reset to the default starter state
- Start fresh with example endpoints
- React 19 + TypeScript: UI framework
- React Flow: Canvas and node-based graph system
- Zustand: State management
- IndexedDB: Client-side persistence
- Tailwind CSS v4: Styling
- Axios: HTTP client
- Vite: Build tool
- Lucide React: Icons
src/
βββ components/
β βββ Blocks/
β β βββ BaseUrlBlock.tsx # Blue base URL block
β β βββ ResourceBlock.tsx # Pink resource/parameter block
β β βββ MethodBlock.tsx # Color-coded HTTP method block
β β βββ RequestNode.tsx # Request configuration node
β βββ Canvas/
β β βββ Canvas.tsx # Main React Flow canvas
β βββ Panels/
β β βββ ResponseModal.tsx # Response viewer
β β βββ ResponseHistory.tsx # Request history panel
β βββ Modals/
β β βββ RequestBodyHistoryModal.tsx # Body history dropdown
β βββ Toolbar/
β βββ BlockToolbar.tsx # Top toolbar for adding blocks
βββ store/
β βββ useCanvasStore.ts # Zustand store for state management
β βββ indexedDB.ts # IndexedDB persistence utilities
βββ types.ts # TypeScript type definitions
βββ App.tsx # Main app component
βββ main.tsx # Entry point with hydration
- Delete: Remove selected blocks or connections
- Drag: Move blocks around the canvas
- Scroll: Pan the canvas
- Pinch/Zoom: Zoom in/out on the canvas
- Add Base URL:
https://jsonplaceholder.typicode.com - Add Resource:
posts - Add GET method
- Connect: Base URL β posts β GET
- Click "Send Request"
- Add Base URL:
https://jsonplaceholder.typicode.com - Add Resource:
posts - Add POST method
- Connect: Base URL β posts β POST
- In the Request Panel, add body fields:
title:foobody:baruserId:1
- Click "Send Request"
- Add Base URL:
https://jsonplaceholder.typicode.com - Add Resource:
posts - Add Resource:
{postId}(will turn orange) - Add GET method
- Connect: Base URL β posts β {postId} β GET
- Enter a value for
postIdwhen prompted - Click "Send Request"
- Canvas with pan/zoom
- Three block types (BaseURL, Resource, Method)
- Arrow connections
- Path computation and display
- Request execution (all HTTP methods)
- Response display with tabs (Body, Headers, Raw)
- Request history with persistence
- Body history for endpoints
- IndexedDB persistence (auto-save)
- Default starter state
- Erase all functionality
- Parameter support with variable input
- Request/Response panels
- OpenAPI/Swagger import (JSON & YAML)
- Variable extraction from responses
- Environment switching (Dev/Staging/Prod)
- Collections/Workspaces
- Export canvas to JSON
- Import saved canvases
- Export as curl/code snippet
- Response assertions/testing
- WebSocket support
- GraphQL support
Requires a modern browser with:
- IndexedDB support
- ES2020+ JavaScript features
- CSS Grid and Flexbox
Tested on:
- Chrome
- Safari
CC BY-NC 4.0 (Creative Commons Attribution-NonCommercial 4.0 International)
This project is licensed under the Creative Commons Attribution-NonCommercial 4.0 International License.
You are free to:
- Share β copy and redistribute the material in any medium or format
- Adapt β remix, transform, and build upon the material
Under the following terms:
- Attribution β You must give appropriate credit, provide a link to the license, and indicate if changes were made
- NonCommercial β You may not use the material for commercial purposes
For commercial licensing inquiries, please contact the project maintainer.
Full license: https://creativecommons.org/licenses/by-nc/4.0/