尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证An autonomous, ad-free market for free open-source apps. A GitHub Actions robot checks submissions, counts community votes and publishes apps. In English, Russian, Spanish and Chinese.
翻译准备中
取自仓库 README
正在加载完整 README。
查看完整 README ↗English · Русский
An autonomous market for free, open-source apps. No ads, banners or trackers. Part of OpenCraft Hub.
Live site: https://nickgbar.github.io/VibeMarket/
The market runs without a server and without day-to-day moderators. The site is hosted on GitHub Pages. Developers submit apps through GitHub, the community votes with reactions, and a robot in GitHub Actions publishes, promotes and removes apps by the rules in rules.json.
| File | What it is |
|---|---|
index.html | The whole market page, no build step and no dependencies. Russian is built into it |
locales/ | Site translations into English, Spanish and Chinese |
catalog.json | Data from the robot: stars, download files, sandbox, voting, hidden apps |
rules.json | The rules the robot follows |
scripts/robot.mjs | The robot |
scripts/robot-i18n.mjs | Robot replies and form field labels in every language |
scripts/downloads.mjs | Sorts release files by system and processor for the Get button |
scripts/scout.mjs | The scout: finds new open-source apps on GitHub every week |
scripts/build-site.mjs | Builds the site for GitHub Pages: a page for every app in four languages and sitemap.xml |
scripts/github.mjs | GitHub API requests shared by the robot and the scout |
scripts/mcp.mjs | MCP server for AI agents, see below |
scripts/check-locales.mjs | Checks translations against the Russian source |
.github/workflows/robot.yml | Runs the robot and publishes the site |
.github/workflows/scout.yml | Runs the scout once a week |
test/robot/ | Robot and scout tests against a fake GitHub API |
test/mcp/ | MCP server tests |
.github/ISSUE_TEMPLATE/ | Submission and report forms in four languages |
server.mjs | Optional server for signing in with GitHub, see below |
vibemarket topic to their repository and publishes a release. Only people with rights to a repository can set its topics, so nobody can submit someone else's project.All numbers come from rules.json.
| Key | Meaning | Current value |
|---|---|---|
repo.minAgeDays | Minimum repository age, days | 30 |
repo.requireRelease | At least one release is required | yes |
repo.requireTopic | Topic that proves rights to the repository | vibemarket |
repo.allowForks | Accept forks | no |
repo.licenses | Allowed licenses (SPDX) | MIT, Apache-2.0, GPL and other open licenses |
voting.days | Voting period, days | 7 |
voting.votesNeeded | 👍 needed. 👍 − weight×👎 must also be at least this number | 10 |
voting.downvoteWeight | Weight of one 👎 | 2 |
voting.voterMinAgeDays | Minimum voter account age, days | 90 |
promotion.minDays, promotion.minStars | When to move an app to the main page | 90 days, 500 stars |
reports.toHide | Reports from different accounts that hide an app | 3 |
limits.candidatesPerAuthor | Submissions one author can have in voting at the same time | 3 |
scout.topics | GitHub topics the scout searches | desktop-app, electron-app, tauri-app and others |
scout.minStars | Minimum stars for a find | 1000 |
scout.releaseWithinDays | The latest release must be no older than this, days | 365 |
scout.perRun | Finds per run | 5 |
scout.skip | Repositories the scout never suggests | none |
Votes from the submission author, from accounts younger than the threshold, votes cast before voting started, and a 👍 together with a 👎 from the same person don't count. If the author changes the repository in the submission, voting starts over.
reports.toHide open reports from different accounts older than 90 days, the robot hides it from all shelves, search and pages. As soon as a maintainer closes the reports, the app comes back on its own.blocked label. Put it on an app's submission and the robot removes the app on its next run. Only people with rights to the market repository can set labels. To bring the app back, the author reopens the submission and it goes through voting again.The Get button downloads the app with one click, straight from the project's GitHub releases.
scripts/downloads.mjs). The extension gives the system: .dmg is macOS, .msi and .exe are Windows, .AppImage and .deb are Linux, .apk is Android. Words in the name give the processor: arm64 and aarch64, x64 and x86_64, universal. Checksums, signatures, server and command-line builds are dropped. Installers come before archives. The result goes to catalog.json with the size and SHA-256 of every file.downloads.skip in rules.json lists repositories whose release files aren't the app itself, such as a framework's command-line tool. downloads.tags keeps only matching releases when a repository publishes several products. Links to official download pages and web versions are in LINKS in index.html.
Once a week the scout (scripts/scout.mjs) searches GitHub for free open-source apps that aren't in the catalog yet. A find must:
scout.topics and at least scout.minStars stars;repo.licenses;scout.releaseWithinDays days;For every find the scout opens an issue labeled scout with the card fields already filled in. It builds the name from the repository name and guesses the category from its topics and description.
approved label. On its next run the robot adds the app to its category on the main page, comments with a link to its page and closes the issue. Approved finds have no «Third-party» badge: the maintainer picked them.An approved find is removed with the blocked label, and the daily re-check applies to it just like to sandbox apps. You can also add an app by hand: open an issue with the same fields and add the scout and approved labels.
The site is one page, but on GitHub Pages every app also gets its own address in every language, such as en/app/zed/ or ru/app/zed/. scripts/build-site.mjs builds them on every deploy. Each page has its own title and description, hreflang links to the other languages, schema.org markup and the app's text, so a search engine sees it even without JavaScript. The script on the page then turns it into the regular interface. Links inside the site lead to these addresses. The root address picks the visitor's language. Old links like #app-zed still work.
index.html in the repository stays a single file. Without the build (local file, server.mjs, previews) apps open at #app-zed as before.
To get the site indexed faster, add it to Google Search Console and Yandex Webmaster and submit sitemap.xml. To verify the site, put the verification HTML file (google….html, yandex_….html) in the root of the repository and the build copies it to the root of the site. Or put the meta tag codes into the repository variables GOOGLE_SITE_VERIFICATION and YANDEX_VERIFICATION (Settings → Secrets and variables → Actions → Variables), and the build adds them to the home page. Search engines only read robots.txt at the root of the domain, so a project site doesn't have one: submit the sitemap by hand.
VibeMarket has its own MCP server, scripts/mcp.mjs. An AI agent such as Claude Code, Claude Desktop or Cursor can use it to search the catalog, find free replacements for paid products and download the right installer for the computer it runs on.
Claude Code:
claude mcp add vibemarket -- npx -y github:NickGBar/VibeMarket
Claude Desktop, Cursor and other clients, in the mcpServers section of their settings:
{ "mcpServers": { "vibemarket": { "command": "npx", "args": ["-y", "github:NickGBar/VibeMarket"] } } }
| Tool | What it does |
|---|---|
find_alternative | Free replacements for a product: «Notion», «Photoshop», «Slack» |
search_apps | Search by keywords, category, platform or collection |
get_app | Description, platforms, license, links, and files with sizes and SHA-256 |
recent_updates | Apps with new releases |
list_collections | The «Instead of …» collections and the categories |
download_app | Downloads the installer for this computer from the app's GitHub release and checks its SHA-256 |
The server runs on your computer, has no dependencies and needs Node.js 22.9 or newer. It reads apps.json from the site: the whole catalog in machine-readable form, which anyone can use. download_app saves files to the Downloads folder, never overwrites existing files, only accepts links to the app's own GitHub releases and never runs installers: the user installs the app.
Some apps ship their own MCP server from their authors, so an agent can work inside them: the seven ArtCraft apps, draw.io, Excalidraw, Penpot, ComfyUI and Bitwarden. Their cards carry an «AI agent» mark, and the app page shows how to connect the server to Claude Code, with a copy button. Third-party MCP wrappers don't count: their code isn't reviewed by the app's authors. The list lives in AGENT in index.html, goes to apps.json, and search_apps with agent: true finds these apps.
The site, the GitHub forms and the robot's replies are available in Russian, English, Spanish and Chinese.
The site. The language switcher is in the header, and the choice is remembered in the browser. On the first visit the language comes from the browser settings; if it isn't one of these four, the site opens in English.
index.html: interface strings are in the <script type="application/json" id="i18n-ru"> block, catalog texts are in the CATS, APPS and DETAILS data. That's why the page opens instantly and works even as a plain file.locales/en.json, locales/es.json and locales/zh.json, and the page loads them when selected. Each file has a ui section with the same keys as the Russian block, cats with categories, and apps with descriptions, full texts and screenshot captions for every app in the catalog.Intl.PluralRules categories: one and other for English, plus many for Spanish, and just other for Chinese.GitHub forms. Each form has a version in every language: submit-app.yml (Russian), submit-app-en.yml, submit-app-es.yml, submit-app-zh.yml, and the same for report-app*.yml. The site opens the version in the visitor's language. Fields have the same ids in every version, and category, color and platforms are accepted both as ids (work, green, web) and as names in any of the four languages.
The robot detects the submission's language from the field labels and replies in it. Its texts and the form labels are in scripts/robot-i18n.mjs.
Only sandbox app texts are not translated: their authors write them.
Check the site translations against the Russian source:
npm run locales
The script reports missing and extra keys, wrong {name}-style variables, missing plural forms, missing app texts and HTML in translations. In GitHub Actions it runs before every deployment and prints warnings without blocking the deployment.
To add a language:
locales/en.json to locales/<code>.json and translate it. Add the code to LANGS and to the <select id="lang"> list in index.html.submit-app-<code>.yml and report-app-<code>.yml forms.FORM_LABELS and the robot texts to MESSAGES in scripts/robot-i18n.mjs.blocked label exists for emergencies.Legally, the owner of the repository is responsible for the market's content. Automation doesn't change that.
One-time setup:
main branch.The robot runs every hour, on every Issues event, on every push to main, and manually. Runs are queued one at a time. If a run drops out of the queue, the next scheduled run catches up: the robot re-reads all open submissions every time.
GitHub disables schedules in public repositories after 60 days without activity. The robot commits catalog.json whenever star counts change, so a live catalog always has activity.
The scout runs on Mondays and manually: Actions → Разведчик VibeMarket → Run workflow.
scripts/robot.mjs from the main branch.github-actions[bot], so nobody can fake when voting started.catalog.json as untrusted, and accepts download links only to the releases of the same repository on github.com.index.html in a browser: the page works without a server, using the catalog snapshot built into it.GH_TOKEN=$(gh auth token) npm run robot: a full robot run without writing to GitHub. Only catalog.json on disk changes.npm run stars: update the star snapshot built into index.html. It's used when catalog.json is unavailable.npm run locales: check translations against the Russian source.npm test: robot, scout and MCP server tests against a fake GitHub API, no network needed.npm run mcp: start the MCP server from the repository, for example to connect a local copy to an agent.GH_TOKEN=$(gh auth token) npm run scout: show what the scout would find right now, without opening issues.npm run site: build the site into _site/ the way GitHub Pages gets it.The market doesn't need a server. But if you run server.mjs, the site gets:
No dependencies, Node.js 22.9 or newer is required.
npm start
Create a GitHub App: https://github.com/settings/apps/new
http://localhost:3000.http://localhost:3000/auth/callback.Read and write. No other permissions are needed.Only on this account to try it yourself, Any account so other people can sign in.Copy the Client ID and generate a client secret.
Create .env from the example and paste both values into it:
cp .env.example .env
A GitHub App is used instead of an OAuth App because an OAuth App would need write access to all of the user's public repositories (public_repo) just to star projects.
How the server works:
HttpOnly and SameSite=Lax. Sign-in is protected with state and PKCE, and the token is revoked on sign-out.BASE_URL=https://your-domain and update the URLs in the GitHub App settings.VibeMarket's code and texts are released under the MIT License. Apps in the catalog and the sandbox belong to their authors and are distributed under their own licenses, which are shown on their cards.