AI-powered linking and automation tool
Project description
Dev Linker
Dev Linker runs frontend and backend dev servers, proxies both through a single local port (8000), and creates a single public URL via Cloudflare or ngrok.
Features
- Launches frontend and backend (when frontend and backend/app.py exist)
- Detects common frontend/backend ports
- Serves both through one proxy at http://localhost:8000
- Creates a public tunnel for sharing (Cloudflare first, ngrok fallback)
- Terminal-first workflow
- Supports CLI version output with --version
Project Structure
onelink/
├── onelink/
│ ├── __init__.py
│ ├── main.py
│ ├── runner.py
│ ├── detector.py
│ ├── proxy.py
│ └── tunnel.py
├── setup.py
├── README.md
└── requirements.txt
Install
For local development:
pip install .
After publishing to PyPI:
pip install dev-linker
Run
devlinker
Typical startup output:
✨ Dev Linker v0.1.0
🚀 Starting services...
🔍 Detecting services...
• Frontend -> 5173
• Backend -> 5000
🌐 Proxy ready at http://localhost:8000
⚡ Tunnel provider: Cloudflare
🌍 Public URL:
https://xxxx.trycloudflare.com
👉 Share this link with anyone
Version check:
devlinker --version
Optional overrides:
devlinker --frontend 5173 --backend 5000
If port 8000 is already in use:
devlinker --frontend 5173 --backend 5000 --proxy-port 18000
Default behavior also tries fallback ports automatically when 8000 is busy:
- 8001
- 8002
- 18000
Important Frontend Rule
Frontend requests must use relative API paths:
fetch("/api/endpoint")
Do not hardcode backend host URLs in frontend code.
Notes
- runner.py expects frontend project in frontend and Flask app in backend/app.py.
- If those paths do not exist, Dev Linker skips launch and only tries to detect already-running services.
- Tunnel selection order is: cloudflared (TryCloudflare), then ngrok.
- If cloudflared is unavailable and ngrok is not configured, Dev Linker prints one-time setup guidance.
- You may need to set ngrok auth once on your machine using ngrok config add-authtoken .
- Dev Linker prints a public URL with
ngrok-skip-browser-warning=trueonly when ngrok is used. - Startup output includes selected tunnel provider (
cloudflareorngrok). - When Dev Linker launches a Vite frontend, it sets
ONELINK=1to disable Vite HMR WebSockets for stable tunnel behavior.
Real-Time Development Modes
Option 1: Dev Linker sharing mode (recommended)
- Run
devlinkerto share one combined frontend/backend URL. - Open local Vite URL yourself for instant HMR updates.
- Share Dev Linker/ngrok URL with others; they can use normal page refresh to see changes.
Option 2: Full remote HMR mode (bypass Dev Linker)
- Start frontend and backend manually.
- Configure Vite
server.proxyfor/apito backend. - Run
ngrok http <vite-port>directly so Vite handles WebSocket HMR traffic.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file devlinker-0.1.0.tar.gz.
File metadata
- Download URL: devlinker-0.1.0.tar.gz
- Upload date:
- Size: 8.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4424bf906e7344766ef75addf963f72b6b200239f2828f2d9164fa3c9db8a0f4
|
|
| MD5 |
8f76a8b31044e7fc4cf693fa215fdc2f
|
|
| BLAKE2b-256 |
174c88f249188890d831dd0338d5f4d1fae11e522ad35cd1f6421fc035208920
|
Provenance
The following attestation bundles were made for devlinker-0.1.0.tar.gz:
Publisher:
publish.yml on mani1028/devlinker
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
devlinker-0.1.0.tar.gz -
Subject digest:
4424bf906e7344766ef75addf963f72b6b200239f2828f2d9164fa3c9db8a0f4 - Sigstore transparency entry: 1172157543
- Sigstore integration time:
-
Permalink:
mani1028/devlinker@74b0dcba3366c0b58de1e58ecab2e0a7e4b58a25 -
Branch / Tag:
refs/tags/v0.1.2 - Owner: https://github.com/mani1028
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@74b0dcba3366c0b58de1e58ecab2e0a7e4b58a25 -
Trigger Event:
push
-
Statement type:
File details
Details for the file devlinker-0.1.0-py3-none-any.whl.
File metadata
- Download URL: devlinker-0.1.0-py3-none-any.whl
- Upload date:
- Size: 9.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
43f725f838ed68a63d275a996315d87f422910020b32c122e4d216c3222c0b50
|
|
| MD5 |
80f4b99a3a016c22ed10652fcc64df4e
|
|
| BLAKE2b-256 |
4f8797fc5bf244542984caae92c7c739de05ce56c3f507dbd662144b1001f852
|
Provenance
The following attestation bundles were made for devlinker-0.1.0-py3-none-any.whl:
Publisher:
publish.yml on mani1028/devlinker
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
devlinker-0.1.0-py3-none-any.whl -
Subject digest:
43f725f838ed68a63d275a996315d87f422910020b32c122e4d216c3222c0b50 - Sigstore transparency entry: 1172157548
- Sigstore integration time:
-
Permalink:
mani1028/devlinker@74b0dcba3366c0b58de1e58ecab2e0a7e4b58a25 -
Branch / Tag:
refs/tags/v0.1.2 - Owner: https://github.com/mani1028
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@74b0dcba3366c0b58de1e58ecab2e0a7e4b58a25 -
Trigger Event:
push
-
Statement type: