feat: add LinkedGrow satellite - #259
Open
DigiHold wants to merge 1 commit into
Open
Conversation
AI agents that find leads and clients on LinkedIn, driving a real Chrome per connected account under Xvfb because LinkedIn has no API for reading a feed or sending a message. Handle linkedgrow, port 35080, docs at 2.3.98. Three containers: the app, a libSQL server, and the worker that owns the browsers. Named volumes rather than a workspace bind mount, because both images run as uid 10001 and refuse to start on a directory they cannot write; a fresh named volume inherits the image's ownership, while a bind mount target is created root owned and a chown sidecar does not fix it portably (tested, it does not survive Docker Desktop's mount layer). No ollama cross-file: the AI client calls its five providers at their own addresses and has no configurable base URL, so a Harbor backend cannot be pointed at. Documented rather than left for the user to discover.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Adds LinkedGrow as a satellite, following
.agents/skills/new-service/SKILL.md. Handlelinkedgrow, port 35080, docs at2.3.98.What it is
AI agents that find leads and clients on LinkedIn. You describe who you sell to, an agent scores each profile it finds, sends the invitation and runs the follow up conversation, then hands over the people who reply. The posting side comes with it. Source at https://github.com/DigiHold/LinkedGrow under AGPL-3.0. I maintain it, so say so if you would rather not carry a service submitted by its own author.
Every action happens in a real Chrome under Xvfb, because LinkedIn has no API for reading a feed or sending a message. That is what the resource notes in the doc are about.
Three decisions that depart from the skill, each with a reason
HARBOR_LINKEDGROW_WORKSPACEbind mount. I wrote the workspace version first, with alinkedgrow-initsidecar chowning the directories the waylinkwarden-initdoes. It does not work here: linkwarden runs the app as${HARBOR_USER_ID}, so the chown target matches, while both LinkedGrow images run as uid 10001 and the app exits with/data/config is not writable by uid 10001in a restart loop. I only found that by booting it. Named volumes inherit the image's ownership on creation, so the whole failure mode disappears and one container goes with it.HARBOR_LINKEDGROW_WORKSPACEis therefore not defined at all rather than shipped unused. Postiz's elasticsearch volume is the existing precedent for a named volume inservices/.restart: unless-stopped. The app applies migrations and writes the secrets the worker reads, and the worker blocks on its health check, so an app that stays down strands the queue. Same reasoning the linkwarden and windmill files already state in a comment.compose.x.linkedgrow.ollama.yml. The AI client calls Anthropic, OpenAI, Google, xAI and Moonshot at hardcoded addresses and has no configurable base URL, so a Harbor backend cannot be pointed at it today. Rather than ship a cross-file that silently does nothing, the doc says plainly that this is the one integration a Harbor user expects and does not get.Checks run
docker compose --env-file .env -f compose.yml -f services/compose.linkedgrow.yml configexits 0, no unset variable warningslinkedgrowreacheshealthy,/api/healthanswers{"ok":true,"edition":"self-hosted","setupCompleted":false}, and the container runs as uid 10001 withsecrets.envwritten-rw------- linkedgrow linkedgrowinto the config volume/sign-upcreates the owner account, which lands on the setup wizard. The screenshot in the doc is that screen, 1280x800.tsc --noEmitclean onapp/src/serviceMetadata.tsTwo things I did not do, stated rather than glossed. I did not run
harbor config update, because I editedprofiles/default.envfrom a checkout rather than an installed Harbor; the rendered.envI validated against was a copy ofdefault.env. And I did not exercise the actual LinkedIn workflow end to end, because that needs credentials for a real account plus an address reserved for it, which is not something to do from a throwaway container. The wizard also refuses to complete without an AI key, so the screenshot stops at the first screen rather than a populated dashboard.Logo is the favicon URL in the metadata entry; run
harbor dev add-logosover it if you want it resolved your way.