Developer-tool discovery pipeline and CLI for Interly.
Project description
Interly MVP
Interly is a developer-tool discovery pipeline layered into the existing TanStack Start app. The current UI keeps using the existing Interly shell and routes, while a small Python sidecar handles collection, deduplication, Grok classification, scoring, SQLite persistence, digest email, and the /api/interly/* backend.
Multi-user Integrations (Firebase)
Interly now supports user-owned destination integrations for:
- Slack OAuth and Slack webhooks (advanced/manual)
- Discord OAuth bot integration and Discord webhooks (advanced/manual)
- Telegram chat delivery via deep-link bot connect
The integrations system is implemented in app server routes and uses Firebase as the source of truth:
- Protected APIs verify
Authorization: Bearer <Firebase ID token>with Firebase Admin. - Per-user data is stored under
users/{uid}/integrations/{integrationId}andusers/{uid}/digestDeliveries/{deliveryId}. - Delivery logs are written to
users/{uid}/integrations/{integrationId}/deliveryLogs/{logId}. - Integration secrets are encrypted server-side with
ENCRYPTION_KEYand stored underusers/{uid}/integrationSecrets/{integrationId}. - Telegram pairing uses
telegramConnectionCodes/{code}and a webhook endpoint.
New UI:
- Integrations page:
/app/integrations
Backend endpoints:
GET /api/interly/integrationsPOST /api/interly/integrationsPATCH /api/interly/integrations/:integrationIdDELETE /api/interly/integrations/:integrationIdPOST /api/interly/integrations/:integrationId/testGET /api/interly/integrations/:integrationId/logsPOST /api/interly/send-digestGET /api/interly/slack/connectGET /api/interly/slack/callbackPOST /api/interly/slack/select-channelGET /api/interly/discord/connectGET /api/interly/discord/callbackGET /api/interly/discord/guilds-or-channelsPOST /api/interly/discord/select-channelPOST /api/interly/telegram/create-deep-linkGET /api/interly/telegram/connection-statusPOST /api/interly/telegram/create-connection-codePOST /api/interly/telegram/confirm-connection-codePOST /api/telegram/webhookPOST /api/gumroad/webhookPOST /api/gumroad/reconcilePOST /api/interly/ateno-searchPOST /api/interly/ateno-search-email
Required environment variables
Create a local .env file or export these before running the Python sidecar:
GROK_API_KEY=
ATENO_SEARCH_GROK_MODEL=grok-4.3
GITHUB_TOKEN=
GMAIL_USER=
GMAIL_APP_PASSWORD=
RECIPIENT_EMAIL=
DAYS_LOOKBACK=3
MIN_GITHUB_STARS=10
MAX_EMAIL_ITEMS=10
INTERLY_API_BASE_URL=http://127.0.0.1:8001
# Firebase Admin (server)
FIREBASE_ADMIN_PROJECT_ID=
FIREBASE_ADMIN_CLIENT_EMAIL=
FIREBASE_ADMIN_PRIVATE_KEY=
# Alternative for local development
# GOOGLE_APPLICATION_CREDENTIALS=/absolute/path/to/firebase-service-account.json
# Destination delivery
ENCRYPTION_KEY=
SMTP_USER=
SMTP_PASSWORD=
EMAIL_FROM=
TELEGRAM_BOT_TOKEN=
TELEGRAM_BOT_USERNAME=InterlyBot
TELEGRAM_WEBHOOK_SECRET=
# Gumroad payments
GUMROAD_CHECKOUT_URL=https://checkout.interly.ateno.co
GUMROAD_WEBHOOK_SECRET=
# Slack OAuth
SLACK_CLIENT_ID=
SLACK_CLIENT_SECRET=
SLACK_REDIRECT_URI=
SLACK_SIGNING_SECRET=
# Discord OAuth/bot
DISCORD_CLIENT_ID=
DISCORD_CLIENT_SECRET=
DISCORD_BOT_TOKEN=
DISCORD_REDIRECT_URI=
Notes:
GROK_API_KEYpowers Grok classification and summarization. If it is missing, the pipeline falls back conservatively and marks items as excluded.ATENO_SEARCH_GROK_MODELpowers the Ateno Search endpoint. It defaults togrok-4.3because this endpoint uses Grok web search.GITHUB_TOKENavoids low anonymous GitHub rate limits.INTERLY_API_BASE_URLis read by the TanStack app on the server side and defaults tohttp://127.0.0.1:8001.ENCRYPTION_KEYis mandatory when creating webhook or Telegram integrations. Use a long random secret.FIREBASE_ADMIN_*credentials are used for ID token verification and Firestore writes.- For local development, you can alternatively set
GOOGLE_APPLICATION_CREDENTIALSto the absolute path of a Firebase service-account JSON key. - In GCP runtimes with ADC, explicit Firebase Admin credentials can be omitted.
- Telegram webhook should be configured with
x-telegram-bot-api-secret-tokenmatchingTELEGRAM_WEBHOOK_SECRET. - Gumroad payment setup and deployment notes are in
docs/payments.md.
Local setup
Install the frontend as usual, then create the Python virtualenv once:
/opt/homebrew/bin/python3 -m venv .venv
.venv/bin/python -m pip install -r requirements.txt
Start the Python API in one terminal:
npm run interly:api
Start the app in another terminal:
npm run dev
CLI
Interly includes a local CLI that uses the project Python sidecar. After setup, run it through npm:
npm run interly
npm run interly -- --help
Common commands:
npm run interly -- init-db
npm run interly -- run
npm run interly -- run --send-email
npm run interly -- digest
npm run interly -- digest my code
npm run interly -- competitor analysis
npm run interly -- ask "what should I improve in this repo?"
npm run interly -- summary
npm run interly -- tools --min-score 7 --limit 5
npm run interly -- sources
npm run interly -- api --host 127.0.0.1 --port 8001
Published users can run the same assistant-style commands directly:
interly
interly digest my code
interly competitor analysis
interly ask "what should I improve in this repo?"
Inside the interactive terminal interface, type / to show live slash-command suggestions.
The npm scripts use the same CLI:
npm run interly:run
npm run interly:api
Publishing the CLI
npm
The npm package is configured as @atenotech/interly, matching the Ateno npm organization scope.
Check the package contents before publishing:
npm run publish:npm:dry-run
Publish from an npm account that belongs to the atenotech organization:
npm login
npm publish
After publish, users can run:
npx @atenotech/interly --help
npm install -g @atenotech/interly
interly --help
PyPI
The Python package is configured as interly with the console command interly.
Build and publish from a PyPI account that owns the project, or from the approved Ateno organization once billing/approval is active:
.venv/bin/python -m pip install build twine
.venv/bin/python -m build --outdir py-dist
.venv/bin/python -m twine check py-dist/interly-0.1.5*
.venv/bin/python -m twine upload py-dist/interly-0.1.5*
This repo also has a frontend dist/ directory, so keep Python release artifacts in py-dist/.
After publish, users can run:
pipx install interly
interly --help
Trigger the same flows from HTTP:
curl -X POST http://127.0.0.1:8001/api/interly/run
curl -X POST http://127.0.0.1:8001/api/interly/send-email
Dashboard location
- Daily radar dashboard:
/app/radar - Digest preview and send controls:
/app/digest - Source health and sync status:
/app/sources
The Radar page now reads live Interly summary and tool data from the Python backend and adds filters for category, source, minimum score, emailed state, open-source only, and AI-only.
Current backend layout
interly_py/cli.py: CLI entrypoint forinterly, including assistant-style prompts plus run, digest, summary, tools, sources, and API commandsinterly_py/assistant_cli.py: terminal assistant commands for code digests, competitor analysis, and repository-aware promptsmain.py: compatibility entrypoint forpython main.pyinterly_py/api.py: FastAPI app exposing/api/interly/summary,/api/interly/tools,/api/interly/sources,/api/interly/run,/api/interly/send-email, and Ateno Search endpointsinterly_py/ateno_search.py: Ateno Search style Grok web-search endpoint for finding tools from user query, interests, and allowed sitesinterly_py/collectors/*: GitHub Search, Hacker News Algolia, and RSS collectorsinterly_py/grok_client.py: Grok client and strict-JSON classification handlinginterly_py/scoring.py: scoring and rejection logicinterly_py/repository.py: SQLite reads/writes fortools,sources, andemails_sentdata/interly.db: local SQLite database
Deployment options later
This repo currently deploys the frontend through Firebase Hosting, which does not run Python. The practical production options are:
- Cloud Run service for the Python API plus a Cloud Run Job or Cloud Scheduler trigger for the daily run.
- GitHub Actions on a schedule to run
main.py, with the frontend pointing at the deployed Python API. - A VM or container with cron running
main.pydaily anduvicorn interly_py.api:appas the always-on API.
For all three options, keep the current TanStack app as the frontend and inject INTERLY_API_BASE_URL into the frontend server runtime.
Project details
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 interly-0.1.5.tar.gz.
File metadata
- Download URL: interly-0.1.5.tar.gz
- Upload date:
- Size: 31.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.4
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
466aa8c35bfc8da25d54e98baacf329806dbae86cff5870cf19111dbf2f05101
|
|
| MD5 |
58ff4f21a66930f3ec3573efba8250ee
|
|
| BLAKE2b-256 |
150b59340d803865df8a90cc13fffe57738a0f1afc20731b1364049cf8d73b4a
|
File details
Details for the file interly-0.1.5-py3-none-any.whl.
File metadata
- Download URL: interly-0.1.5-py3-none-any.whl
- Upload date:
- Size: 37.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.4
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
65a1fb01fef94019182fae136689219113be744dcf07dc0016b29347d9f5a294
|
|
| MD5 |
262285e1b83dff82836d57ef049aea5a
|
|
| BLAKE2b-256 |
83f8776be06a9543214574ef361751dcc613ec1541a3221223509a9b7e4bf9a2
|