@wenathlan/saddle 1.8.12 → 1.8.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,2617 @@
1
+ {
2
+ "count": 60,
3
+ "generatedAt": "2026-08-14T00:37:57.553Z",
4
+ "repositories": [
5
+ {
6
+ "fullName": "vercel-labs/agent-browser",
7
+ "url": "https://github.com/vercel-labs/agent-browser",
8
+ "categories": [
9
+ "browser automation"
10
+ ],
11
+ "description": "Browser automation CLI for AI agents",
12
+ "language": "Rust",
13
+ "license": "Apache-2.0",
14
+ "stars": 40571,
15
+ "forks": 2672,
16
+ "updatedAt": "2026-08-14T00:20:08Z",
17
+ "pushedAt": "2026-08-13T22:21:41Z",
18
+ "archived": false,
19
+ "defaultBranch": "main",
20
+ "readmeExcerpt": "# agent-browser\n\nBrowser automation CLI for AI agents. Fast native Rust CLI.\n\n[![skills.sh](https://skills.sh/b/vercel-labs/agent-browser)](https://skills.sh/vercel-labs/agent-browser)\n\n## Installation\n\n### Global Installation (recommended)\n\nInstalls the native Rust binary:\n\n```bash\nnpm install -g agent-browser\nagent-browser install # Download Chrome from Chrome for Testing (first time only)\n```\n\n### Project Installation (local dependency)\n\nFor projects that want to pin the version in `package.json`:\n\n```bash\nnpm install agent-browser\nagent-browser install\n```\n\nThen use via `package.json` scripts or by invoking `agent-browser` directly.\n\n### Homebrew (macOS)\n\n```bash\nbrew install agent-browser\nagent-browser install # Download Chrome from Chrome for Testing (first time only)\n```\n\n### Cargo (Rust)\n\n```bash\ncargo install agent-browser\nagent-browser install # Download Chrome from Chrome for Testing (first time only)\n```\n\n### From Source\n\nRequires Node.js 24+, pnpm 11+, and Rust.\n\n```bash\ngit clone https://github.com/vercel-labs/agent-browser\ncd agent-browser\npnpm install\npnpm build\npnpm build:native # Requires Rust (https://rustup.rs)\npnpm link --global # Makes agent-browser available globally\nagent-browser install\n```\n\n### Linux Dependencies\n\nOn Linux, install system dependencies:\n\n```bash\nagent-browser install --with-deps\n```\n\nThis exits nonzero if the package manager cannot install every required browser library.\n\n### Updating\n\nUpgrade to the latest version:\n\n```bash\nagent-browser upgrade\n```\n\nDetects your installation method (npm, Homebrew, or Cargo) and runs the appropriate update command automatically.\n\n### Requirements\n\n- **Chrome** - Run `agent-browser install` to download Chrome from [Chrome for Testing](https://developer.chrome.com/blog/chrome-for-testing/) (Google's official automation channel). Existing Chrome, Brave, Playwright, and Puppeteer installations are detected automatically. No Playwright or Node.js required for the daemon.\n- **Node.js 24+ and pnpm 11+** - Only needed when building from source.\n- **Rust** - Only needed when building from source (see From Source above).\n\n## Quick Start\n\n```bash\nagent-browser open example.com\nagent-browser snapshot # Get accessibility tree with refs\nagent-browser click @e2 # Click by ref from snapshot\nagent-browser fill @e3 \"test@example.com\" # Fill by ref\nagent-brow",
21
+ "relevantPaths": [
22
+ ".claude-plugin/marketplace.json",
23
+ ".github/workflows/ci.yml",
24
+ ".github/workflows/release.yml",
25
+ "LICENSE",
26
+ "agent-browser.schema.json",
27
+ "benchmarks/package.json",
28
+ "bin/agent-browser.js",
29
+ "cli/Cargo.toml",
30
+ "cli/cdp-protocol/browser_protocol.json",
31
+ "cli/src/native/browser.rs",
32
+ "cli/src/native/e2e_tests.rs",
33
+ "cli/src/native/parity_tests.rs",
34
+ "cli/src/native/storage.rs",
35
+ "cli/src/native/test_fixtures/drag_probe.html",
36
+ "cli/src/native/test_fixtures/html5_drag_probe.html",
37
+ "cli/src/native/test_fixtures/pointer_capture_probe.html",
38
+ "cli/src/native/test_fixtures/upload_probe.html",
39
+ "cli/src/plugins.rs",
40
+ "cli/src/test_utils.rs",
41
+ "cli/tests/doctor_cli.rs",
42
+ "cli/tests/pin_tab_cli.rs",
43
+ "docs/package.json",
44
+ "docs/src/app/plugins/layout.tsx",
45
+ "docs/src/app/plugins/page.mdx",
46
+ "docs/src/app/providers/browser-use/layout.tsx",
47
+ "docs/src/app/providers/browser-use/page.mdx",
48
+ "docs/src/app/providers/browserbase/layout.tsx",
49
+ "docs/src/app/providers/browserbase/page.mdx",
50
+ "docs/src/app/providers/browserless/layout.tsx",
51
+ "docs/src/app/providers/browserless/page.mdx"
52
+ ],
53
+ "codeSamples": [
54
+ {
55
+ "path": "bin/agent-browser.js",
56
+ "url": "https://github.com/vercel-labs/agent-browser/blob/main/bin/agent-browser.js",
57
+ "excerpt": "#!/usr/bin/env node\n\n/**\n * Cross-platform CLI wrapper for agent-browser\n * \n * This wrapper enables npx support on Windows where shell scripts don't work.\n * For global installs, postinstall.js patches the shims to invoke the native\n * binary directly (zero overhead).\n */\n\nimport { spawn, execSync } from 'child_process';\nimport { existsSync, accessSync, chmodSync, constants } from 'fs';\nimport { dirname, join } from 'path';\nimport { fileURLToPath } from 'url';\nimport { platform, arch } from 'os';\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\n\n// Detect if the system uses musl libc (e.g. Alpine Linux)\nfunction isMusl() {\n if (platform() !== 'linux') return false;\n try {\n const result = execSync('ldd --version 2>&1 || true', { encoding: 'utf8' });\n return result.toLowerCase().includes('musl');\n } catch {\n return existsSync('/lib/ld-musl-x86_64.so.1') || existsSync('/lib/ld-musl-aarch64.so.1');\n }\n}\n\n// Map Node.js platform/arch to binary naming convention\nfunction getBinaryName() {\n const os = platform();\n const cpuArch = arch();\n\n let osKey;\n switch (os) {\n case 'darwin':\n osKey = 'darwin';\n break;\n case 'linux':\n osKey = isMusl() ? 'linux-musl' : 'linux';\n break;\n case 'win32':\n osKey = 'win32';\n break;\n default:\n return null;\n }\n\n let archKey;\n switch (cpuArch) {\n case 'x64':\n case 'x86_64':\n archKey = 'x64';\n break;\n case 'arm64':\n case 'aarch64':\n archKey = 'arm64';\n break;\n default:\n return null;\n }\n\n const ext = os === 'win32' ? '.exe' : '';\n ret"
58
+ },
59
+ {
60
+ "path": "cli/src/native/browser.rs",
61
+ "url": "https://github.com/vercel-labs/agent-browser/blob/main/cli/src/native/browser.rs",
62
+ "excerpt": "use serde_json::{json, Value};\nuse std::collections::{HashMap, HashSet};\nuse std::future::Future;\nuse std::sync::Arc;\nuse std::time::{Duration, Instant};\nuse tokio::sync::{broadcast, Mutex};\n\nuse super::cdp::chrome::{auto_connect_cdp, launch_chrome, ChromeProcess, LaunchOptions};\nuse super::cdp::client::CdpClient;\nuse super::cdp::discovery::discover_cdp_url;\nuse super::cdp::lightpanda::{launch_lightpanda, LightpandaLaunchOptions, LightpandaProcess};\nuse super::cdp::types::*;\nuse super::element::{resolve_element_object_id, RefMap};\nuse super::tab_binding;\n\n// ---------------------------------------------------------------------------\n// Launch validation\n// ---------------------------------------------------------------------------\n\n/// Validates launch/connect options for incompatible combinations.\n/// Returns `Ok(())` if valid, or `Err(msg)` with a user-friendly error.\npub fn validate_launch_options(\n extensions: Option<&[String]>,\n has_cdp: bool,\n profile: Option<&str>,\n storage_state: Option<&str>,\n allow_file_access: bool,\n executable_path: Option<&str>,\n) -> Result<(), String> {\n let has_extensions = extensions.map(|e| !e.is_empty()).unwrap_or(false);\n\n if has_extensions && has_cdp {\n return Err(\n \"Cannot use extensions with cdp_url (extensions require local browser launch)\"\n .to_string(),\n );\n }\n if profile.is_some() && has_cdp {\n return Err(\n \"Cannot use profile with cdp_url (profile requires local browser launch)\".to_string(),\n );\n }\n if storage_state.is_some() && pr"
63
+ }
64
+ ]
65
+ },
66
+ {
67
+ "fullName": "SeleniumHQ/selenium",
68
+ "url": "https://github.com/SeleniumHQ/selenium",
69
+ "categories": [
70
+ "browser automation"
71
+ ],
72
+ "description": "A browser automation framework and ecosystem.",
73
+ "language": "Java",
74
+ "license": "Apache-2.0",
75
+ "stars": 34368,
76
+ "forks": 8712,
77
+ "updatedAt": "2026-08-13T16:25:32Z",
78
+ "pushedAt": "2026-08-13T18:17:27Z",
79
+ "archived": false,
80
+ "defaultBranch": "trunk",
81
+ "readmeExcerpt": "<h1 align=\"center\">\n <br/>\n <a href=\"https://selenium.dev\"><img src=\"common/images/selenium_logo_mark_green.svg\" alt=\"Selenium\" width=\"100\"></a>\n <br/>\n Selenium\n <br/>\n</h1>\n\n<h3 align=\"center\">Automates browsers. That's it!</h3>\n\n<p align=\"center\">\n <a href=\"#contributing\">Contributing</a> •\n <a href=\"#installing\">Installing</a> •\n <a href=\"#building\">Building</a> •\n <a href=\"#developing\">Developing</a> •\n <a href=\"#testing\">Testing</a> •\n <a href=\"#documenting\">Documenting</a> •\n <a href=\"#releasing\">Releasing</a>\n</p>\n\n<br>\n\nSelenium is an umbrella project encapsulating a variety of tools and\nlibraries enabling web browser automation. Selenium specifically\nprovides an infrastructure for the [W3C WebDriver specification](https://w3c.github.io/webdriver/)\n— a platform and language-neutral coding interface compatible with all\nmajor web browsers.\n\nThe project is made possible by volunteer contributors who've\ngenerously donated thousands of hours in code development and upkeep.\n\nThis README is for developers interested in contributing to the project.\nFor people looking to get started using Selenium, please check out\nour [User Manual](https://selenium.dev/documentation/) for detailed examples and descriptions, and if you\nget stuck, there are several ways to [Get Help](https://www.selenium.dev/support/).\n\n[![CI](https://github.com/SeleniumHQ/selenium/actions/workflows/ci.yml/badge.svg?event=push)](https://github.com/SeleniumHQ/selenium/actions/workflows/ci.yml)\n[![CI - RBE](https://github.com/SeleniumHQ/selenium/actions/workflows/ci-rbe.yml/badge.svg?event=push)](https://github.com/SeleniumHQ/selenium/actions/workflows/ci-rbe.yml)\n[![Releases downloads](https://img.shields.io/github/downloads/SeleniumHQ/selenium/total.svg)](https://github.com/SeleniumHQ/selenium/releases)\n\n## Contributing\n\nPlease read [CONTRIBUTING.md](https://github.com/SeleniumHQ/selenium/blob/trunk/CONTRIBUTING.md)\nbefore submitting your pull requests.\n\n## Installing\n\nThese are the requirements to create your own local dev environment to contribute to Selenium.\n\n### All Platforms\n\n* [Bazelisk](https://github.com/bazelbuild/bazelisk), a Bazel wrapper that automatically downloads\n the version of Bazel specified in `.bazelversion` file and transparently passes through all\n command-line arguments to the real Bazel binary.\n* Java JDK version 17 or greater (e.g., [Java 17 Temurin](ht",
82
+ "relevantPaths": [
83
+ ".github/release.yml",
84
+ ".github/rulesets/release-require-passing.json",
85
+ ".github/rulesets/release-restrict-trunk.json",
86
+ ".github/workflows/bazel.yml",
87
+ ".github/workflows/ci-build-index.yml",
88
+ ".github/workflows/ci-dotnet.yml",
89
+ ".github/workflows/ci-grid.yml",
90
+ ".github/workflows/ci-java.yml",
91
+ ".github/workflows/ci-javascript.yml",
92
+ ".github/workflows/ci-lint.yml",
93
+ ".github/workflows/ci-python.yml",
94
+ ".github/workflows/ci-rbe.yml",
95
+ ".github/workflows/ci-renovate-rbe.yml",
96
+ ".github/workflows/ci-ruby.yml",
97
+ ".github/workflows/ci-rust.yml",
98
+ ".github/workflows/ci.yml",
99
+ ".github/workflows/commit-changes.yml",
100
+ ".github/workflows/delete-comments.yml",
101
+ ".github/workflows/get-approval.yml",
102
+ ".github/workflows/gh-cache.yml",
103
+ ".github/workflows/issue-labeler.yml",
104
+ ".github/workflows/label-commenter.yml",
105
+ ".github/workflows/lock.yml",
106
+ ".github/workflows/mirror-selenium-releases.yml",
107
+ ".github/workflows/nightly.yml",
108
+ ".github/workflows/parse-release-tag.yml",
109
+ ".github/workflows/pin-browsers.yml",
110
+ ".github/workflows/pr-labeler.yml",
111
+ ".github/workflows/pre-release.yml",
112
+ ".github/workflows/prune-caches.yml"
113
+ ],
114
+ "codeSamples": []
115
+ },
116
+ {
117
+ "fullName": "segment-boneyard/nightmare",
118
+ "url": "https://github.com/segment-boneyard/nightmare",
119
+ "categories": [
120
+ "browser automation"
121
+ ],
122
+ "description": "A high-level browser automation library.",
123
+ "language": "JavaScript",
124
+ "license": null,
125
+ "stars": 19779,
126
+ "forks": 1064,
127
+ "updatedAt": "2026-08-13T07:21:30Z",
128
+ "pushedAt": "2024-04-20T17:54:13Z",
129
+ "archived": false,
130
+ "defaultBranch": "master",
131
+ "readmeExcerpt": "*NOTICE: This library is no longer maintained.*\n\n[![Build Status](https://img.shields.io/circleci/project/segmentio/nightmare/master.svg)](https://circleci.com/gh/segmentio/nightmare)\n[![Join the chat at https://gitter.im/rosshinkley/nightmare](https://badges.gitter.im/rosshinkley/nightmare.svg)](https://gitter.im/rosshinkley/nightmare?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)\n\n# Nightmare\n\nNightmare is a high-level browser automation library from [Segment](https://segment.com).\n\nThe goal is to expose a few simple methods that mimic user actions (like `goto`, `type` and `click`), with an API that feels synchronous for each block of scripting, rather than deeply nested callbacks. It was originally designed for automating tasks across sites that don't have APIs, but is most often used for UI testing and crawling.\n\nUnder the covers it uses [Electron](http://electron.atom.io/), which is similar to [PhantomJS](http://phantomjs.org/) but roughly [twice as fast](https://github.com/segmentio/nightmare/issues/484#issuecomment-184519591) and more modern. \n\n**⚠️ Security Warning:** We've implemented [many](https://github.com/segmentio/nightmare/issues/1388) of the security recommendations [outlined by Electron](https://github.com/electron/electron/blob/master/docs/tutorial/security.md) to try and keep you safe, but undiscovered vulnerabilities may exist in Electron that could allow a malicious website to execute code on your computer. Avoid visiting untrusted websites.\n\n**🛠 Migrating to 3.x:** You'll want to check out [this issue](https://github.com/segmentio/nightmare/issues/1396) before upgrading. We've worked hard to make improvements to nightmare while limiting the breaking changes and there's a good chance you won't need to do anything.\n\n[Niffy](https://github.com/segmentio/niffy) is a perceptual diffing tool built on Nightmare. It helps you detect UI changes and bugs across releases of your web app.\n\n[Daydream](https://github.com/segmentio/daydream) is a complementary chrome extension built by [@stevenmiller888](https://github.com/stevenmiller888) that generates Nightmare scripts for you while you browse.\n\nMany thanks to [@matthewmueller](https://github.com/matthewmueller) and [@rosshinkley](https://github.com/rosshinkley) for their help on Nightmare.\n\n* [Examples](#examples)\n * [UI Testing Quick Start](https://segment.com/blog/",
132
+ "relevantPaths": [
133
+ "lib/runner.js",
134
+ "package.json",
135
+ "test/Preferences",
136
+ "test/bb-xvfb",
137
+ "test/files/globals.js",
138
+ "test/files/jquery-1.9.0.min.js",
139
+ "test/files/jquery-2.1.1.min.js",
140
+ "test/files/nightmare-created.js",
141
+ "test/files/nightmare-error.js",
142
+ "test/files/nightmare-unended.js",
143
+ "test/files/server.crt",
144
+ "test/files/server.key",
145
+ "test/files/test.css",
146
+ "test/fixtures/cookies/index.html",
147
+ "test/fixtures/evaluation/index.html",
148
+ "test/fixtures/events/index.html",
149
+ "test/fixtures/manipulation/index.html",
150
+ "test/fixtures/manipulation/result.html",
151
+ "test/fixtures/manipulation/results.html",
152
+ "test/fixtures/navigation/a.html",
153
+ "test/fixtures/navigation/b.html",
154
+ "test/fixtures/navigation/c.html",
155
+ "test/fixtures/navigation/hanging-resources.html",
156
+ "test/fixtures/navigation/index.html",
157
+ "test/fixtures/navigation/invalid-frame.html",
158
+ "test/fixtures/navigation/invalid-image.html",
159
+ "test/fixtures/navigation/valid-frame.html",
160
+ "test/fixtures/options/index.html",
161
+ "test/fixtures/preload/index.html",
162
+ "test/fixtures/preload/index.js"
163
+ ],
164
+ "codeSamples": [
165
+ {
166
+ "path": "lib/runner.js",
167
+ "url": "https://github.com/segment-boneyard/nightmare/blob/master/lib/runner.js",
168
+ "excerpt": "/**\n * Module Dependencies\n */\n\nvar parent = require('./ipc')(process)\nvar electron = require('electron')\nvar BrowserWindow = electron.BrowserWindow\nvar defaults = require('deep-defaults')\nvar join = require('path').join\nvar sliced = require('sliced')\nvar renderer = require('electron').ipcMain\nvar app = require('electron').app\nvar urlFormat = require('url')\nvar FrameManager = require('./frame-manager')\n\n// URL protocols that don't need to be checked for validity\nconst KNOWN_PROTOCOLS = ['http', 'https', 'file', 'about', 'javascript']\n// Property for tracking whether a window is ready for interaction\nconst IS_READY = Symbol('isReady')\n\n/**\n * Handle uncaught exceptions in the main electron process\n */\n\nprocess.on('uncaughtException', function(err) {\n parent.emit('uncaughtException', err.stack || err.message || String(err))\n})\n\n/**\n * Update the app paths\n */\n\nif (process.argv.length < 3) {\n throw new Error(`Too few runner arguments: ${JSON.stringify(process.argv)}`)\n}\n\nvar processArgs = JSON.parse(process.argv[2])\nvar paths = processArgs.paths\nif (paths) {\n for (let i in paths) {\n app.setPath(i, paths[i])\n }\n}\nvar switches = processArgs.switches\nif (switches) {\n for (let i in switches) {\n app.commandLine.appendSwitch(i, switches[i])\n }\n}\n\n/**\n * Hide the dock\n */\n\n// app.dock is not defined when running\n// electron in a platform other than OS X\nif (!processArgs.dock && app.dock) {\n app.dock.hide()\n}\n\n/**\n * Set the client certificate by subjectName if processArgs.certificateSubjectName is defined\n */\n\nif (processArgs.certificateSubjectName) {\n app.on(\n 'sele"
169
+ },
170
+ {
171
+ "path": "test/files/globals.js",
172
+ "url": "https://github.com/segment-boneyard/nightmare/blob/master/test/files/globals.js",
173
+ "excerpt": "/** @type {Comment} [description] */\nglobalNumber = 7;\n"
174
+ }
175
+ ]
176
+ },
177
+ {
178
+ "fullName": "pinchtab/pinchtab",
179
+ "url": "https://github.com/pinchtab/pinchtab",
180
+ "categories": [
181
+ "browser automation"
182
+ ],
183
+ "description": "High-performance browser automation bridge and multi-instance orchestrator with advanced stealth injection and real-time dashboard.",
184
+ "language": "Go",
185
+ "license": "MIT",
186
+ "stars": 10034,
187
+ "forks": 751,
188
+ "updatedAt": "2026-08-13T22:48:20Z",
189
+ "pushedAt": "2026-08-12T10:45:33Z",
190
+ "archived": false,
191
+ "defaultBranch": "main",
192
+ "readmeExcerpt": "<p align=\"center\">\n <img src=\"assets/pinchtab-headless.png\" alt=\"PinchTab\" width=\"200\"/>\n</p>\n\n<p align=\"center\">\n <strong>PinchTab</strong><br/>\n <strong>Browser control for AI agents</strong><br/>\n Small Go binary • HTTP API • Token-efficient\n</p>\n\n\n<table align=\"center\">\n <tr>\n <td align=\"center\" valign=\"middle\">\n <a href=\"https://pinchtab.com/docs\"><img src=\"assets/docs-no-background-256.png\" alt=\"Full Documentation\" width=\"92\"/></a>\n </td>\n <td align=\"left\" valign=\"middle\">\n <a href=\"https://github.com/pinchtab/pinchtab/releases/latest\"><img src=\"https://img.shields.io/github/v/release/pinchtab/pinchtab?style=flat-square&color=FFD700\" alt=\"Release\"/></a><br/>\n <a href=\"https://github.com/pinchtab/pinchtab/actions/workflows/ci-go.yml\"><img src=\"https://img.shields.io/github/actions/workflow/status/pinchtab/pinchtab/ci-go.yml?branch=main&style=flat-square&label=Go%20CI\" alt=\"Go CI\"/></a><br/>\n <img src=\"https://img.shields.io/badge/Go-1.25+-00ADD8?style=flat-square&logo=go&logoColor=white\" alt=\"Go 1.25+\"/><br/>\n <a href=\"LICENSE\"><img src=\"https://img.shields.io/badge/license-Apache%202.0-blue?style=flat-square\" alt=\"License\"/></a>\n </td>\n </tr>\n</table>\n\n---\n\n## What is PinchTab?\n\nPinchTab is a **standalone HTTP server** that gives AI agents direct control over Chrome.\n\nFor day-to-day local use, the server is typically installed as a user-level daemon, allowing agent tools to reuse the same browser control plane running in the background.\n\n```bash\ncurl -fsSL https://pinchtab.com/install.sh | bash\n# or\npinchtab daemon install\n```\n\nThis installs the control-plane server and starts a default headless Chrome instance, ready to accept requests from agents or manual API calls.\n\nPinchTab is designed first for local, single-user control on a machine you manage. Remote and distributed layouts are supported, but they are advanced operator-managed deployments. If you bind beyond loopback, publish ports, or attach remote bridges, you are responsible for tokens, network boundaries, TLS or reverse proxying, and which endpoint families you expose.\n\nIf you run PinchTab on a different machine, do it only when you understand the security model. Keep it on a private or otherwise closed network, avoid exposing it directly to the public internet, and keep high-risk endpoint families disabled unless you explicitly need them. If you d",
193
+ "relevantPaths": [
194
+ ".github/workflows/ci-branch-naming.yml",
195
+ ".github/workflows/ci-dashboard.yml",
196
+ ".github/workflows/ci-docs.yml",
197
+ ".github/workflows/ci-e2e.yml",
198
+ ".github/workflows/ci-go.yml",
199
+ ".github/workflows/ci-npm.yml",
200
+ ".github/workflows/ci-plugin.yml",
201
+ ".github/workflows/ci-smoke.yml",
202
+ ".github/workflows/release-manual-publish.yml",
203
+ ".github/workflows/release-post-verify.yml",
204
+ ".github/workflows/release.yml",
205
+ ".github/workflows/reusable-dashboard.yml",
206
+ ".github/workflows/reusable-docs.yml",
207
+ ".github/workflows/reusable-e2e.yml",
208
+ ".github/workflows/reusable-go.yml",
209
+ ".github/workflows/reusable-npm.yml",
210
+ ".github/workflows/reusable-plugin.yml",
211
+ ".github/workflows/reusable-publish-plugin.yml",
212
+ ".github/workflows/reusable-publish-skill.yml",
213
+ ".github/workflows/reusable-release-publish.yml",
214
+ ".github/workflows/reusable-smoke.yml",
215
+ ".github/workflows/reusable-validate-release-secrets.yml",
216
+ ".github/workflows/reusable-validate-release.yml",
217
+ ".goreleaser.yml",
218
+ "Dockerfile",
219
+ "LICENSE",
220
+ "RELEASE.md",
221
+ "TESTING.md",
222
+ "cmd/pinchtab/build_test.go",
223
+ "cmd/pinchtab/capability_remedy_executable_test.go"
224
+ ],
225
+ "codeSamples": [
226
+ {
227
+ "path": "cmd/pinchtab/build_test.go",
228
+ "url": "https://github.com/pinchtab/pinchtab/blob/main/cmd/pinchtab/build_test.go",
229
+ "excerpt": "package main\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"testing\"\n\n\t\"gopkg.in/yaml.v3\"\n)\n\n// GoReleaserConfig represents the minimal goreleaser config we care about\ntype GoReleaserConfig struct {\n\tBuilds []struct {\n\t\tGOOS []string `yaml:\"goos\"`\n\t\tGOARCH []string `yaml:\"goarch\"`\n\t} `yaml:\"builds\"`\n}\n\n// TestBinaryPermutations verifies all expected binary permutations are configured in goreleaser\nfunc TestBinaryPermutations(t *testing.T) {\n\trepoRoot := filepath.Join(\"..\", \"..\", \".goreleaser.yml\")\n\tdata, err := os.ReadFile(repoRoot)\n\tif err != nil {\n\t\tt.Fatalf(\"failed to read .goreleaser.yml at %s: %v\", repoRoot, err)\n\t}\n\n\tvar cfg GoReleaserConfig\n\tif err := yaml.Unmarshal(data, &cfg); err != nil {\n\t\tt.Fatalf(\"failed to parse .goreleaser.yml: %v\", err)\n\t}\n\n\tif len(cfg.Builds) == 0 {\n\t\tt.Fatal(\"no builds configured in .goreleaser.yml\")\n\t}\n\n\tbuild := cfg.Builds[0]\n\n\texpectedOS := map[string]bool{\n\t\t\"linux\": true,\n\t\t\"darwin\": true,\n\t\t\"windows\": true,\n\t}\n\n\texpectedArch := map[string]bool{\n\t\t\"amd64\": true,\n\t\t\"arm64\": true,\n\t}\n\n\tfor os := range expectedOS {\n\t\tfound := false\n\t\tfor _, configOS := range build.GOOS {\n\t\t\tif configOS == os {\n\t\t\t\tfound = true\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tif !found {\n\t\t\tt.Errorf(\"OS %q not found in goreleaser config\", os)\n\t\t}\n\t}\n\n\tfor arch := range expectedArch {\n\t\tfound := false\n\t\tfor _, configArch := range build.GOARCH {\n\t\t\tif configArch == arch {\n\t\t\t\tfound = true\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tif !found {\n\t\t\tt.Errorf(\"Architecture %q not found in goreleaser config\", arch)\n\t\t}\n\t}\n\n\ttotalExpected := len(expectedOS) * len(expectedArch)\n\ttotalConfigured := len(build.GOOS) * len(b"
230
+ },
231
+ {
232
+ "path": "cmd/pinchtab/capability_remedy_executable_test.go",
233
+ "url": "https://github.com/pinchtab/pinchtab/blob/main/cmd/pinchtab/capability_remedy_executable_test.go",
234
+ "excerpt": "package main\n\nimport (\n\t\"reflect\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/pinchtab/pinchtab/internal/config\"\n\t\"github.com/pinchtab/pinchtab/internal/httpx\"\n\t\"github.com/pinchtab/pinchtab/internal/remedy\"\n\t\"github.com/pinchtab/pinchtab/internal/routes\"\n\t\"github.com/spf13/cobra\"\n)\n\n// capabilitySettings are the config paths a capability refusal can name, derived\n// from the route catalogue. Clipboard is appended because it gates endpoints\n// without a catalogue entry, so nothing else would carry it here.\nfunc capabilitySettings(t *testing.T) []string {\n\tt.Helper()\n\n\tsettings := []string{\"security.allowClipboard\"}\n\tfor capability := range routes.CapabilityEndpoints() {\n\t\tmeta, ok := routes.Meta(capability)\n\t\tif !ok {\n\t\t\tt.Errorf(\"capability %q gates endpoints but has no metadata\", capability)\n\t\t\tcontinue\n\t\t}\n\t\tsettings = append(settings, meta.Setting)\n\t}\n\tif len(settings) < 2 {\n\t\tt.Fatal(\"no capability settings found; this test would prove nothing\")\n\t}\n\treturn settings\n}\n\n// A remedy an agent cannot execute is not a remedy. This resolves each command in EVERY\n// declared remedy against the REAL command tree — the same rootCmd the binary runs — rather\n// than eyeballing the strings, because the failure mode being closed is a remedy that reads\n// plausibly and dead-ends when run.\n//\n// It walks remedy.Templates() rather than a list of producers, which is why it covers a\n// producer added after it was written: declaring a remedy anywhere in the binary's import\n// graph registers it, and this test links the whole binary. The guard started life covering\n// the capability refusal alone,"
235
+ }
236
+ ]
237
+ },
238
+ {
239
+ "fullName": "laravel/dusk",
240
+ "url": "https://github.com/laravel/dusk",
241
+ "categories": [
242
+ "browser automation"
243
+ ],
244
+ "description": "Laravel Dusk provides simple end-to-end testing and browser automation.",
245
+ "language": "PHP",
246
+ "license": "MIT",
247
+ "stars": 1944,
248
+ "forks": 329,
249
+ "updatedAt": "2026-08-13T12:09:45Z",
250
+ "pushedAt": "2026-07-24T15:49:00Z",
251
+ "archived": false,
252
+ "defaultBranch": "8.x",
253
+ "readmeExcerpt": "<p align=\"center\"><img width=\"309\" height=\"86\" src=\"/art/logo.svg\" alt=\"Logo Laravel Dusk\"></p>\n\n<p align=\"center\">\n<a href=\"https://github.com/laravel/dusk/actions\"><img src=\"https://github.com/laravel/dusk/workflows/tests/badge.svg\" alt=\"Build Status\"></a>\n<a href=\"https://packagist.org/packages/laravel/dusk\"><img src=\"https://img.shields.io/packagist/dt/laravel/dusk\" alt=\"Total Downloads\"></a>\n<a href=\"https://packagist.org/packages/laravel/dusk\"><img src=\"https://img.shields.io/packagist/v/laravel/dusk\" alt=\"Latest Stable Version\"></a>\n<a href=\"https://packagist.org/packages/laravel/dusk\"><img src=\"https://img.shields.io/packagist/l/laravel/dusk\" alt=\"License\"></a>\n</p>\n\n## Introduction\n\nLaravel Dusk provides an expressive, easy-to-use browser automation and testing API. By default, Dusk does not require you to install JDK or Selenium on your machine. Instead, Dusk uses a standalone Chromedriver. However, you are free to utilize any other Selenium driver you wish.\n\n## Official Documentation\n\nDocumentation for Dusk can be found on the [Laravel website](https://laravel.com/docs/dusk).\n\n## Contributing\n\nThank you for considering contributing to Dusk! The contribution guide can be found in the [Laravel documentation](https://laravel.com/docs/contributions).\n\n## Code of Conduct\n\nIn order to ensure that the Laravel community is welcoming to all, please review and abide by the [Code of Conduct](https://laravel.com/docs/contributions#code-of-conduct).\n\n## Security Vulnerabilities\n\nPlease review [our security policy](https://github.com/laravel/dusk/security/policy) on how to report security vulnerabilities.\n\n## License\n\nLaravel Dusk is open-sourced software licensed under the [MIT license](LICENSE.md).\n",
254
+ "relevantPaths": [
255
+ ".github/workflows/browser-tests.yml",
256
+ ".github/workflows/dependabot-auto-merge.yml",
257
+ ".github/workflows/issues.yml",
258
+ ".github/workflows/pull-requests.yml",
259
+ ".github/workflows/static-analysis.yml",
260
+ ".github/workflows/tests.yml",
261
+ ".github/workflows/update-changelog.yml",
262
+ ".github/workflows/update-jquery.yml",
263
+ "LICENSE.md",
264
+ "package.json",
265
+ "src/Browser.php",
266
+ "src/Concerns/ProvidesBrowser.php",
267
+ "src/Console/Concerns/InteractsWithTestingFrameworks.php",
268
+ "src/Console/stubs/test.pest.stub",
269
+ "src/Console/stubs/test.stub",
270
+ "src/TestCase.php",
271
+ "stubs/DuskTestCase.stub",
272
+ "stubs/ExampleTest.pest.stub",
273
+ "stubs/ExampleTest.stub",
274
+ "testbench.yaml",
275
+ "tests/Browser/BrowserTest.php",
276
+ "tests/Browser/DuskTestCase.php",
277
+ "tests/Browser/console/.gitignore",
278
+ "tests/Browser/screenshots/.gitignore",
279
+ "tests/Browser/source/.gitignore",
280
+ "tests/Concerns/InteractsWithElementsTest.php",
281
+ "tests/Concerns/SwapsUrlGenerator.php",
282
+ "tests/Feature/SupportsChromeTest.php",
283
+ "tests/Unit/BrowserTest.php",
284
+ "tests/Unit/ChromeProcessTest.php"
285
+ ],
286
+ "codeSamples": []
287
+ },
288
+ {
289
+ "fullName": "hyperbrowserai/HyperAgent",
290
+ "url": "https://github.com/hyperbrowserai/HyperAgent",
291
+ "categories": [
292
+ "browser automation"
293
+ ],
294
+ "description": "AI Browser Automation",
295
+ "language": "TypeScript",
296
+ "license": "NOASSERTION",
297
+ "stars": 1530,
298
+ "forks": 196,
299
+ "updatedAt": "2026-08-13T07:30:36Z",
300
+ "pushedAt": "2026-05-11T21:41:09Z",
301
+ "archived": false,
302
+ "defaultBranch": "main",
303
+ "readmeExcerpt": "<div align=\"center\">\n <img src=\"assets/hyperagent-banner.png\" alt=\"Hyperagent Banner\" width=\"800\"/>\n\n <p align=\"center\">\n <strong>Intelligent Browser Automation with LLMs</strong>\n </p>\n\n <p align=\"center\">\n <a href=\"https://www.npmjs.com/package/@hyperbrowser/agent\">\n <img src=\"https://img.shields.io/npm/v/@hyperbrowser/agent?style=flat-square\" alt=\"npm version\" />\n </a>\n <a href=\"https://github.com/hyperbrowserai/hyperagent/blob/main/LICENSE\">\n <img src=\"https://img.shields.io/npm/l/@hyperbrowser/agent?style=flat-square\" alt=\"license\" />\n </a>\n <a href=\"https://discord.gg/zsYzsgVRjh\" style=\"text-decoration:none;\">\n <img alt=\"Discord\" src=\"https://img.shields.io/discord/1313014141165764619?style=flat-square&color=blue\">\n </a>\n <a href=\"https://x.com/AkshayShekhaw12\">\n <img alt=\"X (formerly Twitter) Follow\" src=\"https://img.shields.io/twitter/follow/AkshayShekhaw12?style=social\">\n </a>\n </p>\n</div>\n\n## Overview\n\nHyperagent is Playwright supercharged with AI. No more brittle scripts, just powerful natural language commands.\nJust looking for scalable headless browsers or scraping infra? Go to [Hyperbrowser](https://app.hyperbrowser.ai/) to get started for free!\n\nView HyperAgent docs here: https://www.hyperbrowser.ai/docs/hyperagent/introduction\n\n### Features\n\n- 🤖 **AI Commands**: Simple APIs like `page.ai()`, `page.extract()` and `executeTask()` for any AI automation\n- ⚡ **Fallback to Regular Playwright**: Use regular Playwright when AI isn't needed\n- 🥷 **Stealth Mode** – Avoid detection with built-in anti-bot patches\n- ☁️ **Cloud Ready** – Instantly scale to hundreds of sessions via [Hyperbrowser](https://app.hyperbrowser.ai/)\n- 🔌 **MCP Client** – Connect to tools like Composio for full workflows (e.g. writing web data to Google Sheets)\n- 📼 **Action Caching** – Record and replay workflows deterministically without LLM calls\n\n## Quick Start\n\n### Installation\n\n```bash\n# Using npm\nnpm install @hyperbrowser/agent\n\n# Using yarn\nyarn add @hyperbrowser/agent\n```\n\n### CLI\n\n```bash\n$ npx @hyperbrowser/agent -c \"Find a route from Miami to New Orleans, and provide the detailed route information.\"\n```\n\n<p align=\"center\">\n <img src=\"assets/flight-schedule.gif\" alt=\"Hyperagent Demo\"/>\n</p>\n\nThe CLI supports options for debugging or using hyperbrowser instead of a local browser\n\n```bash\n-d, --debug ",
304
+ "relevantPaths": [
305
+ ".github/workflows/claude.yml",
306
+ "LICENSE",
307
+ "examples/browser-providers/hyperbrowser.ts",
308
+ "package.json",
309
+ "scripts/test-async.ts",
310
+ "scripts/test-extract.ts",
311
+ "scripts/test-page-ai.ts",
312
+ "scripts/test-page-iframes.ts",
313
+ "scripts/test-variables.ts",
314
+ "scripts/test.ts",
315
+ "src/browser-providers/AGENTS.md",
316
+ "src/browser-providers/hyperbrowser.ts",
317
+ "src/browser-providers/index.ts",
318
+ "src/browser-providers/local.ts",
319
+ "src/types/browser-providers/types.ts",
320
+ "test-prototype-pollution.js"
321
+ ],
322
+ "codeSamples": [
323
+ {
324
+ "path": "examples/browser-providers/hyperbrowser.ts",
325
+ "url": "https://github.com/hyperbrowserai/HyperAgent/blob/main/examples/browser-providers/hyperbrowser.ts",
326
+ "excerpt": "/**\n * # Hyperbrowser Provider Example\n *\n * This example demonstrates how to configure and use HyperAgent with the Hyperbrowser\n * provider for web browsing tasks with proxy support.\n *\n * ## What This Example Does\n *\n * The agent performs a simple web search task that:\n * 1. Configures HyperAgent with Hyperbrowser-specific settings\n * 2. Enables proxy support for enhanced privacy and reliability\n * 3. Searches for and extracts specific information about a movie release date\n *\n * ## Prerequisites\n *\n * 1. Node.js environment\n * 2. OpenAI API key set in your .env file (OPENAI_API_KEY)\n *\n * ## Running the Example\n *\n * ```bash\n * yarn ts-node examples/browser-providers/hyperbrowser.ts\n * ```\n */\n\nimport \"dotenv/config\";\nimport { HyperAgent } from \"@hyperbrowser/agent\";\n// Removed LangChain import - using native SDK configuration\nimport chalk from \"chalk\";\n\nasync function runEval() {\n const agent = new HyperAgent({\n llm: {\n provider: \"openai\",\n model: \"gpt-4o\",\n },\n debug: true,\n browserProvider: \"Hyperbrowser\",\n hyperbrowserConfig: {\n sessionConfig: {\n useProxy: true,\n },\n },\n });\n const result = await agent.executeTask(\n \"Find the initial release date for Guardians of the Galaxy Vol. 3 the movie\",\n {\n debugOnAgentOutput: (agentOutput) => {\n console.log(\"\\n\" + chalk.cyan.bold(\"===== AGENT OUTPUT =====\"));\n console.dir(agentOutput, { depth: null, colors: true });\n console.log(chalk.cyan.bold(\"===============\") + \"\\n\");\n },\n onStep: (step) => {\n console.log(\"\\n\" + chalk.cyan.bold"
327
+ },
328
+ {
329
+ "path": "scripts/test-async.ts",
330
+ "url": "https://github.com/hyperbrowserai/HyperAgent/blob/main/scripts/test-async.ts",
331
+ "excerpt": "import { HyperAgent } from \"../src/agent\";\nimport dotenv from \"dotenv\";\nimport chalk from \"chalk\";\n\ndotenv.config();\n\nconst agent = new HyperAgent({\n // a: process.env.OPENAI_API_KEY,\n});\n\n(async () => {\n const control = await agent.executeTaskAsync(\n \"Go to give me a summary of the second link on the show section of hacker news, be sure to actually go to it\",\n {\n onStep: (step) => {\n console.log(\"\\n\" + chalk.cyan.bold(\"===== STEP =====\"));\n console.dir(step, { depth: null, colors: true });\n console.log(chalk.cyan.bold(\"===============\") + \"\\n\");\n },\n }\n );\n // console.log(chalk.green.bold(\"\\nResult:\"));\n // console.log(chalk.white(result.output));\n await new Promise((resolve) => setTimeout(resolve, 10000));\n console.log(\"pausing\");\n control.pause();\n await new Promise((resolve) => setTimeout(resolve, 20000));\n console.log(\"resuming\");\n control.resume();\n})();\n"
332
+ }
333
+ ]
334
+ },
335
+ {
336
+ "fullName": "luizahackenhaarnaziazeno/Lab1-Coleta-Preparacao-E-Analise-De-Dados",
337
+ "url": "https://github.com/luizahackenhaarnaziazeno/Lab1-Coleta-Preparacao-E-Analise-De-Dados",
338
+ "categories": [
339
+ "web scraping crawler"
340
+ ],
341
+ "description": "Laboratório de web scraping: crawler de artigos da Wikipédia com BeautifulSoup e extração do IMDb Top 250 com Selenium, lidando com conteúdo dinâmico e paginação",
342
+ "language": "Jupyter Notebook",
343
+ "license": null,
344
+ "stars": 1,
345
+ "forks": 0,
346
+ "updatedAt": "2026-07-16T01:59:09Z",
347
+ "pushedAt": "2026-05-24T02:00:07Z",
348
+ "archived": false,
349
+ "defaultBranch": "main",
350
+ "readmeExcerpt": "<div align=\"center\">\n\n## Laboratório 1: Web Scraping - Coleta, Preparação e Análise de Dados 🕷️\n\nEste repositório contém a resolução do **Laboratório 1** da disciplina de Coleta, Preparação e Análise de Dados da PUCRS, ministrada pela Professora Katherine Bianchini Esper. O projeto foca na aplicação de técnicas de *web scraping* para a extração de dados em dois cenários distintos.\n\n## 🎯 Objetivos do Projeto\n\nO projeto é dividido em duas tarefas principais:\n\n1. **Ambiente Controlado (Wikipédia):** Criação de um *crawler* para explorar links e conexões entre artigos, partindo da página inicial sobre *Ada Lovelace*.\n2. **Ambiente Real (IMDb):** Extração de dados estruturados dos 250 filmes com a maior avaliação no site IMDb (Top 250), lidando com paginação e elementos dinâmicos.\n---\n\n## 📂 Estrutura de Arquivos\n\n* 📓 `Laboratorio1coleta.ipynb`: Notebook Jupyter contendo a resolução da **Tarefa 1** (Wikipédia). Utiliza `requests` e `BeautifulSoup` para navegar no HTML estático e gerar os arquivos CSV com os dados coletados.\n* 📓 `Laboratorio1_Tarefa2_IMDb.ipynb`: Notebook Jupyter responsável pela **Tarefa 2** (IMDb). Utiliza `Selenium` para navegar nas páginas de forma dinâmica, extraindo detalhes dos filmes de forma a não sobrecarregar os servidores.\n* 🗄️ `imdb_top250.json`: Arquivo gerado pela Tarefa 2 contendo todos os dados extraídos dos 250 filmes, incluindo os bytes das imagens dos pôsteres convertidos para o formato `Base64`.\n* 🗄️ `imdb_top250_sem_imagens.json`: Versão mais leve do arquivo de resultados, contendo apenas os dados textuais (título, ano, nota, gêneros, direção, url), omitindo os dados em base64 das imagens.\n\n---\n\n## 🛠️ Tecnologias e Dependências\n\nPara executar os notebooks deste projeto, você precisará do Python 3 instalado e das seguintes bibliotecas:\n\n* `requests`\n* `beautifulsoup4`\n* `selenium`\n\nVocê pode instalar as dependências rodando o comando abaixo:\n```bash\npip install requests beautifulsoup4 selenium\n```\n\n# 👥 Autoras:\n\n| [<img loading=\"lazy\" src=\"https://avatars.githubusercontent.com/u/142232479?v=4\" width=115><br><sub>Luiza Hackenhaar Naziazeno</sub>](https://github.com/luizahackenhaarnaziazeno) | [<img loading=\"lazy\" src=\"https://avatars.githubusercontent.com/u/142234602?v=4\" width=115><br><sub>Gabrielle Guarani Da Silva</sub>](https://github.com/gguarani) |\n| :---: | :---: |\n",
351
+ "relevantPaths": [],
352
+ "codeSamples": []
353
+ },
354
+ {
355
+ "fullName": "VISVANTHA/web-scraping-crawler-framework",
356
+ "url": "https://github.com/VISVANTHA/web-scraping-crawler-framework",
357
+ "categories": [
358
+ "web scraping crawler"
359
+ ],
360
+ "description": "Mirrored from visvantha-testable/web-scraping-crawler-framework",
361
+ "language": "Python",
362
+ "license": null,
363
+ "stars": 0,
364
+ "forks": 0,
365
+ "updatedAt": "2026-08-13T07:25:26Z",
366
+ "pushedAt": "2026-08-13T07:24:57Z",
367
+ "archived": false,
368
+ "defaultBranch": "Python_FE3.9_BE3.10",
369
+ "readmeExcerpt": "# Web Scraping / Crawler Framework\n\nMinimal, realistic split-version crawler project with a browser UI frontend, FastAPI backend, fixture-driven crawl pipeline, and a shared 14-tool quality layer.\n\n## Branch\n\n- **Branch name:** `Python_FE3.9_BE3.10`\n- **Frontend Python:** `3.9`\n- **Backend Python:** `3.10`\n- **Rule:** Frontend and Backend versions are never equal.\n\n## Architecture\n\nSee [`ARCHITECTURE.txt`](ARCHITECTURE.txt).\n\n```\nBrowser → Frontend Web UI → Backend API → Crawler → Scraper → Parser → Processor → Structured JSON → Frontend\n```\n\n## Installation\n\n### Docker (recommended — preserves exact FE/BE versions)\n\n```bash\ndocker compose build\ndocker compose up -d\n```\n\n### Native (requires matching Python interpreters)\n\n```bash\n# Frontend (exact FE version)\npy -3.9 -m venv frontend_python/.venv\nfrontend_python/.venv/Scripts/pip install -e \"frontend_python[dev]\"\n\n# Backend (exact BE version)\npy -3.10 -m venv backend_python/.venv\nbackend_python/.venv/Scripts/pip install -e \"backend_python[dev]\"\n```\n\n## Frontend build\n\n```bash\npy -3.9 frontend_python/scripts/build_frontend.py\n# or\nbash frontend_python/scripts/build_frontend.sh\n```\n\nOutput: `frontend_python/build/dist/`\n\n## Backend build\n\n```bash\npy -3.10 backend_python/scripts/build_backend.py\n# or\nbash backend_python/scripts/build_backend.sh\n```\n\nOutput: `backend_python/build/dist/`\n\n## Full build / integration\n\n```bash\npython run_combined_crawler.py --mode docker\n# fallback when local interpreters exist:\npython run_combined_crawler.py --mode native\n```\n\n## Frontend run\n\n```bash\n# Docker\ndocker compose up frontend\n\n# Native\nset BACKEND_URL=http://127.0.0.1:8090\npy -3.9 -m frontend.web_app\n```\n\n## Backend run\n\n```bash\n# Docker\ndocker compose up backend\n\n# Native\nset FIXTURES_ROOT=%CD%\\fixtures\npy -3.10 -m backend.api\n```\n\n## Accessible URLs (when services are running locally)\n\n- **Frontend URL:** `http://127.0.0.1:8080`\n- **Backend Health URL:** `http://127.0.0.1:8090/health`\n- **Backend Crawl API:** `POST http://127.0.0.1:8090/crawl`\n\nThese are real loopback URLs only when the services are actually bound on this host.\n\n## Crawler execution\n\n```bash\ncurl -X POST http://127.0.0.1:8090/crawl ^\n -H \"Content-Type: application/json\" ^\n -d \"{\\\"url\\\":\\\"fixture://sample_pages/index.html\\\"}\"\n```\n\nOr use the browser UI URL input (defaults to the fixture page).\n\n## Test execution\n\n```bash\ncd frontend_python && PYTHONP",
370
+ "relevantPaths": [
371
+ "backend_python/Dockerfile",
372
+ "backend_python/pyproject.toml",
373
+ "backend_python/src/backend/crawler.py",
374
+ "backend_python/src/backend/scraper.py",
375
+ "backend_python/tests/test_api.py",
376
+ "backend_python/tests/test_crawler.py",
377
+ "backend_python/tests/test_scraper.py",
378
+ "frontend_python/Dockerfile",
379
+ "frontend_python/pyproject.toml",
380
+ "frontend_python/src/frontend/crawler_client.py",
381
+ "frontend_python/tests/test_cli.py",
382
+ "frontend_python/tests/test_web_app.py",
383
+ "quality/tool-03/fixtures/test_calculator.py",
384
+ "quality/tool-04/fixtures/test_calculator.py",
385
+ "quality/tool-09/fixtures/test_calculator.py",
386
+ "quality/tool-11/fixtures/test_mcdc_decision.py",
387
+ "quality/tool-12/fixtures/test_util_functions.py",
388
+ "quality/tool-12/run_testmon.py",
389
+ "quality/tool-12/run_testmon.sh",
390
+ "run_combined_crawler.py",
391
+ "scripts/cleanup_artifacts.py"
392
+ ],
393
+ "codeSamples": [
394
+ {
395
+ "path": "backend_python/src/backend/crawler.py",
396
+ "url": "https://github.com/VISVANTHA/web-scraping-crawler-framework/blob/Python_FE3.9_BE3.10/backend_python/src/backend/crawler.py",
397
+ "excerpt": "\"\"\"Crawler orchestration: scrape → parse → process.\"\"\"\n\nfrom __future__ import annotations\n\nfrom typing import Any, Dict\n\nfrom backend.parser import parse_html\nfrom backend.processor import process_document\nfrom backend.scraper import fetch_html\n\n\ndef crawl_url(url: str) -> Dict[str, Any]:\n \"\"\"Run the full crawler pipeline for a single URL.\"\"\"\n html = fetch_html(url)\n parsed = parse_html(html, source=url)\n return process_document(parsed)\n\n\ndef summarize_crawl(result: Dict[str, Any]) -> str:\n \"\"\"Create a short human-readable summary (also used for FE/BE duplication).\"\"\"\n title = result.get(\"title\") or \"Untitled\"\n status = result.get(\"status\") or \"unknown\"\n link_count = len(result.get(\"links\") or [])\n item_count = len(result.get(\"items\") or [])\n return (\n \"Crawl summary for '{0}': status={1}, links={2}, items={3}\".format(\n title, status, link_count, item_count\n )\n )\n"
398
+ },
399
+ {
400
+ "path": "backend_python/src/backend/scraper.py",
401
+ "url": "https://github.com/VISVANTHA/web-scraping-crawler-framework/blob/Python_FE3.9_BE3.10/backend_python/src/backend/scraper.py",
402
+ "excerpt": "\"\"\"HTML scraper: fetch remote pages or local fixture files.\"\"\"\n\nfrom __future__ import annotations\n\nimport os\nfrom pathlib import Path\nfrom typing import Optional\nfrom urllib.parse import urlparse\n\nimport httpx\n\n# Repo root: backend_python/src/backend -> ../../../..\n_REPO_ROOT = Path(__file__).resolve().parents[3]\n_FIXTURES_ROOT = Path(os.environ.get(\"FIXTURES_ROOT\", str(_REPO_ROOT / \"fixtures\")))\n\n\ndef resolve_fixture_path(url: str) -> Optional[Path]:\n \"\"\"Map fixture:// URLs to files under fixtures/.\"\"\"\n if not url.startswith(\"fixture://\"):\n return None\n rel = url[len(\"fixture://\") :].lstrip(\"/\")\n path = (_FIXTURES_ROOT / rel).resolve()\n if not str(path).startswith(str(_FIXTURES_ROOT.resolve())):\n raise ValueError(\"Fixture path escapes fixtures root\")\n return path\n\n\ndef fetch_html(url: str, timeout: float = 10.0) -> str:\n \"\"\"Fetch HTML from an HTTP(S) URL or a fixture:// path.\"\"\"\n fixture = resolve_fixture_path(url)\n if fixture is not None:\n if not fixture.is_file():\n raise FileNotFoundError(\"Fixture not found: {0}\".format(fixture))\n return fixture.read_text(encoding=\"utf-8\")\n\n parsed = urlparse(url)\n if parsed.scheme not in (\"http\", \"https\"):\n raise ValueError(\"Unsupported URL scheme: {0}\".format(parsed.scheme or \"none\"))\n\n with httpx.Client(timeout=timeout, follow_redirects=True) as client:\n response = client.get(url)\n response.raise_for_status()\n return response.text\n"
403
+ }
404
+ ]
405
+ },
406
+ {
407
+ "fullName": "EnriqueCarvalho/WebScraping-Crawler",
408
+ "url": "https://github.com/EnriqueCarvalho/WebScraping-Crawler",
409
+ "categories": [
410
+ "web scraping crawler"
411
+ ],
412
+ "description": "Trabalho da DCG de Recuperação da Informação sobre WebScraping/Crawler, utilizando Python e scrapy",
413
+ "language": null,
414
+ "license": null,
415
+ "stars": 0,
416
+ "forks": 0,
417
+ "updatedAt": "2023-01-11T00:19:47Z",
418
+ "pushedAt": "2023-01-11T00:19:47Z",
419
+ "archived": false,
420
+ "defaultBranch": "main",
421
+ "readmeExcerpt": "",
422
+ "relevantPaths": [],
423
+ "codeSamples": []
424
+ },
425
+ {
426
+ "fullName": "Bryanskie/Web_Scraping_-_Crawler",
427
+ "url": "https://github.com/Bryanskie/Web_Scraping_-_Crawler",
428
+ "categories": [
429
+ "web scraping crawler"
430
+ ],
431
+ "description": null,
432
+ "language": "Python",
433
+ "license": null,
434
+ "stars": 0,
435
+ "forks": 0,
436
+ "updatedAt": "2025-10-29T15:12:08Z",
437
+ "pushedAt": "2025-10-29T15:10:55Z",
438
+ "archived": false,
439
+ "defaultBranch": "main",
440
+ "readmeExcerpt": "# 🕷️ Web Crawler using Scrapy\n\nThis project is a simple **web crawler** built using the [Scrapy](https://scrapy.org/) framework in Python. \nIt automatically crawls through the [Books to Scrape](http://books.toscrape.com) website to extract book information such as **title**, **price**, and **availability** from multiple categories.\n\n---\n\n## 📘 Project Overview\n\nThe crawler starts at the homepage of **Books to Scrape** and follows category links automatically. \nOnce it reaches individual product pages, it scrapes specific details using **CSS selectors**.\n\n### ✨ Features\n- Automatically follows category pages.\n- Extracts product details (title, price, availability).\n- Supports rule-based crawling using `CrawlSpider`.\n- Outputs data in structured JSON format.\n\n---\n\n## 🧩 Tech Stack\n\n| Tool | Purpose |\n|------|----------|\n| **Python 3** | Core programming language |\n| **Scrapy** | Web crawling and scraping framework |\n| **LinkExtractor** | Used to find and follow relevant links |\n| **CrawlSpider** | Simplifies recursive crawling across pages |\n\n\n🚀 How to Run the Crawler\n\n1. Clone this Repository\ngit clone https://github.com/yourusername/web-crawler.git\ncd web-crawler\n\n2. Install Dependencies\n\nMake sure Scrapy is installed:\n\npip install scrapy\n\n3. Run the Spider\nscrapy crawl my_crawler -o output.json\n\nThis command runs the spider and saves the scraped data into output.json.\n\n📊 Sample Output\n[\n {\n \"title\": \"A Light in the Attic\",\n \"price\": \"£51.77\",\n \"availability\": \"In stock (22 available)\"\n },\n {\n \"title\": \"Tipping the Velvet\",\n \"price\": \"£53.74\",\n \"availability\": \"In stock (20 available)\"\n }\n]\n\n\n\n",
441
+ "relevantPaths": [
442
+ "Current/Neuralcrawling/scrapy.cfg"
443
+ ],
444
+ "codeSamples": []
445
+ },
446
+ {
447
+ "fullName": "prnvvj/Web-Scraping-Crawlers",
448
+ "url": "https://github.com/prnvvj/Web-Scraping-Crawlers",
449
+ "categories": [
450
+ "web scraping crawler"
451
+ ],
452
+ "description": null,
453
+ "language": "Jupyter Notebook",
454
+ "license": null,
455
+ "stars": 0,
456
+ "forks": 0,
457
+ "updatedAt": "2023-04-04T03:10:36Z",
458
+ "pushedAt": "2021-05-17T09:32:42Z",
459
+ "archived": false,
460
+ "defaultBranch": "main",
461
+ "readmeExcerpt": "# Web Scraping\nWeb Scraping is getting more and more important in the current days. I will go out on a limb here, and assume you have already heard the expression **“Data is the new oil”**. If I define web scraping as **the ability to quickly gather all sorts of data from virtually any website**, it should not be difficult to understand why there are so many businesses investing in the Web Scraping specially in their nascent stage.\n### The web scraping triad\nIn this repository I've focused on three different Python libraries that are more than enough for getting almost available data on the world wide web.\n- _**Beautiful Soup**_\n- _**Selenium**_\n- _**Scrapy**_ </br>\nI will go over their main features and limitations, and provide a few examples of when to use one or another.\n\n![Image](https://github.com/prnvvj/Web-Scraping/blob/main/PNG/crawler.jpeg)\n\n## Want to Create your Own Business Database for Marketing & Sales – You have Landed at the Right Place!\nI can create advance web crawlers for Business Directory Data Extraction services that would take your business one step ahead to success in today’s cutting edge and competitive technology. For improving business outcome to collect perfect database with contact information specifically Email addresses is very important. Also it requires target oriented records according to business category. Database without these both criteria is meaningless for marketing the business. This requirement of perfect database is only fulfill by expertise data extraction services provider.\n\n## I can Scrape Valuable Data from Multiple Business Directories\n\nI can fetch data like Business Name, Business Address, City, State, Zip-code, Phone Number, Fax, Web URL, Email Address, Business Details, Latitude & Longitude from business directories like Yellow Pages, Super Pages, White pages, Yelp data, Yell and more. I scrape all countries business data and company information from various countries business listing available, refine it and delivered into desired format.\n",
462
+ "relevantPaths": [
463
+ "Amazon Data Scraper.ipynb",
464
+ "Business Directory Website Crawler.ipynb",
465
+ "PNG/crawler.jpeg",
466
+ "SEO Data Scraper.ipynb"
467
+ ],
468
+ "codeSamples": []
469
+ },
470
+ {
471
+ "fullName": "yurivarao/web_scraping_crawler",
472
+ "url": "https://github.com/yurivarao/web_scraping_crawler",
473
+ "categories": [
474
+ "web scraping crawler"
475
+ ],
476
+ "description": null,
477
+ "language": "Python",
478
+ "license": null,
479
+ "stars": 0,
480
+ "forks": 0,
481
+ "updatedAt": "2021-02-21T02:03:43Z",
482
+ "pushedAt": "2021-02-21T02:03:41Z",
483
+ "archived": false,
484
+ "defaultBranch": "master",
485
+ "readmeExcerpt": "",
486
+ "relevantPaths": [
487
+ ".idea/web_scraping_crawler.iml",
488
+ "web_crawler/web_crawler.py",
489
+ "web_scraping_mensal/web_scraping_mensal.py",
490
+ "web_sraping_diario/web_scraping_diario.py"
491
+ ],
492
+ "codeSamples": [
493
+ {
494
+ "path": "web_crawler/web_crawler.py",
495
+ "url": "https://github.com/yurivarao/web_scraping_crawler/blob/master/web_crawler/web_crawler.py",
496
+ "excerpt": "import time\nfrom selenium import webdriver\n\n# Usuário e senha para fazer login no site da Investing\nusername = \"\"\npassword = \"\"\n\n# Será necessário o download do chrome driver\nchromedriver_path = \"C:\\chromedriver\\chromedriver.exe\"\n\nurl = \"https://br.investing.com/equities/magaz-luiza-on-nm-historical-data\"\n\n\n# Função para configurar e abrir o navegador do Google Chrome\n\n\ndef open_browser(chromedriver_path):\n c_options = webdriver.ChromeOptions()\n\n # Em \"download.default_directory\" é difinido o caminho onde os arquivos serão salvos\n preferences = {\"download.prompt_for_download\": False,\n \"download.default_directory\": r\"C:\\Users\\...\",\n \"download.directory_upgrade\": True,\n \"profile.default_content_settings.popups\": 0,\n \"profile.default_content_settings_values.notifications\": 2,\n \"profile.default_content_settings_values.automatic_download\": 1\n }\n\n c_options.add_experimental_option(\"prefs\", preferences)\n\n driver = webdriver.Chrome(executable_path=chromedriver_path,\n options=c_options)\n\n return driver\n\n\ndriver_1 = open_browser(chromedriver_path)\n\n# Definir os passos a serem executados com a identificação de cada elemento html\n\n\ndef site_login(username, password, url, driver):\n driver.get(url)\n time.sleep(15)\n driver.find_element_by_id(\"onetrust-accept-btn-handler\").click()\n time.sleep(15)\n driver.find_element_by_xpath(\"//div[@class='right']/i[@class='popupCloseIcon largeBannerCloser']\").click()\n time.sleep(5)\n "
497
+ },
498
+ {
499
+ "path": "web_scraping_mensal/web_scraping_mensal.py",
500
+ "url": "https://github.com/yurivarao/web_scraping_crawler/blob/master/web_scraping_mensal/web_scraping_mensal.py",
501
+ "excerpt": "from requests_html import HTMLSession\n\n# Definição da sessão para o web scraping\nurl = 'https://br.investing.com/equities/magaz-luiza-on-nm-historical-data'\n\nsession = HTMLSession()\nr = session.get(url).html\ndata = r.find('#results_box', first=True).text.split()\n\n# Criação das listas para armazenar os dados\ndados_historicos = []\ndados_tam = len(data)\nlinha = []\n\n# Obtenção dos dados diários no prazo de um mês\ni = 0\n# Definição da quantidade de linhas da tabela,\n# sendo cada linha um dia útil do mês, nesse caso foi definido 20 dias.\n# Depois o valor é multiplicado pelo número de colunas na tabela, nesse caso 7.\ndias_uteis = 20\ndias_uteis = dias_uteis * 7\nwhile i < dados_tam:\n if i <= dias_uteis:\n Data_dh = data[i]\n linha.append(Data_dh)\n i = i + 1\n\n Abertura = data[i]\n linha.append(Abertura)\n i = i + 1\n\n Fechamento = data[i]\n linha.append(Fechamento)\n i = i + 1\n\n Maxima = data[i]\n linha.append(Maxima)\n i = i + 1\n\n Minima = data[i]\n linha.append(Minima)\n i = i + 1\n\n Volume = data[i]\n linha.append(Volume)\n i = i + 1\n\n Var = data[i]\n linha.append(Var)\n i = i + 1\n\n dados_historicos.append(linha)\n linha = []\n else:\n break\n\n# Mostrar os dados obtidos\nfor dia in dados_historicos:\n print(dia)\n\n# Depois será adicionada a função para salvar os dados em um arquivo\n"
502
+ }
503
+ ]
504
+ },
505
+ {
506
+ "fullName": "s3tools/s3cmd",
507
+ "url": "https://github.com/s3tools/s3cmd",
508
+ "categories": [
509
+ "s3 compatible storage"
510
+ ],
511
+ "description": "Official s3cmd repo -- Command line tool for managing S3 compatible storage services (including Amazon S3 and CloudFront).",
512
+ "language": "Python",
513
+ "license": "GPL-2.0",
514
+ "stars": 4899,
515
+ "forks": 905,
516
+ "updatedAt": "2026-08-13T12:04:59Z",
517
+ "pushedAt": "2025-10-22T23:26:17Z",
518
+ "archived": false,
519
+ "defaultBranch": "master",
520
+ "readmeExcerpt": "## S3cmd tool for Amazon Simple Storage Service (S3)\n\n[![Build Status](https://github.com/s3tools/s3cmd/actions/workflows/test.yml/badge.svg)](https://github.com/s3tools/s3cmd/actions/workflows/test.yml)\n\n* Authors: Michal Ludvig (michal@logix.cz), Florent Viard (florent@sodria.com)\n* [Project homepage](https://s3tools.org)\n* (c) [TGRMN Software](http://www.tgrmn.com), [Sodria SAS](http://www.sodria.com) and contributors\n\n\nS3tools / S3cmd mailing lists:\n\n* Announcements of new releases: s3tools-announce@lists.sourceforge.net\n* General questions and discussion: s3tools-general@lists.sourceforge.net\n* Bug reports: s3tools-bugs@lists.sourceforge.net\n\nS3cmd requires Python 2.6 or newer.\nPython 3+ is also supported starting with S3cmd version 2.\n\nSee [installation instructions](https://github.com/s3tools/s3cmd/blob/master/INSTALL.md).\n\n\n### What is S3cmd\n\nS3cmd (`s3cmd`) is a free command line tool and client for uploading, retrieving and managing data in Amazon S3 and other cloud storage service providers that use the S3 protocol, such as Google Cloud Storage or DreamHost DreamObjects. It is best suited for power users who are familiar with command line programs. It is also ideal for batch scripts and automated backup to S3, triggered from cron, etc.\n\nS3cmd is written in Python. It's an open source project available under GNU Public License v2 (GPLv2) and is free for both commercial and private use. You will only have to pay Amazon for using their storage.\n\nLots of features and options have been added to S3cmd, since its very first release in 2008.... we recently counted more than 60 command line options, including multipart uploads, encryption, incremental backup, s3 sync, ACL and Metadata management, S3 bucket size, bucket policies, and more!\n\n### What is Amazon S3\n\nAmazon S3 provides a managed internet-accessible storage service where anyone can store any amount of data and retrieve it later again.\n\nS3 is a paid service operated by Amazon. Before storing anything into S3 you must sign up for an \"AWS\" account (where AWS = Amazon Web Services) to obtain a pair of identifiers: Access Key and Secret Key. You will need to\ngive these keys to S3cmd. Think of them as if they were a username and password for your S3 account.\n\n### Amazon S3 pricing explained\n\nAt the time of this writing the costs of using S3 are (in USD):\n\n$0.023 per GB per month of storage space used\n",
521
+ "relevantPaths": [
522
+ ".ci.s3cfg",
523
+ ".github/workflows/codespell.yml",
524
+ ".github/workflows/test.yml",
525
+ "LICENSE",
526
+ "RELEASE_INSTRUCTIONS",
527
+ "S3/ACL.py",
528
+ "S3/AccessLog.py",
529
+ "S3/BaseUtils.py",
530
+ "S3/BidirMap.py",
531
+ "S3/CloudFront.py",
532
+ "S3/Config.py",
533
+ "S3/ConnMan.py",
534
+ "S3/Crypto.py",
535
+ "S3/Custom_httplib27.py",
536
+ "S3/Custom_httplib3x.py",
537
+ "S3/Exceptions.py",
538
+ "S3/ExitCodes.py",
539
+ "S3/FileDict.py",
540
+ "S3/FileLists.py",
541
+ "S3/HashCache.py",
542
+ "S3/MultiPart.py",
543
+ "S3/PkgInfo.py",
544
+ "S3/Progress.py",
545
+ "S3/S3.py",
546
+ "S3/S3Uri.py",
547
+ "S3/SortedDict.py",
548
+ "S3/Utils.py",
549
+ "S3/__init__.py",
550
+ "run-tests.docker.README.md",
551
+ "run-tests.dockerfile"
552
+ ],
553
+ "codeSamples": [
554
+ {
555
+ "path": "S3/ACL.py",
556
+ "url": "https://github.com/s3tools/s3cmd/blob/master/S3/ACL.py",
557
+ "excerpt": "# -*- coding: utf-8 -*-\n\n## --------------------------------------------------------------------\n## Amazon S3 - Access Control List representation\n##\n## Authors : Michal Ludvig <michal@logix.cz> (https://www.logix.cz/michal)\n## Florent Viard <florent@sodria.com> (https://www.sodria.com)\n## Copyright : TGRMN Software, Sodria SAS and contributors\n## License : GPL Version 2\n## Website : https://s3tools.org\n## --------------------------------------------------------------------\n\nfrom __future__ import absolute_import, print_function\n\nimport sys\nfrom .BaseUtils import getTreeFromXml, encode_to_s3, decode_from_s3\nfrom .Utils import deunicodise\n\ntry:\n import xml.etree.ElementTree as ET\nexcept ImportError:\n import elementtree.ElementTree as ET\n\nPY3 = (sys.version_info >= (3, 0))\n\nclass Grantee(object):\n ALL_USERS_URI = \"http://acs.amazonaws.com/groups/global/AllUsers\"\n LOG_DELIVERY_URI = \"http://acs.amazonaws.com/groups/s3/LogDelivery\"\n\n def __init__(self):\n self.xsi_type = None\n self.tag = None\n self.name = None\n self.display_name = ''\n self.permission = None\n\n def __repr__(self):\n return repr('Grantee(\"%(tag)s\", \"%(name)s\", \"%(permission)s\")' % {\n \"tag\" : self.tag,\n \"name\" : self.name,\n \"permission\" : self.permission\n })\n\n def isAllUsers(self):\n return self.tag == \"URI\" and self.name == Grantee.ALL_USERS_URI\n\n def isAnonRead(self):\n return self.isAllUsers() and (self.permission == \"READ\" or self.permission == \"FULL_CONTROL\")\n\n def isAnonWrit"
558
+ },
559
+ {
560
+ "path": "S3/AccessLog.py",
561
+ "url": "https://github.com/s3tools/s3cmd/blob/master/S3/AccessLog.py",
562
+ "excerpt": "# -*- coding: utf-8 -*-\n\n## --------------------------------------------------------------------\n## Amazon S3 - Access Control List representation\n##\n## Authors : Michal Ludvig <michal@logix.cz> (https://www.logix.cz/michal)\n## Florent Viard <florent@sodria.com> (https://www.sodria.com)\n## Copyright : TGRMN Software, Sodria SAS and contributors\n## License : GPL Version 2\n## Website : https://s3tools.org\n## --------------------------------------------------------------------\n\nfrom __future__ import absolute_import, print_function\n\nimport sys\n\nfrom . import S3Uri\nfrom .Exceptions import ParameterError\nfrom .BaseUtils import getTreeFromXml, decode_from_s3\nfrom .ACL import GranteeAnonRead\n\ntry:\n import xml.etree.ElementTree as ET\nexcept ImportError:\n import elementtree.ElementTree as ET\n\nPY3 = (sys.version_info >= (3,0))\n\n__all__ = []\nclass AccessLog(object):\n LOG_DISABLED = \"<BucketLoggingStatus></BucketLoggingStatus>\"\n LOG_TEMPLATE = \"<LoggingEnabled><TargetBucket></TargetBucket><TargetPrefix></TargetPrefix></LoggingEnabled>\"\n\n def __init__(self, xml = None):\n if not xml:\n xml = self.LOG_DISABLED\n self.tree = getTreeFromXml(xml)\n self.tree.attrib['xmlns'] = \"http://doc.s3.amazonaws.com/2006-03-01\"\n\n def isLoggingEnabled(self):\n return (self.tree.find(\".//LoggingEnabled\") is not None)\n\n def disableLogging(self):\n el = self.tree.find(\".//LoggingEnabled\")\n if el:\n self.tree.remove(el)\n\n def enableLogging(self, target_prefix_uri):\n el = self.tree.find(\".//LoggingEnable"
563
+ }
564
+ ]
565
+ },
566
+ {
567
+ "fullName": "saltbo/zpan",
568
+ "url": "https://github.com/saltbo/zpan",
569
+ "categories": [
570
+ "s3 compatible storage"
571
+ ],
572
+ "description": "Lightweight file hosting platform built on top of S3-compatible storage",
573
+ "language": "TypeScript",
574
+ "license": "AGPL-3.0",
575
+ "stars": 2049,
576
+ "forks": 282,
577
+ "updatedAt": "2026-08-12T02:26:41Z",
578
+ "pushedAt": "2026-08-12T02:26:36Z",
579
+ "archived": false,
580
+ "defaultBranch": "main",
581
+ "readmeExcerpt": "<p align=\"center\">\n <img src=\"public/logo.png\" alt=\"ZPan logo\" width=\"128\" height=\"128\" />\n</p>\n\n<h1 align=\"center\">ZPan</h1>\n\n<p align=\"center\">\n <strong>Open-source file hosting for your S3-compatible storage.</strong>\n</p>\n\n<p align=\"center\">\n Deploy on Cloudflare Workers or Docker. Upload directly to object storage.\n</p>\n\n<p align=\"center\">\n <a href=\"https://github.com/saltbo/zpan/actions/workflows/ci.yml\"><img src=\"https://github.com/saltbo/zpan/actions/workflows/ci.yml/badge.svg\" alt=\"CI\" /></a>\n <a href=\"https://codecov.io/gh/saltbo/zpan\"><img src=\"https://codecov.io/gh/saltbo/zpan/graph/badge.svg\" alt=\"codecov\" /></a>\n <a href=\"https://github.com/saltbo/zpan/actions/workflows/release.yml\"><img src=\"https://github.com/saltbo/zpan/actions/workflows/release.yml/badge.svg\" alt=\"Release\" /></a>\n <a href=\"https://github.com/saltbo/zpan/releases/latest\"><img src=\"https://img.shields.io/github/v/release/saltbo/zpan\" alt=\"GitHub Release\" /></a>\n <a href=\"https://ghcr.io/saltbo/zpan\"><img src=\"https://img.shields.io/badge/ghcr.io-saltbo%2Fzpan-blue\" alt=\"Docker Image\" /></a>\n <a href=\"https://github.com/saltbo/zpan/blob/main/LICENSE\"><img src=\"https://img.shields.io/github/license/saltbo/zpan.svg\" alt=\"License\" /></a>\n</p>\n\n<p align=\"center\">\n <strong>English</strong> ·\n <a href=\"docs/i18n/README.zh-CN.md\">简体中文</a> ·\n <a href=\"docs/i18n/README.ja.md\">日本語</a> ·\n <a href=\"docs/i18n/README.ko.md\">한국어</a> ·\n <a href=\"docs/i18n/README.ru.md\">Русский</a> ·\n <a href=\"docs/i18n/README.es.md\">Español</a> ·\n <a href=\"docs/i18n/README.pt-BR.md\">Português (BR)</a>\n</p>\n\n<p align=\"center\">\n 🎉 <strong>ZPan v2 is here.</strong> To celebrate, we're giving away ZPan Pro three ways — for early stargazers, contributors, and new stars. See <a href=\"docs/v2-launch-offers.md\"><strong>v2 Launch Offers</strong></a>.\n</p>\n\n## What is ZPan?\n\nZPan is a lightweight file hosting platform built on top of S3-compatible storage. Files upload directly from the client to S3 through presigned URLs, bypassing server bandwidth entirely. The server is the control plane: auth, metadata, shares, quotas, teams, WebDAV, tool integrations, and admin operations.\n\nThe product boundary is intentional: ZPan is a purpose-built S3-backed web drive, not a wrapper around every consumer cloud drive and not a full groupware suite. You bring an S3-compatible bucket; ZPan gives it a clean web UI,",
582
+ "relevantPaths": [
583
+ ".github/workflows/ci.yml",
584
+ ".github/workflows/deploy-aws-lambda.yml",
585
+ ".github/workflows/deploy-azure.yml",
586
+ ".github/workflows/deploy-cloud-run.yml",
587
+ ".github/workflows/deploy-cloudflare.yml",
588
+ ".github/workflows/deploy-netlify.yml",
589
+ ".github/workflows/deploy-vercel.yml",
590
+ ".github/workflows/deploy.yml",
591
+ ".github/workflows/docker-nightly.yml",
592
+ ".github/workflows/e2e-regression.yml",
593
+ ".github/workflows/release.yml",
594
+ "Dockerfile",
595
+ "LICENSE",
596
+ "cmd/go.mod",
597
+ "cmd/internal/client/client_test.go",
598
+ "cmd/internal/config/config_test.go",
599
+ "cmd/internal/downloader/api_test.go",
600
+ "cmd/internal/downloader/coverage_test.go",
601
+ "cmd/internal/downloader/registry_test.go",
602
+ "cmd/internal/downloader/task_runner.go",
603
+ "cmd/internal/downloader/task_runner_test.go",
604
+ "cmd/main_test.go",
605
+ "cmd/pkg/downloaders/aria2/aria2_test.go",
606
+ "cmd/pkg/downloaders/core/layout_test.go",
607
+ "cmd/pkg/downloaders/core/trackers_test.go",
608
+ "cmd/pkg/downloaders/httpdl/http_test.go",
609
+ "cmd/pkg/downloaders/live_download_test.go",
610
+ "cmd/pkg/downloaders/qbittorrent/qbittorrent_test.go",
611
+ "cmd/pkg/geoip/geoip_test.go",
612
+ "cmd/pkg/system/disk_unix_test.go"
613
+ ],
614
+ "codeSamples": [
615
+ {
616
+ "path": "cmd/internal/client/client_test.go",
617
+ "url": "https://github.com/saltbo/zpan/blob/main/cmd/internal/client/client_test.go",
618
+ "excerpt": "package client\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"net/http\"\n\t\"net/http/httptest\"\n\t\"reflect\"\n\t\"strings\"\n\t\"testing\"\n)\n\nfunc downloadTaskFixture(id string, status string) DownloadTask {\n\treturn DownloadTask{\n\t\tID: id,\n\t\tSpec: DownloadTaskSpec{\n\t\t\tSource: DownloadTaskSource{Type: \"http\", URI: \"https://example.com/file.bin\"},\n\t\t\tDestination: DownloadTaskDestination{Name: \"file.bin\"},\n\t\t\tLabels: DownloadTaskLabels{Tags: []string{}},\n\t\t},\n\t\tStatus: DownloadTaskStatus{\n\t\t\tState: status,\n\t\t\tAssignment: &DownloadTaskAssignment{\n\t\t\t\tDownloaderID: \"downloader-1\",\n\t\t\t\tUploadToken: \"upload-token\",\n\t\t\t},\n\t\t\tProgress: DownloadTaskProgress{\n\t\t\t\tDownload: DownloadTaskTransferProgress{Bytes: 1024, BytesPerSecond: 10},\n\t\t\t\tUpload: DownloadTaskTransferProgress{},\n\t\t\t},\n\t\t},\n\t}\n}\n\nfunc TestCreateObjectUsesRenameConflictStrategy(t *testing.T) {\n\tvar body map[string]any\n\tserver := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {\n\t\tif r.URL.Path != \"/api/objects\" {\n\t\t\tt.Fatalf(\"unexpected path: %s\", r.URL.Path)\n\t\t}\n\t\tif err := json.NewDecoder(r.Body).Decode(&body); err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\tw.Header().Set(\"Content-Type\", \"application/json\")\n\t\t// POST /api/objects always returns 201 Created.\n\t\tw.WriteHeader(http.StatusCreated)\n\t\t_ = json.NewEncoder(w).Encode(ObjectDraft{ID: \"object-1\", Name: \"movie (1).mkv\"})\n\t}))\n\tdefer server.Close()\n\n\t_, err := mustClient(t, server.URL, \"token\").CreateObject(context.Background(), \"upload-token\", \"movie.mkv\", 1024, \"Downloads\")\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tif body[\"onConflict\"] != \"rename\" {\n\t\tt.F"
619
+ },
620
+ {
621
+ "path": "cmd/internal/config/config_test.go",
622
+ "url": "https://github.com/saltbo/zpan/blob/main/cmd/internal/config/config_test.go",
623
+ "excerpt": "package config\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"strconv\"\n\t\"strings\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/spf13/viper\"\n)\n\nfunc TestLoadParsesSeedPolicy(t *testing.T) {\n\tv := viper.New()\n\tv.Set(\"server_url\", \"http://localhost:5173\")\n\tv.Set(\"token\", \"token\")\n\tv.Set(\"downloader.seed.enabled\", true)\n\tv.Set(\"downloader.seed.duration\", \"30m\")\n\tv.Set(\"downloader.seed.cache_limit\", \"10GB\")\n\tv.Set(\"downloader.seed.ratio\", 1.5)\n\tv.Set(\"downloader.seed.max_concurrent\", 7)\n\n\tcfg, err := Load(v)\n\tif err != nil {\n\t\tt.Fatalf(\"Load returned error: %v\", err)\n\t}\n\tif !cfg.SeedEnabled {\n\t\tt.Fatal(\"expected seed policy to be enabled\")\n\t}\n\tif cfg.SeedMaxConcurrent != 7 {\n\t\tt.Fatalf(\"expected seed max_concurrent 7, got %d\", cfg.SeedMaxConcurrent)\n\t}\n\tif cfg.SeedDuration != 30*time.Minute {\n\t\tt.Fatalf(\"expected seed duration 30m, got %s\", cfg.SeedDuration)\n\t}\n\tif cfg.SeedCacheLimit != 10_000_000_000 {\n\t\tt.Fatalf(\"expected seed cache limit 10GB, got %d\", cfg.SeedCacheLimit)\n\t}\n\tif cfg.SeedRatio != 1.5 {\n\t\tt.Fatalf(\"expected seed ratio 1.5, got %f\", cfg.SeedRatio)\n\t}\n\tif cfg.Token != \"token\" {\n\t\tt.Fatalf(\"expected global token to be loaded, got %q\", cfg.Token)\n\t}\n}\n\nfunc TestLoadUsesSafeSeedDefaults(t *testing.T) {\n\tv := viper.New()\n\tv.Set(\"server_url\", \"http://localhost:5173\")\n\n\tcfg, err := Load(v)\n\tif err != nil {\n\t\tt.Fatalf(\"Load returned error: %v\", err)\n\t}\n\tif !cfg.SeedEnabled {\n\t\tt.Fatal(\"expected seed policy to be enabled by default\")\n\t}\n\tif cfg.SeedDuration != time.Hour {\n\t\tt.Fatalf(\"expected default seed duration 1h, got %s\", cfg.SeedDuration)\n\t}\n\tif cfg.SeedCacheLimit != 10_000_000_000 {\n\t\tt."
624
+ }
625
+ ]
626
+ },
627
+ {
628
+ "fullName": "aminueza/terraform-provider-minio",
629
+ "url": "https://github.com/aminueza/terraform-provider-minio",
630
+ "categories": [
631
+ "s3 compatible storage"
632
+ ],
633
+ "description": "Terraform provider for MinIO and S3-compatible storage (R2, B2, Hetzner, Spaces) — buckets, IAM, replication, lifecycle, encryption & more.",
634
+ "language": "Go",
635
+ "license": "AGPL-3.0",
636
+ "stars": 341,
637
+ "forks": 100,
638
+ "updatedAt": "2026-08-12T14:43:00Z",
639
+ "pushedAt": "2026-08-10T11:42:14Z",
640
+ "archived": false,
641
+ "defaultBranch": "main",
642
+ "readmeExcerpt": "<p align=\"center\">\n <a href=\"https://registry.terraform.io/providers/aminueza/minio/latest\">\n <img src=\".github/assets/logo.png\" alt=\"Terraform Provider for MinIO\" width=\"180\">\n </a>\n</p>\n\n<h1 align=\"center\">Terraform Provider for MinIO</h1>\n\n<p align=\"center\">\n Manage <a href=\"https://min.io\">MinIO</a> and S3-compatible object storage as code\n</p>\n\n<p align=\"center\">\n <a href=\"https://registry.terraform.io/providers/aminueza/minio/latest\">\n <img alt=\"Terraform Registry\" src=\"https://img.shields.io/badge/dynamic/json?query=%24.version&url=https%3A%2F%2Fregistry.terraform.io%2Fv1%2Fproviders%2Faminueza%2Fminio&label=registry&logo=terraform&color=7B42BC\">\n </a>\n <a href=\"https://github.com/aminueza/terraform-provider-minio/actions/workflows/go.yml?query=branch%3Amain\">\n <img alt=\"CI\" src=\"https://img.shields.io/github/actions/workflow/status/aminueza/terraform-provider-minio/go.yml?branch=main&label=ci\">\n </a>\n <a href=\"go.mod\">\n <img alt=\"Go version\" src=\"https://img.shields.io/github/go-mod/go-version/aminueza/terraform-provider-minio\">\n </a>\n <a href=\"LICENSE\">\n <img alt=\"License\" src=\"https://img.shields.io/badge/license-AGPL--3.0-blue\">\n </a>\n</p>\n\n<p align=\"center\">\n <a href=\"https://registry.terraform.io/providers/aminueza/minio/latest/docs\"><b>Docs</b></a>\n &nbsp;·&nbsp;\n <a href=\"./examples\"><b>Examples</b></a>\n &nbsp;·&nbsp;\n <a href=\"./.github/VISION.md\"><b>Roadmap</b></a>\n &nbsp;·&nbsp;\n <a href=\"https://github.com/aminueza/terraform-provider-minio/discussions\"><b>Discussions</b></a>\n &nbsp;·&nbsp;\n <a href=\"./.github/SECURITY.md\"><b>Security</b></a>\n</p>\n\n---\n\nProvision and manage [MinIO](https://min.io) with the same Terraform workflow you already use for the rest of your infrastructure. Define buckets, IAM users and policies, lifecycle and replication rules, encryption, and server configuration in HCL, then `plan` and `apply`. The provider talks to the MinIO S3 and Admin APIs directly and also drives other S3-compatible backends through a single compatibility switch.\n\n## Highlights\n\n- **Broad coverage**: resources and data sources spanning buckets and objects, IAM, ILM, replication, encryption, notifications, and server and cluster configuration.\n- **Proven in production**: over 18 million downloads on the [Terraform Registry](https://registry.terraform.io/providers/aminueza/minio/latest), with frequent release",
643
+ "relevantPaths": [
644
+ ".github/goreleaser.yml",
645
+ ".github/release.yml",
646
+ ".github/workflows/close-stale-issues-and-pull-requests.yml",
647
+ ".github/workflows/create-release-tag.yml",
648
+ ".github/workflows/docs.yml",
649
+ ".github/workflows/go.yml",
650
+ ".github/workflows/pr-labeler.yml",
651
+ ".github/workflows/release.yml",
652
+ ".github/workflows/security.yml",
653
+ ".github/workflows/test-latest-minio.yml",
654
+ ".github/workflows/update-go-toolchain.yml",
655
+ "LICENSE",
656
+ "docs/data-sources/prometheus_scrape_config.md",
657
+ "docs/data-sources/s3_bucket.md",
658
+ "docs/data-sources/s3_bucket_anonymous_access.md",
659
+ "docs/data-sources/s3_bucket_cors_config.md",
660
+ "docs/data-sources/s3_bucket_encryption.md",
661
+ "docs/data-sources/s3_bucket_notification_config.md",
662
+ "docs/data-sources/s3_bucket_object_lock_configuration.md",
663
+ "docs/data-sources/s3_bucket_policy.md",
664
+ "docs/data-sources/s3_bucket_quota.md",
665
+ "docs/data-sources/s3_bucket_replication.md",
666
+ "docs/data-sources/s3_bucket_replication_metrics.md",
667
+ "docs/data-sources/s3_bucket_replication_status.md",
668
+ "docs/data-sources/s3_bucket_retention.md",
669
+ "docs/data-sources/s3_bucket_tags.md",
670
+ "docs/data-sources/s3_bucket_versioning.md",
671
+ "docs/data-sources/s3_buckets.md",
672
+ "docs/data-sources/s3_object.md",
673
+ "docs/data-sources/s3_objects.md"
674
+ ],
675
+ "codeSamples": []
676
+ },
677
+ {
678
+ "fullName": "Lulzx/zs3",
679
+ "url": "https://github.com/Lulzx/zs3",
680
+ "categories": [
681
+ "s3 compatible storage"
682
+ ],
683
+ "description": "S3-compatible storage in Zig. Zero dependencies.",
684
+ "language": "Zig",
685
+ "license": "WTFPL",
686
+ "stars": 187,
687
+ "forks": 9,
688
+ "updatedAt": "2026-08-13T07:18:13Z",
689
+ "pushedAt": "2026-08-09T02:37:31Z",
690
+ "archived": false,
691
+ "defaultBranch": "main",
692
+ "readmeExcerpt": "# zs3\n\n**SQLite for objects.** Local, dev, and edge S3 storage in a static binary under\n360KB.\n\nRun one file, point an existing S3 client at it, and keep the data on disk. zs3\nis standalone by default and adds content-addressed, peer-to-peer storage when\nyou ask for distributed mode. No runtime, control plane, or dependency tree.\n\n[Replace MinIO in Docker Compose](docs/replace-minio.md) ·\n[Product direction](docs/vision.md) · [API subset](docs/api.md)\n\n## Why\n\nMost local object-storage usage is PUT, GET, DELETE, LIST, and SigV4. zs3 owns\nthat narrow job instead of pursuing feature parity with a production object\nstorage platform.\n\n| | zs3 | RustFS | MinIO |\n|---|-----|--------|-------|\n| Lines | ~4,300 | ~80,000 | 200,000 |\n| Binary | <360KB | ~50MB | 100MB |\n| RAM idle | 3MB | ~100MB | 200MB+ |\n| Dependencies | 0 | ~200 crates | many |\n\n## What it does\n\n**Standalone Mode:**\n- Full AWS SigV4 authentication (verified with aws-cli, boto3, and rclone)\n- PUT, GET, DELETE, HEAD, LIST (v2)\n- HeadBucket for bucket existence checks\n- DeleteObjects batch operation\n- Multipart uploads for large files\n- Range requests for streaming/seeking (RFC 7233 compliant suffix ranges)\n- HTTP 100-continue support (boto3 compatible)\n- AWS chunked transfer encoding support\n- <360KB static Linux binary (`ReleaseSmall`)\n\n**Distributed Mode (IPFS-like):**\n- Content-addressed storage with BLAKE3 hashing\n- Automatic deduplication across the network\n- Full Kademlia DHT for peer/content discovery\n- Peer-to-peer content transfer with quorum reads\n- Inline storage for small objects (<4KB)\n- Tombstone-based deletes (prevents resurrection)\n- Block garbage collector with grace period\n- Zero-config LAN discovery ready\n- Same S3 API - works with existing tools\n\n## What it doesn't do\n\n- Versioning, lifecycle policies, bucket ACLs\n- Pre-signed URLs, object tagging, encryption\n- Anything you'd actually need a cloud provider for\n\nIf you need these, use MinIO or AWS. zs3 wins on size, inspectability, and\nauditability—not feature parity.\n\n## Quick Start\n\n```bash\nzig build -Doptimize=ReleaseSmall\n./zig-out/bin/zs3\n```\n\nServer listens on port 9000, stores data in `./data`. Default credentials are\n`minioadmin:minioadmin` (admin role) — **do not use in production**.\n\n### Credentials & roles\n\nProvide credentials at build time (`-Dacl-list=`) or runtime (`--acl=`):\n\n```bash\n./zig-out/bin/zs3 --acl=\"admin:ake",
693
+ "relevantPaths": [
694
+ "LICENSE",
695
+ "test.zig",
696
+ "test_bootstrap.py",
697
+ "test_client.py",
698
+ "test_comprehensive.py",
699
+ "test_replication.py"
700
+ ],
701
+ "codeSamples": [
702
+ {
703
+ "path": "test_bootstrap.py",
704
+ "url": "https://github.com/Lulzx/zs3/blob/main/test_bootstrap.py",
705
+ "excerpt": "#!/usr/bin/env python3\n\"\"\"Two-node regression test for --bootstrap peer discovery.\"\"\"\n\nimport json\nimport socket\nimport subprocess\nimport sys\nimport tempfile\nimport time\nimport urllib.request\nfrom pathlib import Path\n\n\ndef unused_port():\n with socket.socket() as sock:\n sock.bind((\"127.0.0.1\", 0))\n return sock.getsockname()[1]\n\n\ndef get_json(url, timeout=5):\n deadline = time.monotonic() + timeout\n last_error = None\n while time.monotonic() < deadline:\n try:\n with urllib.request.urlopen(url, timeout=1) as response:\n return json.load(response)\n except Exception as error:\n last_error = error\n time.sleep(0.1)\n raise AssertionError(f\"{url} did not become ready: {last_error}\")\n\n\ndef stop(process):\n if process.poll() is not None:\n return\n process.terminate()\n try:\n process.wait(timeout=2)\n except subprocess.TimeoutExpired:\n process.kill()\n process.wait()\n\n\ndef main():\n executable = Path(sys.argv[1] if len(sys.argv) > 1 else \"zig-out/bin/zs3\").resolve()\n if not executable.is_file():\n raise SystemExit(f\"zs3 executable not found: {executable}\")\n\n port_a = unused_port()\n port_b = unused_port()\n\n with tempfile.TemporaryDirectory(prefix=\"zs3-bootstrap-test-\") as temp_dir:\n root = Path(temp_dir)\n log_a = (root / \"node-a.log\").open(\"w+\")\n log_b = (root / \"node-b.log\").open(\"w+\")\n node_a = subprocess.Popen(\n [\n executable,\n \"--distributed\",\n f\"--port={port_a}"
706
+ },
707
+ {
708
+ "path": "test_client.py",
709
+ "url": "https://github.com/Lulzx/zs3/blob/main/test_client.py",
710
+ "excerpt": "#!/usr/bin/env python3\n\"\"\"Test client for zs3 - uses only stdlib\"\"\"\nimport hashlib\nimport hmac\nimport socket\nfrom datetime import datetime, timezone\nimport urllib.request\nimport urllib.parse\n\nHOST = \"localhost:9000\"\nACCESS_KEY = \"minioadmin\"\nSECRET_KEY = \"minioadmin\"\nREGION = \"us-east-1\"\n\ndef sign_request(method, path, query=\"\", headers=None, payload=b\"\"):\n \"\"\"AWS SigV4 signing\"\"\"\n if headers is None:\n headers = {}\n\n t = datetime.now(timezone.utc)\n amz_date = t.strftime(\"%Y%m%dT%H%M%SZ\")\n date_stamp = t.strftime(\"%Y%m%d\")\n\n payload_hash = hashlib.sha256(payload).hexdigest()\n headers[\"x-amz-date\"] = amz_date\n headers[\"x-amz-content-sha256\"] = payload_hash\n headers[\"host\"] = HOST\n\n # Sort and format headers\n signed_headers = \";\".join(sorted(k.lower() for k in headers))\n canonical_headers = \"\".join(f\"{k.lower()}:{v}\\n\" for k, v in sorted(headers.items(), key=lambda x: x[0].lower()))\n\n # Sort query string - normalize bare params (e.g. \"delete\") to \"delete=\"\n # to match server's sortQueryString behavior (required by SigV4)\n if query:\n pairs = [p if \"=\" in p else p + \"=\" for p in query.split(\"&\")]\n pairs.sort()\n canonical_query = \"&\".join(pairs)\n else:\n canonical_query = \"\"\n\n canonical_request = f\"{method}\\n{path}\\n{canonical_query}\\n{canonical_headers}\\n{signed_headers}\\n{payload_hash}\"\n\n credential_scope = f\"{date_stamp}/{REGION}/s3/aws4_request\"\n string_to_sign = f\"AWS4-HMAC-SHA256\\n{amz_date}\\n{credential_scope}\\n{hashlib.sha256(canonical_request.encode()).hexdigest()}\"\n\n def sign(k"
711
+ }
712
+ ]
713
+ },
714
+ {
715
+ "fullName": "mimischi/minio-dokku",
716
+ "url": "https://github.com/mimischi/minio-dokku",
717
+ "categories": [
718
+ "s3 compatible storage"
719
+ ],
720
+ "description": "Dockerfile to run Minio (S3 compatible storage) on Dokku (mini-Heroku)",
721
+ "language": "Dockerfile",
722
+ "license": null,
723
+ "stars": 145,
724
+ "forks": 42,
725
+ "updatedAt": "2026-02-05T20:53:57Z",
726
+ "pushedAt": "2022-12-12T13:42:20Z",
727
+ "archived": false,
728
+ "defaultBranch": "main",
729
+ "readmeExcerpt": "![](header.png)\n\n[![Minio Version](https://img.shields.io/badge/Minio-latest-blue.svg)]() [![Dokku Version](https://img.shields.io/badge/Dokku-v0.11.2-blue.svg)]()\n\n# Run Minio on Dokku\n\n## Perquisites\n\n### What is Minio?\n\nMinio is an object storage server, and API compatible with Amazon S3 cloud\nstorage service. Read more at the [minio.io](https://www.minio.io/) website.\n\n### What is Dokku?\n\n[Dokku](http://dokku.viewdocs.io/dokku/) is the smallest PaaS implementation\nyou've ever seen - _Docker powered mini-Heroku_.\n\n### Requirements\n\n* A working [Dokku host](http://dokku.viewdocs.io/dokku/getting-started/installation/)\n\n# Setup\n\nWe are going to use the domain `minio.example.com` and Dokku app `minio` for\ndemonstration purposes. Make sure to replace it.\n\n## Create the app\n\nLog onto your Dokku Host to create the Minio app:\n\n```bash\ndokku apps:create minio\n```\n\n## Configuration\n\n### Setting environment variables\n\nMinio uses two access keys (`ACCESS_KEY` and `SECRET_KEY`) for authentication\nand object management. The following commands sets a random strings for each\naccess key.\n\n```bash\ndokku config:set --no-restart minio MINIO_ROOT_USER=$(echo `openssl rand -base64 45` | tr -d \\=+ | cut -c 1-20)\ndokku config:set --no-restart minio MINIO_ROOT_PASSWORD=$(echo `openssl rand -base64 45` | tr -d \\=+ | cut -c 1-32)\n```\n\nTo login in the browser or via API, you will need to supply both the\n`ACCESS_KEY` and `SECRET_KEY`. You can retrieve these at any time while logged\nin on your host running dokku via `dokku config minio`.\n\n> **Note:** if you do not set these keys, Minio will generate them during\n> startup and output them to the log (check if via `dokku logs minio`). You\n> will still need to set them manually.\n\nYou'll also need to set other two environment variables:\n\n- `NGINX_MAX_REQUEST_BODY`: used in the custom `nginx.conf` for this Dokku app\n to allow uploads up to 15MB to the HTTP server (if the file size is greater\n than 15MB, `s3cmd` will split in 15MB parts).\n- `MINIO_DOMAIN`: used to tell Minio the domain name being used by the server.\n\n```bash\ndokku config:set --no-restart minio NGINX_MAX_REQUEST_BODY=15M\ndokku config:set --no-restart minio MINIO_DOMAIN=minio.example.com\n```\n\n> **Note**: if you're using [s4cmd](https://github.com/bloomreach/s4cmd/)\n> instead, be sure to pass the following parameters:\n> `--multipart-split-size=15728640 --max-singlepart-uploa",
730
+ "relevantPaths": [
731
+ "Dockerfile"
732
+ ],
733
+ "codeSamples": []
734
+ },
735
+ {
736
+ "fullName": "gps949/tg-s3",
737
+ "url": "https://github.com/gps949/tg-s3",
738
+ "categories": [
739
+ "s3 compatible storage"
740
+ ],
741
+ "description": "Telegram-backed S3-compatible storage on Cloudflare Workers",
742
+ "language": "TypeScript",
743
+ "license": null,
744
+ "stars": 68,
745
+ "forks": 22,
746
+ "updatedAt": "2026-08-13T10:47:47Z",
747
+ "pushedAt": "2026-07-10T09:30:07Z",
748
+ "archived": false,
749
+ "defaultBranch": "main",
750
+ "readmeExcerpt": "# TG-S3\n\n**Telegram-backed S3-compatible storage on Cloudflare Workers**\n\n[English](README.md) | [中文](README.zh.md) | [日本語](README.ja.md) | [Français](README.fr.md)\n\n---\n\nTG-S3 turns Telegram into an S3-compatible object storage backend. Files are stored as Telegram messages, metadata lives in Cloudflare D1, and the whole thing runs on Cloudflare Workers with zero runtime dependencies.\n\n## Features\n\n- **S3-compatible API** -- 27 operations including multipart upload, presigned URLs, and conditional requests\n- **Unlimited free storage** -- Telegram provides the storage layer at no cost\n- **Three-tier caching** -- CF CDN (L1) -> R2 (L2) -> Telegram (L3) for fast reads\n- **Telegram Bot** -- Manage files, buckets, and shares directly from Telegram\n- **Mini App** -- Full-featured web UI inside Telegram with file browser, uploads, and share management\n- **File sharing** -- Password-protected share links with expiry, download limits, and inline preview\n- **Server-side encryption** -- SSE-C (customer-provided keys) and SSE-S3 (server-managed keys) with AES-256-GCM\n- **Large file support** -- Files up to 2GB via optional VPS proxy with Local Bot API\n- **Media processing** -- Image conversion (HEIC/WebP), video transcoding, Live Photo handling via VPS\n- **Multi-credential auth** -- D1-backed credential management with per-bucket and per-operation permissions\n- **Cloudflare Tunnel** -- Secure VPS connectivity without exposing public ports\n- **Multi-language** -- Mini App supports English, Chinese, Japanese, and French\n- **Zero cost entry** -- Core functionality runs entirely on Cloudflare's free tier\n\n## Architecture\n\n```\nS3 Client ─────┐\n │\nTelegram Bot ───┤\n ├──▶ Cloudflare Worker ──▶ D1 (metadata)\nMini App ───────┤ │ R2 (cache)\n │ │\nShare Links ────┘ ▼\n Telegram API ◀──▶ VPS Proxy (optional, >20MB)\n```\n\n**Components:**\n\n| Component | Role | Cost |\n|-----------|------|------|\n| CF Worker | S3 API gateway, bot webhook, mini app host | Free tier |\n| CF D1 | Metadata storage (objects, buckets, shares) | Free tier |\n| CF R2 | Persistent cache for files <=20MB | Free tier (10GB) |\n| Telegram | Persistent file storage (unlimited) | Free |\n| VPS + Processor | Large files (>20MB), media processing | ~$4/month (optional) |\n\n## Quick Start\n\n### Prerequisites\n\n- Node.js 22+\n-",
751
+ "relevantPaths": [
752
+ "docs/S3-COMPAT.md",
753
+ "docs/design/02-s3-api.md",
754
+ "package.json",
755
+ "processor/Dockerfile",
756
+ "processor/package.json",
757
+ "src/storage/metadata.ts",
758
+ "src/storage/schema.sql"
759
+ ],
760
+ "codeSamples": [
761
+ {
762
+ "path": "src/storage/metadata.ts",
763
+ "url": "https://github.com/gps949/tg-s3/blob/main/src/storage/metadata.ts",
764
+ "excerpt": "import type { Env, ObjectRow, BucketRow, MultipartUploadRow, MultipartPartRow, ShareTokenRow, ChunkRow, CredentialRow } from '../types';\n\n// S3 timestamps have second precision; truncate milliseconds to avoid\n// If-Modified-Since comparison failures (HTTP dates lack ms component)\nfunction isoNowSeconds(): string {\n return new Date(Math.floor(Date.now() / 1000) * 1000).toISOString();\n}\n\n// Compute upper bound for prefix range queries: increment last character safely.\n// Handles Unicode edge case where charCode+1 could overflow BMP range.\nfunction prefixUpperBound(prefix: string): string {\n const lastChar = prefix.charCodeAt(prefix.length - 1);\n if (lastChar >= 0xFFFF) {\n // At BMP ceiling: append max char instead of incrementing\n return prefix + '\\uFFFF';\n }\n return prefix.slice(0, -1) + String.fromCharCode(lastChar + 1);\n}\n\nexport class MetadataStore {\n private db: D1Database;\n\n constructor(env: Env) {\n this.db = env.DB;\n }\n\n // --- Buckets ---\n\n async getBucket(name: string): Promise<BucketRow | null> {\n return this.db.prepare('SELECT * FROM buckets WHERE name = ?').bind(name).first<BucketRow>();\n }\n\n async listBuckets(): Promise<BucketRow[]> {\n const result = await this.db.prepare('SELECT * FROM buckets ORDER BY name').all<BucketRow>();\n return result.results;\n }\n\n async createBucket(name: string, chatId: string, topicId?: number | null, description?: string): Promise<void> {\n await this.db.prepare(\n 'INSERT INTO buckets (name, created_at, tg_chat_id, tg_topic_id, description) VALUES (?, ?, ?, ?, ?)'\n ).bind(name, isoNowSeconds()"
765
+ }
766
+ ]
767
+ },
768
+ {
769
+ "fullName": "ivan-sincek/browser-extension-automation",
770
+ "url": "https://github.com/ivan-sincek/browser-extension-automation",
771
+ "categories": [
772
+ "browser extension automation"
773
+ ],
774
+ "description": "Run a browser extension in a sandboxed web browser and without any fear of corrupting or loosing your real data.",
775
+ "language": "Python",
776
+ "license": "MIT",
777
+ "stars": 5,
778
+ "forks": 1,
779
+ "updatedAt": "2026-05-09T18:23:48Z",
780
+ "pushedAt": "2026-05-09T18:23:44Z",
781
+ "archived": false,
782
+ "defaultBranch": "main",
783
+ "readmeExcerpt": "# Browser Extension Automation\n\nRun a browser extension in a sandboxed web browser, completely isolated from your main / daily web browser, and without any fear of corrupting or loosing your real data.\n\nWhom is this script intended for?\n\n* Software engineers for unit testing purposes.\n* Quality assurance engineers for quality control purposes.\n* Product owners for demonstration purposes.\n* Cybersecurity engineers for security testing purposes.\n\nFor demonstration purposes, this script is based on [MetaMask](https://chromewebstore.google.com/detail/metamask/nkbihfbeogaeaoehlefnkodbefgpgknn) (v11.13.1) browser extension for Chrome web browser, but can easily be modified to suit all of your needs.\n\n**As of this writing, Playwright only supports Chromium browser extensions.**\n\nTested on:\n\n* macOS Sonoma 14.0\n* Windows 10 Pro and Windows 11 Pro\n* Kali Linux 2024.1 (Debian)\n\nMade for educational purposes. I hope it will help!\n\nFuture plans:\n\n* add more security related flows.\n\n## Table of Contents\n\n* [How to Run](#how-to-run)\n * [Environment Setup](#environment-setup)\n * [Manually Load a Browser Extension](#manually-load-a-browser-extension)\n* [For Developers](#for-developers)\n* [Usage](#usage)\n* [Images](#images)\n\n## How to Run\n\nOpen your preferred console from [/src/](https://github.com/ivan-sincek/browser-extension-automation/tree/main/src) and run the commands shown below.\n\nInstall required packages:\n\n```fundamental\npip3 install -r requirements.txt\n```\n\nInstall Chromium web browser:\n\n```fundamental\nplaywright install chromium\n```\n\nMake sure each time you upgrade your Playwright dependency to re-install Chromium web browser.\n\nInstall [MetaMask](https://chromewebstore.google.com/detail/metamask/nkbihfbeogaeaoehlefnkodbefgpgknn) to your main / daily web browser.\n\nRun the script:\n\n```fundamental\npython3 automation.py\n```\n\n### Environment Setup\n\nTo set up a sandboxed environment, run:\n\n```fundamental\npython3 automation.py -s my_automation_session\n```\n\nIf `-s` option is not specified, a new random user session directory will be created in your current working directory; otherwise, do the setup in your desired directory.\n\nIf `-e` option is not specified, the script will try to locate, copy, and load the copied browser extension for you based on the identifier; otherwise, do the same from the directory you specified.\n\nIf `-t` option is not specified, the script w",
784
+ "relevantPaths": [
785
+ "LICENSE"
786
+ ],
787
+ "codeSamples": []
788
+ },
789
+ {
790
+ "fullName": "sonic0002/pikabo",
791
+ "url": "https://github.com/sonic0002/pikabo",
792
+ "categories": [
793
+ "browser extension automation"
794
+ ],
795
+ "description": "A browser extension automation testing tool",
796
+ "language": "TypeScript",
797
+ "license": "MIT",
798
+ "stars": 4,
799
+ "forks": 0,
800
+ "updatedAt": "2026-08-07T10:11:02Z",
801
+ "pushedAt": "2026-08-07T05:10:42Z",
802
+ "archived": false,
803
+ "defaultBranch": "main",
804
+ "readmeExcerpt": "# pikabo\n\nAutomated testing for Chrome extensions.\n\nBuilding an extension means testing it by hand: load the unpacked build in `chrome://extensions`,\nclick the popup, poke the options page, watch three separate DevTools windows for errors, repeat\nafter every change. None of it is reachable by ordinary browser automation, because an extension\nlives outside the page — the popup is browser chrome, the MV3 background is a service worker with\nno tab, and stable Chrome 137+ refuses `--load-extension` outright.\n\npikabo loads your unpacked extension into a real Chromium, drives all of it, and writes a\nreport with a screenshot of every step.\n\n```console\n$ pikabo explore --ext ./my-extension\n\nmy-extension v2.1.0 · MV3\npopup: popup.html · options: options.html · service worker · 2 content script blocks · 5 permissions\n\nGenerated 5 smoke test(s) → tests/smoke.generated.yaml\nmy-extension smoke tests\n ✓ service worker starts without errors 12ms\n ✓ popup renders 431ms\n ✓ options page renders 318ms\n ✓ content script injects on github.com 772ms\n\n 4 passed · 3.8s\n html pikabo-results/report.html\n```\n\nNo hand-written test was involved in that run.\n\n## Install\n\n```bash\nnpm install --save-dev pikabo\nnpx playwright-core install chromium # one-time browser download\nnpx pikabo doctor # confirm the environment\n```\n\nNeeds Node 22 or newer. `doctor` checks that, the browser binary, and your `manifest.json`\nbefore anything tries to launch Chromium.\n\nTo run it from a checkout instead, see [CONTRIBUTING.md](CONTRIBUTING.md#running-it-against-a-real-extension-before-it-is-published).\n\n## Getting started\n\n```bash\nnpx pikabo explore --ext . # generate a smoke suite from manifest.json and run it\nnpx pikabo init # scaffold tests/smoke.yaml to edit yourself\nnpx pikabo run tests --ext . # run a directory of suites\nnpx pikabo run tests/popup.yaml --ext . --test \"popup saves a PDF\"\n```\n\n`run` exits non-zero when anything fails, so it drops straight into CI.\n\nUse `--test \"exact test name\"` to run one named test, or `--grep` for substring and regular\nexpressions (`--grep '/popup .* PDF/i'`). The two are mutually exclusive, and an unmatched\n`--test` name fails before launching Chromium and lists the available names.\n\n## Recording a test\n\nWriting the first suite by hand is the slowest",
805
+ "relevantPaths": [
806
+ ".github/workflows/ci.yml",
807
+ "LICENSE",
808
+ "docs/ext-test-findings.md",
809
+ "docs/testing-downloads.md",
810
+ "fixtures/no-worker-extension/content.js",
811
+ "fixtures/no-worker-extension/manifest.json",
812
+ "package.json",
813
+ "skills/testing-extensions/SKILL.md",
814
+ "src/browser/cdp-console.ts",
815
+ "src/browser/extension-id.ts",
816
+ "src/browser/extension.ts",
817
+ "src/browser/launcher.ts",
818
+ "src/browser/manifest.ts",
819
+ "src/browser/permissions.ts",
820
+ "src/browser/session.ts",
821
+ "src/dsl/runner.ts",
822
+ "tests/integration/record.test.ts",
823
+ "tests/integration/run.test.ts",
824
+ "tests/integration/session.test.ts",
825
+ "tests/suites/sample.yaml",
826
+ "tests/unit/cdp-console.test.ts",
827
+ "tests/unit/color.test.ts",
828
+ "tests/unit/events.test.ts",
829
+ "tests/unit/explore.test.ts",
830
+ "tests/unit/extension-id.test.ts",
831
+ "tests/unit/interpolate.test.ts",
832
+ "tests/unit/launcher.test.ts",
833
+ "tests/unit/manifest.test.ts",
834
+ "tests/unit/match.test.ts",
835
+ "tests/unit/output-dir.test.ts"
836
+ ],
837
+ "codeSamples": [
838
+ {
839
+ "path": "fixtures/no-worker-extension/content.js",
840
+ "url": "https://github.com/sonic0002/pikabo/blob/main/fixtures/no-worker-extension/content.js",
841
+ "excerpt": "const marker = document.createElement('div');\nmarker.id = 'content-only-marker';\nmarker.textContent = 'content-only extension injected';\n(document.body ?? document.documentElement).appendChild(marker);\n"
842
+ },
843
+ {
844
+ "path": "src/browser/cdp-console.ts",
845
+ "url": "https://github.com/sonic0002/pikabo/blob/main/src/browser/cdp-console.ts",
846
+ "excerpt": "import { readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { ConsoleEntry } from '../types.js';\n\n/**\n * Capture the service worker's console over the DevTools protocol.\n *\n * Wrapping `console` from inside the worker — the obvious approach — misses everything logged\n * before the wrapper installs, which is exactly the window where a broken background script\n * fails. Attaching at the browser target instead gets `Runtime.enable`'s replay of the buffered\n * messages, so errors thrown on the worker's very first line still show up, with stack traces.\n *\n * Auto-attach also covers worker restarts, so `reloadExtension` needs no special handling.\n *\n * Every failure here is non-fatal: the caller falls back to wrapping `console` in-worker.\n */\n\nexport interface CdpConsole {\n evaluateExtensionTarget(path: string, functionSource: string, args: unknown, timeout?: number): Promise<unknown>;\n close(): void;\n}\n\nexport interface WorkerLifecycleEntry {\n state: 'started' | 'stopped';\n versionId: string;\n scriptUrl: string;\n targetId?: string;\n timestamp: number;\n}\n\nexport interface BrowserDownloadEntry {\n guid: string;\n suggestedFilename: string;\n url?: string;\n}\n\ninterface CdpMessage {\n id?: number;\n method?: string;\n sessionId?: string;\n params?: Record<string, unknown>;\n result?: unknown;\n error?: { message?: string };\n}\n\nexport interface BrowserSessionOptions {\n /**\n * Directory every download should land in, whatever started it. Chrome sends downloads begun\n * by `chrome.downloads.download()` straight to disk without any page involvement,"
847
+ }
848
+ ]
849
+ },
850
+ {
851
+ "fullName": "zccott/puppeteer-automation",
852
+ "url": "https://github.com/zccott/puppeteer-automation",
853
+ "categories": [
854
+ "browser extension automation"
855
+ ],
856
+ "description": "Puppeteer Browser Extension Automation is a testing project that uses Puppeteer to automate end-to-end testing of a browser extension. It enables scripted browser interactions, extension loading, and automated validation of extension behavior in a controlled Chromium environment.",
857
+ "language": "JavaScript",
858
+ "license": null,
859
+ "stars": 2,
860
+ "forks": 2,
861
+ "updatedAt": "2026-02-23T14:09:14Z",
862
+ "pushedAt": "2026-01-09T07:49:09Z",
863
+ "archived": false,
864
+ "defaultBranch": "master",
865
+ "readmeExcerpt": "# Puppeteer Browser Extension Automation\n\nThis project uses Puppeteer to automate testing for a browser extension.\n\n## Prerequisites\n- **Node.js**: Ensure Node.js (v14 or higher) is installed.\n- **npm**: Comes with Node.js for package management.\n\n## Clone the Repository\n```bash\ngit clone <repository-url>\ncd my-extension-testing-project\nnpm install\n```\n\n## Create a New Project\n```bash\nmkdir my-extension-testing-project\ncd my-extension-testing-project\nnpm init -y\nnpm install puppeteer\n```\n\n### Update `package.json`\nAdd the following script to your `package.json` file:\n```json\n\"scripts\": {\n \"test\": \"node src/tests/extension-test.js\"\n}\n```\nTo run your tests, use:\n```bash\nnpm test\n```\n\n## Recommended Folder Structure\n```\nmy-extension-testing-project/\n│\n├── src/\n│ ├── tests/\n│ │ └── extension-test.js # Your test scripts go here\n│ ├── extensions/ # Folder for your extension build files\n│ │ └── your-extension/ # Place your extension build files here\n│ └── utils/ # Utility functions (if needed)\n│\n├── package.json # Project metadata and dependencies\n├── package-lock.json # Auto-generated file for dependency versions\n└── README.md # Documentation for your project\n```\n\n## Commit Graph Video\nClick the thumbnail below to watch the Commit Graph Video:\n\n[![Demo Video](https://img.youtube.com/vi/n4buHnfDWEA/0.jpg)](https://www.youtube.com/watch?v=n4buHnfDWEA)\n",
866
+ "relevantPaths": [
867
+ ".github/workflows/puppeteer-test.yml",
868
+ "package.json",
869
+ "src/tests/login.js",
870
+ "src/tests/main.js",
871
+ "src/tests/navigation.js",
872
+ "src/tests/oscarActions.js",
873
+ "src/tests/voiceCall.js",
874
+ "src/tests2/extension-test.js",
875
+ "src/tests2/quipohealth.js",
876
+ "src/tests2/test.js",
877
+ "src/tests2/video-test.js"
878
+ ],
879
+ "codeSamples": [
880
+ {
881
+ "path": "src/tests/login.js",
882
+ "url": "https://github.com/zccott/puppeteer-automation/blob/master/src/tests/login.js",
883
+ "excerpt": "// login.js\nconst puppeteer = require('puppeteer');\n\nasync function launchBrowser(extensionPath) {\n return await puppeteer.launch({\n headless: false,\n timeout: 1200000,\n args: [\n '--no-sandbox',\n '--disable-setuid-sandbox',\n `--disable-extensions-except=${extensionPath}`,\n `--load-extension=${extensionPath}`,\n '--disable-popup-blocking', // Disable popup blocking, which can cause popups in some cases\n '--disable-notifications', // Disable notifications\n '--disable-infobars', // Prevents \"Chrome is being controlled by automated software\" message\n ],\n });\n}\n\nasync function login(page, { username, password, pin }) {\n const loginUrl = 'https://oscaremr.quipohealth.com/oscar/index.jsp';\n\n await page.goto(loginUrl, { waitUntil: 'networkidle2', timeout: 60000 });\n console.log(\"Target URL loaded. Waiting for input fields...\");\n\n const screenWidth = 1050;\n const screenHeight = 670;\n await page.setViewport({ width: screenWidth, height: screenHeight });\n\n const fillInput = async (selector, value) => {\n await page.waitForSelector(selector, { timeout: 10000 });\n await page.type(selector, value);\n console.log(`Typed '${value}' into the field: ${selector}`);\n };\n\n await fillInput('#username', username);\n await fillInput('#password2', password);\n await fillInput('#pin2', pin);\n\n await page.waitForSelector(\"button[name='submit']\", { timeout: 10000 });\n page.click(\"button[name='submit']\");\n console.log(\"Clicked the submit button.\");\n\n await page.waitForNavigation({ waitUntil: 'networkidle2', timeout: 60000 });\n consol"
884
+ },
885
+ {
886
+ "path": "src/tests/main.js",
887
+ "url": "https://github.com/zccott/puppeteer-automation/blob/master/src/tests/main.js",
888
+ "excerpt": "// main.js\nrequire('dotenv').config();\nconst { launchBrowser, login } = require('./login');\nconst { verifyUrl, interactWithElements } = require('./navigation');\nconst { findAppointment } = require('./oscarActions');\n\n(async () => {\n const extensionPath = process.env.EXTENSION_PATH || './src/extensions/build';\n const credentials = {\n username: process.env.USERNAME1,\n password: process.env.PASSWORD,\n pin: process.env.PIN,\n };\n\n const browser = await launchBrowser(extensionPath);\n const page = await browser.newPage();\n\n try {\n\n await login(page, credentials);\n\n const targetDate = new Date(process.env.TARGET_DATE);\n const expectedUrl = `https://oscaremr.quipohealth.com/oscar/provider/providercontrol.jsp?year=${targetDate.getFullYear()}&month=${targetDate.getMonth() + 1}&day=${targetDate.getDate()}&view=0&displaymode=day&dboperation=searchappointmentday&viewall=1`;\n\n await verifyUrl(page, expectedUrl);\n await interactWithElements(page);\n\n console.log(\"Extension is available\");\n\n await findAppointment(page);\n console.log(\"All tests passed successfully!\");\n } catch (error) {\n console.error(\"An error occurred:\", error);\n process.exit(1);\n } finally {\n await browser.close();\n console.log(\"Browser closed.\");\n }\n})();\n"
889
+ }
890
+ ]
891
+ },
892
+ {
893
+ "fullName": "NikEmman/workwork",
894
+ "url": "https://github.com/NikEmman/workwork",
895
+ "categories": [
896
+ "browser extension automation"
897
+ ],
898
+ "description": "A browser extension automation tool",
899
+ "language": "JavaScript",
900
+ "license": "MIT",
901
+ "stars": 0,
902
+ "forks": 0,
903
+ "updatedAt": "2026-06-06T17:14:01Z",
904
+ "pushedAt": "2026-06-06T17:13:58Z",
905
+ "archived": false,
906
+ "defaultBranch": "main",
907
+ "readmeExcerpt": "# Work work!\n\nA browser extension to automate processing a workload for huge amount of records\n\n- It fills forms, clicks search buttons, waits and extracts fetched data, updates a few fields on each record, rinse and repeat\n",
908
+ "relevantPaths": [
909
+ "LICENSE"
910
+ ],
911
+ "codeSamples": []
912
+ },
913
+ {
914
+ "fullName": "Dreamrealai/skill-creator-v2",
915
+ "url": "https://github.com/Dreamrealai/skill-creator-v2",
916
+ "categories": [
917
+ "browser extension automation"
918
+ ],
919
+ "description": "Enhanced skill-creator with browser extension automation",
920
+ "language": "Python",
921
+ "license": "Apache-2.0",
922
+ "stars": 0,
923
+ "forks": 0,
924
+ "updatedAt": "2026-04-27T04:56:35Z",
925
+ "pushedAt": "2026-04-27T01:25:48Z",
926
+ "archived": true,
927
+ "defaultBranch": "master",
928
+ "readmeExcerpt": "",
929
+ "relevantPaths": [
930
+ "LICENSE.txt",
931
+ "references/workflows.md"
932
+ ],
933
+ "codeSamples": []
934
+ },
935
+ {
936
+ "fullName": "350050183/crawl_webpage",
937
+ "url": "https://github.com/350050183/crawl_webpage",
938
+ "categories": [
939
+ "browser extension automation"
940
+ ],
941
+ "description": "A google chrome browser extension: automation crawl web pages and get particular DOM elements,save it.",
942
+ "language": "JavaScript",
943
+ "license": null,
944
+ "stars": 0,
945
+ "forks": 0,
946
+ "updatedAt": "2019-11-30T14:05:32Z",
947
+ "pushedAt": "2019-11-30T14:05:30Z",
948
+ "archived": false,
949
+ "defaultBranch": "master",
950
+ "readmeExcerpt": "# crawl_webpage\n\nA Google Chrome browser extension: automation crawl web pages and get particular DOM elements,save it.\n\n*Installation*\n\n1.checkout whole source\n\n2.open Chrome browser,navigator to More tools->extensions\n\n3.choose button of \"load unpackaged extension\"\n\n4.the icon will show up right on the top-right corner,click the icon\n\n\n*Notice*\n\nThe demo may be not work correctly because of target site's DOM changed.\nyou can edit the sources as you wish.\n\n*Contact*\n\n350050183@qq.com\n",
951
+ "relevantPaths": [],
952
+ "codeSamples": []
953
+ },
954
+ {
955
+ "fullName": "veildawn/ai-proxy-releases",
956
+ "url": "https://github.com/veildawn/ai-proxy-releases",
957
+ "categories": [
958
+ "package release artifacts"
959
+ ],
960
+ "description": "Packaged release artifacts for ai-proxy-service (source: veildawn/ai-proxy-service)",
961
+ "language": null,
962
+ "license": null,
963
+ "stars": 8,
964
+ "forks": 1,
965
+ "updatedAt": "2026-08-07T06:12:20Z",
966
+ "pushedAt": "2026-08-13T15:45:37Z",
967
+ "archived": false,
968
+ "defaultBranch": "main",
969
+ "readmeExcerpt": "# AI Proxy Service\n\nEnglish | [简体中文](README.zh.md)\n\nGot Claude, Codex, Kiro, Kimi, Cursor, or xAI subscriptions (or API keys) and want the whole team on them? Drop the accounts into a pool, share one endpoint, and see who used what, what it cost, and which account is down — from one admin panel.\n\nOne binary, one port.\n\n## What you get\n\n**Clients**\n\n- Point your usual AI clients at one address and you're in.\n- Streaming, tool calls, images, and thinking/reasoning come through. If something can't be translated, you get an error — nothing is silently dropped.\n- Codex, Claude, xAI, Kiro, Kimi, Cursor — sign in via the browser, or paste a token. Other compatible upstreams (DeepSeek, Zhipu, local models, …) can be added in the admin UI.\n- Route models by name or prefix, and rewrite to whatever the upstream actually expects.\n\n**Account pool**\n\n- Accounts take turns; the same conversation sticks to the same account when it can.\n- If one account fails, another picks up — the whole pool doesn't die with one bad key.\n- Cap concurrency per account so you don't burn upstream rate limits.\n- Each account can use its own outbound proxy.\n- Dashboard shows which accounts are alive and how hard the pool is working.\n\n**Team & billing**\n\n- Users, API keys, plans: daily / weekly / fixed-window quotas, plus a monthly budget.\n- Open registration, or invite codes only.\n- Built-in prices for common models, refreshed on startup; your custom prices stay put.\n- Usage and spend panels.\n\n**Day-to-day**\n\n- Upgrades migrate the database for you; a version mismatch refuses to start so you don't walk into a broken schema.\n- App logs, request errors, and audit logs — each with its own retention.\n- Optional Redis for quotas and OAuth refresh locks.\n- One-click self-update from the admin panel.\n- Chinese and English UI, light and dark themes.\n\n## Install\n\n### One-line install (Linux amd64 / arm64)\n\nDownloads, checksums, and installs a systemd service. You don't supply secrets — the server generates them on first start.\n\n```sh\ncurl -fsSL https://github.com/veildawn/ai-proxy-releases/releases/latest/download/install.sh | sudo bash\n```\n\nNeeds a reachable PostgreSQL. If yours isn't at the local default, pass the URL:\n\n```sh\ncurl -fsSL https://github.com/veildawn/ai-proxy-releases/releases/latest/download/install.sh \\\n | sudo DATABASE_URL='postgres://user:pass@host:5432/ai_proxy?sslmode=disable' bas",
970
+ "relevantPaths": [
971
+ ".github/workflows/ci.yml",
972
+ ".github/workflows/release.yml"
973
+ ],
974
+ "codeSamples": []
975
+ },
976
+ {
977
+ "fullName": "ffantasy94/open-design-releases",
978
+ "url": "https://github.com/ffantasy94/open-design-releases",
979
+ "categories": [
980
+ "package release artifacts"
981
+ ],
982
+ "description": "Open Design fork — packaged release artifacts + auto-update feed",
983
+ "language": null,
984
+ "license": null,
985
+ "stars": 1,
986
+ "forks": 0,
987
+ "updatedAt": "2026-06-29T02:20:58Z",
988
+ "pushedAt": "2026-08-05T10:28:54Z",
989
+ "archived": false,
990
+ "defaultBranch": "main",
991
+ "readmeExcerpt": "# Open Design — Releases\n\nPackaged release artifacts + auto-update feed for the Open Design fork.\nDownload: see Releases. Do not host source here.\n",
992
+ "relevantPaths": [],
993
+ "codeSamples": []
994
+ },
995
+ {
996
+ "fullName": "burntcookiedough/quiz_system",
997
+ "url": "https://github.com/burntcookiedough/quiz_system",
998
+ "categories": [
999
+ "package release artifacts"
1000
+ ],
1001
+ "description": "C++ quiz system with UI, data layer, build scripts, and packaged release artifacts.",
1002
+ "language": "C++",
1003
+ "license": null,
1004
+ "stars": 0,
1005
+ "forks": 0,
1006
+ "updatedAt": "2026-05-04T12:29:11Z",
1007
+ "pushedAt": "2026-03-09T17:43:47Z",
1008
+ "archived": false,
1009
+ "defaultBranch": "main",
1010
+ "readmeExcerpt": "# Quiz System\n\n## Table of Contents\n\n1. [What Is This Project?](#1-what-is-this-project)\n2. [How Does It Work?](#2-how-does-it-work)\n3. [Project Folder Structure](#3-project-folder-structure)\n4. [What You Need to Install First](#4-what-you-need-to-install-first)\n5. [How to Build and Run the Project](#5-how-to-build-and-run-the-project)\n6. [How to Use the Application Once It Is Running](#6-how-to-use-the-application-once-it-is-running)\n7. [How to Package the Final Product](#7-how-to-package-the-final-product)\n8. [Troubleshooting and Debugging](#8-troubleshooting-and-debugging)\n9. [Frequently Asked Questions](#9-frequently-asked-questions)\n\n---\n\n## 1. What Is This Project?\n\nThis is a **Quiz Management System** built entirely in C++. It is a web-based application where:\n\n- **Teachers** can create quizzes with multiple question types (Multiple Choice, True/False, Short Answer), view a dashboard of class performance, manage a student roster, and see reports.\n- **Students** can browse available quizzes, take them in a timed environment, get auto-graded results instantly, and view their own performance history.\n\nThe project has two main parts:\n\n1. **The Backend Server** (written in C++): This is the brain of the application. It handles all the data, stores quizzes as JSON files, grades student answers, and serves the web pages. It runs as a local HTTP server on your computer at port 8080.\n2. **The Frontend** (written in HTML, CSS, and JavaScript): This is the visual part you interact with in your web browser. It includes the teacher dashboard, student hub, quiz builder, and quiz-taking pages.\n\nWhen you run the project, the C++ backend starts a web server on your machine. You then open your web browser and go to `http://localhost:8080` to use the application. Everything runs locally on your own computer. No internet connection is needed after the initial setup.\n\n---\n\n## 2. How Does It Work?\n\nHere is a simplified view of what happens when you run the project:\n\n```\nYou double-click run.bat (Windows) or run ./run.sh (Mac)\n |\n v\nThe script checks if CMake and a C++ compiler are installed\n |\n v\nCMake configures the project (reads CMakeLists.txt to understand what to build)\n |\n v\nThe compiler turns main.cpp into an executable file (QuizSystem.exe on Windows, QuizSystem on Mac)\n |\n v\nThe executable starts an HTTP serv",
1011
+ "relevantPaths": [
1012
+ "QuizSystem_Release.zip"
1013
+ ],
1014
+ "codeSamples": []
1015
+ },
1016
+ {
1017
+ "fullName": "Jasonzld/lceda-extension-development-skill-20260409-042947",
1018
+ "url": "https://github.com/Jasonzld/lceda-extension-development-skill-20260409-042947",
1019
+ "categories": [
1020
+ "package release artifacts"
1021
+ ],
1022
+ "description": "Hermes skill for 嘉立创EDA / EasyEDA Pro extension development, with templates, references, and packaged release artifact.",
1023
+ "language": "TypeScript",
1024
+ "license": "MIT",
1025
+ "stars": 0,
1026
+ "forks": 0,
1027
+ "updatedAt": "2026-04-09T11:37:51Z",
1028
+ "pushedAt": "2026-04-09T11:37:43Z",
1029
+ "archived": false,
1030
+ "defaultBranch": "main",
1031
+ "readmeExcerpt": "# lceda-extension-development skill\n\n中文 | [English](#english)\n\n面向 嘉立创EDA / EasyEDA Pro 扩展开发的 Hermes skill 打包仓库。\n\n仓库内容:\n- `skill/`:skill 源文件\n- `artifacts/lceda-extension-development-skill.zip`:可直接分发的打包产物\n\n这个 skill 覆盖:\n- `pro-api-sdk` 脚手架与项目结构\n- `extension.json` 关键字段与菜单绑定\n- `eda` API 调用方式\n- `?cll=debug` 调试模式\n- 独立脚本调试\n- `.eext` 构建流程\n- LCEDA Pro 内导入与安装\n- 扩展广场发布要求\n- 官方示例与常见坑点\n\n目录说明:\n- `skill/SKILL.md`\n- `skill/templates/extension.json`\n- `skill/templates/src-index.ts`\n- `skill/references/official-links.md`\n- `artifacts/lceda-extension-development-skill.zip`\n\n## 安装到 Hermes\n\n用户级安装:\n```bash\nmkdir -p ~/.hermes/skills/software-development/lceda-extension-development\ncp skill/SKILL.md ~/.hermes/skills/software-development/lceda-extension-development/\nmkdir -p ~/.hermes/skills/software-development/lceda-extension-development/templates\nmkdir -p ~/.hermes/skills/software-development/lceda-extension-development/references\ncp skill/templates/* ~/.hermes/skills/software-development/lceda-extension-development/templates/\ncp skill/references/* ~/.hermes/skills/software-development/lceda-extension-development/references/\n```\n\n如果你下载的是 zip 产物:\n```bash\nmkdir -p ~/.hermes/skills/software-development/lceda-extension-development\nunzip artifacts/lceda-extension-development-skill.zip -d ~/.hermes/skills/software-development/lceda-extension-development\n```\n\n调用名:\n- `lceda-extension-development`\n\n## 安装到 Claude Code / Claude Desktop 风格 skill 目录\n\n示例用户目录:\n```bash\nmkdir -p ~/.claude/skills/lceda-extension-development\nunzip artifacts/lceda-extension-development-skill.zip -d ~/.claude/skills/lceda-extension-development\n```\n\n手动复制也可以:\n```bash\nmkdir -p ~/.claude/skills/lceda-extension-development/templates\nmkdir -p ~/.claude/skills/lceda-extension-development/references\ncp skill/SKILL.md ~/.claude/skills/lceda-extension-development/\ncp skill/templates/* ~/.claude/skills/lceda-extension-development/templates/\ncp skill/references/* ~/.claude/skills/lceda-extension-development/references/\n```\n\n如果你的 Claude 环境使用的是别的 skill 根目录,把同样的目录结构复制进去即可。\n\n## 安装到 OpenCode\n\n项目级:\n```bash\nmkdir -p ./.opencode/skills/lceda-extension-development\nunzip artifacts/lceda-extension-development-skill.zip -d ./.opencode/skills/lceda-extension-development\n```\n\n用户级:\n```bash\nmkdir -p ~/.config/opencode/skills/lceda-extension-development\nunzip artifacts/lceda-extension-development-skill.zip -d ~/.config/opencode/skills/lceda-extens",
1032
+ "relevantPaths": [
1033
+ "LICENSE",
1034
+ "artifacts/lceda-extension-development-skill.zip"
1035
+ ],
1036
+ "codeSamples": []
1037
+ },
1038
+ {
1039
+ "fullName": "apache/groovy-geb",
1040
+ "url": "https://github.com/apache/groovy-geb",
1041
+ "categories": [
1042
+ "browser automation"
1043
+ ],
1044
+ "description": "Apache Geb: Very Groovy Browser Automation",
1045
+ "language": "Groovy",
1046
+ "license": "Apache-2.0",
1047
+ "stars": 1174,
1048
+ "forks": 235,
1049
+ "updatedAt": "2026-08-11T08:59:34Z",
1050
+ "pushedAt": "2026-08-11T08:59:12Z",
1051
+ "archived": false,
1052
+ "defaultBranch": "master",
1053
+ "readmeExcerpt": "<!--\nSPDX-License-Identifier: Apache-2.0\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n https://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n-->\n[![Build Status](https://circleci.com/gh/apache/groovy-geb/tree/master.svg?style=shield)](https://circleci.com/gh/apache/workflows/groovy-geb/tree/master)\n[![Maven Central](https://maven-badges.herokuapp.com/maven-central/org.gebish/geb-core/badge.svg)](https://maven-badges.herokuapp.com/maven-central/org.gebish/geb-core)\n[![GitHub contributors](https://img.shields.io/github/contributors/apache/groovy-geb.svg)](https://github.com/apache/groovy-geb/graphs/contributors/)\n\nGeb (pronounced “jeb”) is a browser automation solution. It brings together the power of WebDriver, the elegance of jQuery content selection, the robustness of Page Object modelling and the expressiveness of the Groovy language.\n\nFor more information about the project, see the [https://groovy.apache.org/geb/](https://groovy.apache.org/geb/).\n\n## How to contribute\n\nPlease see [CONTRIBUTING.md](https://github.com/apache/groovy-geb/blob/master/CONTRIBUTING.md) for contribution guidelines. \n\n## Submitting issues\n\nIf you'd like to submit an issue against Geb then please use the [Geb GitHub issue tracker](https://github.com/apache/groovy-geb/issues).\nPlease avoid submitting usage questions as issues\nand instead join and ask your question on one of the following forums:\n\n| Forum |\n|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| The `geb-users@groovy.apache.org` mailing list: [Browse](https://lists.apache.org/list.",
1054
+ "relevantPaths": [
1055
+ ".github/workflows/build-check.yml",
1056
+ ".github/workflows/check-manual.yml",
1057
+ ".github/workflows/dockerised-cross-browser.yml",
1058
+ ".github/workflows/gradle-wrapper-validation.yml",
1059
+ ".github/workflows/license-check.yml",
1060
+ ".github/workflows/local-browser.yml",
1061
+ "LICENSE",
1062
+ "buildSrc/src/main/groovy/geb.dockerised-test.gradle",
1063
+ "buildSrc/src/main/groovy/geb.test-framework-integration-module.gradle",
1064
+ "buildSrc/src/main/groovy/org/gebish/gradle/ManualsPlugin.groovy",
1065
+ "doc/manual-snippets/fixtures/src/main/groovy/fixture/Browser.groovy",
1066
+ "doc/manual-snippets/real-browser/real-browser.gradle",
1067
+ "doc/manual-snippets/real-browser/src/test/groovy/browser/WebStorageSpec.groovy",
1068
+ "doc/manual-snippets/real-browser/src/test/groovy/fixture/GebSpecWithServerUsingJavascript.groovy",
1069
+ "doc/manual-snippets/real-browser/src/test/groovy/intro/GebHomepageSpec.groovy",
1070
+ "doc/manual-snippets/real-browser/src/test/groovy/intro/ScriptingSpec.groovy",
1071
+ "doc/manual-snippets/real-browser/src/test/groovy/intro/module/ManualsMenuModule.groovy",
1072
+ "doc/manual-snippets/real-browser/src/test/groovy/intro/page/GebHomePage.groovy",
1073
+ "doc/manual-snippets/real-browser/src/test/groovy/intro/page/TheBookOfGebPage.groovy",
1074
+ "doc/manual-snippets/real-browser/src/test/groovy/javascript/JQuerySupportSpec.groovy",
1075
+ "doc/manual-snippets/real-browser/src/test/groovy/modules/DateInputSnippetSpec.groovy",
1076
+ "doc/manual-snippets/real-browser/src/test/groovy/modules/DateTimeLocalInputSnippetSpec.groovy",
1077
+ "doc/manual-snippets/real-browser/src/test/groovy/modules/MonthInputSnippetSpec.groovy",
1078
+ "doc/manual-snippets/real-browser/src/test/groovy/modules/RangeInputSnippetSpec.groovy",
1079
+ "doc/manual-snippets/real-browser/src/test/groovy/modules/TimeInputSnippetSpec.groovy",
1080
+ "doc/manual-snippets/real-browser/src/test/groovy/modules/WeekInputSnippetSpec.groovy",
1081
+ "doc/manual-snippets/real-browser/src/test/groovy/navigator/BackspaceSpec.groovy",
1082
+ "doc/manual-snippets/real-browser/src/test/groovy/navigator/ControlClickSpec.groovy",
1083
+ "doc/manual-snippets/real-browser/src/test/groovy/navigator/DragAndDropSpec.groovy",
1084
+ "doc/manual-snippets/real-browser/src/test/groovy/navigator/DynamicModuleBaseSpec.groovy"
1085
+ ],
1086
+ "codeSamples": []
1087
+ },
1088
+ {
1089
+ "fullName": "webfp/tor-browser-selenium",
1090
+ "url": "https://github.com/webfp/tor-browser-selenium",
1091
+ "categories": [
1092
+ "browser automation"
1093
+ ],
1094
+ "description": "Tor Browser automation with Selenium.",
1095
+ "language": "Python",
1096
+ "license": "MIT",
1097
+ "stars": 595,
1098
+ "forks": 105,
1099
+ "updatedAt": "2026-08-12T13:36:41Z",
1100
+ "pushedAt": "2025-07-26T23:59:19Z",
1101
+ "archived": false,
1102
+ "defaultBranch": "main",
1103
+ "readmeExcerpt": "# tor-browser-selenium [![Build Status](https://app.travis-ci.com/webfp/tor-browser-selenium.svg?branch=main)](https://app.travis-ci.com/webfp/tor-browser-selenium)\n\n\nA Python library to automate Tor Browser with Selenium WebDriver.\n\n## 📦 Installation\n\n> [!WARNING]\n> Windows and macOS are currently not supported.\n\n```\npip install tbselenium\n```\n\nDownload `geckodriver` v0.31.0 from the [geckodriver releases page](https://github.com/mozilla/geckodriver/releases/) and add it to PATH.\n\n## 🚀 Usage\n\nDownload and extract [Tor Browser](https://www.torproject.org/projects/torbrowser.html.en), and pass its folder's path when you initialize `TorBrowserDriver`. In the examples below, you should not pass \"/path/to/tor-browser/\", but the (Tor Browser) folder that contains the directory called `Browser`:\n\n\n### Using with system `tor`\n\n`tor` needs to be installed (`apt install tor`) and running on port 9050.\n\n```python\nfrom tbselenium.tbdriver import TorBrowserDriver\nwith TorBrowserDriver(\"/path/to/tor-browser/\") as driver:\n driver.get('https://check.torproject.org')\n```\n\n### Using with `Stem`\nYou can use `Stem` to start a new tor process programmatically, and connect to it from `tor-browser-selenium`. Make sure you have `Stem` installed: `pip install stem`:\n\n\n```python\nimport tbselenium.common as cm\nfrom tbselenium.tbdriver import TorBrowserDriver\nfrom tbselenium.utils import launch_tbb_tor_with_stem\n\ntbb_dir = \"/path/to/tor-browser/\"\ntor_process = launch_tbb_tor_with_stem(tbb_path=tbb_dir)\nwith TorBrowserDriver(tbb_dir, tor_cfg=cm.USE_STEM) as driver:\n driver.load_url(\"https://check.torproject.org\")\n\ntor_process.kill()\n```\n\n\n## 💡 Examples\nCheck the [examples](https://github.com/webfp/tor-browser-selenium/tree/master/examples) to discover different ways to use `tor-browser-selenium`\n* [check_tpo.py](https://github.com/webfp/tor-browser-selenium/tree/master/examples/check_tpo.py): Visit the `check.torproject.org` website and print the network status message\n* [headless.py](https://github.com/webfp/tor-browser-selenium/tree/master/examples/headless.py): Headless visit and screenshot of check.torproject.org using [PyVirtualDisplay](https://pypi.org/project/PyVirtualDisplay/)\n* [onion_service.py](https://github.com/webfp/tor-browser-selenium/blob/main/examples/onion_service.py): Search using DuckDuckGo's Onion service\n* [parallel.py](https://github.com/webfp/tor-brows",
1104
+ "relevantPaths": [
1105
+ "LICENSE",
1106
+ "run_tests.py",
1107
+ "tbselenium/test/__init__.py",
1108
+ "tbselenium/test/conftest.py",
1109
+ "tbselenium/test/fixtures.py",
1110
+ "tbselenium/test/test_addons.py",
1111
+ "tbselenium/test/test_bridge.py",
1112
+ "tbselenium/test/test_browser.py",
1113
+ "tbselenium/test/test_context_switch.py",
1114
+ "tbselenium/test/test_data/borderify.xpi",
1115
+ "tbselenium/test/test_data/img_test.html",
1116
+ "tbselenium/test/test_data/js_test.html",
1117
+ "tbselenium/test/test_disable_features.py",
1118
+ "tbselenium/test/test_env.py",
1119
+ "tbselenium/test/test_exceptions.py",
1120
+ "tbselenium/test/test_screenshot.py",
1121
+ "tbselenium/test/test_set_security_level.py",
1122
+ "tbselenium/test/test_stem.py",
1123
+ "tbselenium/test/test_tbdriver.py",
1124
+ "tbselenium/test/test_tor.py",
1125
+ "tbselenium/test/test_utils.py"
1126
+ ],
1127
+ "codeSamples": [
1128
+ {
1129
+ "path": "run_tests.py",
1130
+ "url": "https://github.com/webfp/tor-browser-selenium/blob/main/run_tests.py",
1131
+ "excerpt": "#!/usr/bin/python\nfrom argparse import ArgumentParser\nfrom subprocess import call\nfrom os import environ\nfrom os.path import isdir, realpath, dirname, join\n\n\ndesc = \"Run all the TorBrowserDriver tests\"\nparser = ArgumentParser(description=desc)\nparser.add_argument('tbb_path')\nargs = parser.parse_args()\n\nif not isdir(args.tbb_path):\n raise IOError(\"Please pass the path to Tor Browser Bundle\")\n\n# TBB_PATH environment variable is used by the tests\nenviron['TBB_PATH'] = args.tbb_path\n\n# Get test directory from path of this script\nfile_path = dirname(realpath(__file__))\ntest_dir = join(file_path, 'tbselenium', 'test')\n\n# Run all the tests using py.test\ncall([\"py.test\", \"-s\", \"-v\", \"--cov=tbselenium\", \"--cov-report\",\n \"term-missing\", \"--durations=10\", test_dir])\n"
1132
+ },
1133
+ {
1134
+ "path": "tbselenium/test/__init__.py",
1135
+ "url": "https://github.com/webfp/tor-browser-selenium/blob/main/tbselenium/test/__init__.py",
1136
+ "excerpt": "# Environment variable that points to TBB directory:\nfrom os import environ\nfrom os.path import abspath, isdir\nfrom tbselenium.exceptions import TBTestEnvVarError\n\nTBB_PATH = environ.get('TBB_PATH')\n\nif TBB_PATH is None:\n raise TBTestEnvVarError(\"Environment variable `TBB_PATH` can't be found.\")\n\nTBB_PATH = abspath(TBB_PATH)\nif not isdir(TBB_PATH):\n raise TBTestEnvVarError(\"TBB_PATH is not a directory: %s\" % TBB_PATH)\n"
1137
+ }
1138
+ ]
1139
+ },
1140
+ {
1141
+ "fullName": "featurist/coypu",
1142
+ "url": "https://github.com/featurist/coypu",
1143
+ "categories": [
1144
+ "browser automation"
1145
+ ],
1146
+ "description": "Intuitive, robust browser automation for .Net",
1147
+ "language": "C#",
1148
+ "license": "MIT",
1149
+ "stars": 565,
1150
+ "forks": 137,
1151
+ "updatedAt": "2026-07-03T02:12:42Z",
1152
+ "pushedAt": "2024-04-08T17:01:45Z",
1153
+ "archived": false,
1154
+ "defaultBranch": "master",
1155
+ "readmeExcerpt": "# Coypu [![Nuget](https://img.shields.io/nuget/v/Coypu.svg)](https://www.nuget.org/packages/Coypu/) [![Nuget](https://img.shields.io/nuget/dt/Coypu.svg)](https://www.nuget.org/packages/Coypu/) ![](https://img.shields.io/badge/compatibility-.NET%20Framework%204.5%2B%20%7C%20.NET%20Standard%202.0-blue.svg)\n\n## \"Theirs not to reason why, Theirs but to do and retry\"\n&mdash; <cite>Alfred, Lord Selenium</cite>\n## \"haha, coypu must have reduced teh amount of shit code by 90%\"\n&mdash; <cite>Anonymous</cite>\n\nCoypu supports browser automation in .Net to help make tests readable, robust, fast to write and less tightly coupled to the UI. If your tests are littered with sleeps, retries, complex XPath expressions and IDs dug out of the source with browser developer tools then Coypu might help.\n\nCoypu is on Nuget:\n\n PM> Install-Package Coypu\n\nNUnit matchers (e.g. `Assert.That(browserSession, Shows.Content(\"Hello world\"));`) are in a separate package:\n\n PM> Install-Package Coypu.NUnit\n\nDiscuss Coypu and get help on the [Google Group](http://groups.google.com/group/coypu)\n\n## Coypu is\n* A robust wrapper for browser automation on .net platform for [Selenium WebDriver](https://www.selenium.dev/documentation/webdriver/) or [Microsoft Playwright](https://playwright.dev) that eases automating ajax-heavy websites and reduces coupling to the HTML, CSS & JS\n* A more intuitive API for interacting with the browser in the way a human being would, inspired by the ruby framework Capybara - http://github.com/jnicklas/capybara\n\n## Demo\n\nCheck out a [demo of Coypu](http://skillsmatter.com/podcast/open-source-dot-net/london-dot-net-user-group-may) from a talk given at Skills Matter way back in May 2011.\n\n## Browser session\n\nOpen a browser session like so:\n\n```c#\nvar browser = new BrowserSession();\n```\n\nWhen you are done with the browser session:\n\n```c#\nbrowser.Dispose();\n```\n\nor:\n\n```c#\nusing (var browser = new BrowserSession())\n{\n\t...\n}\n```\n\n## Configuration\n\nTo configure Coypu pass an instance of `Coypu.SessionConfiguration` to the constructor of BrowserSession:\n\n```c#\nvar browserSession = new BrowserSession(new SessionConfiguration{...});\n```\n\n## Website under test\n\nConfigure the website you are testing as follows\n\n```c#\nvar sessionConfiguration = new SessionConfiguration\n{\n AppHost = \"autotrader.co.uk\",\n Port = 5555,\n SSL = true|false\n};\n```\n\nIf you don't specify any of these, ",
1156
+ "relevantPaths": [
1157
+ "LICENSE.txt",
1158
+ "src/Coypu.AcceptanceTests/BasicAuth.cs",
1159
+ "src/Coypu.AcceptanceTests/Coypu.AcceptanceTests.csproj",
1160
+ "src/Coypu.AcceptanceTests/Examples/ApiExamples.cs",
1161
+ "src/Coypu.AcceptanceTests/Examples/CheckboxExamples.cs",
1162
+ "src/Coypu.AcceptanceTests/Examples/ClickExamples.cs",
1163
+ "src/Coypu.AcceptanceTests/Examples/CustomSeleniumBrowserSession.cs",
1164
+ "src/Coypu.AcceptanceTests/Examples/EnterTextExamples.cs",
1165
+ "src/Coypu.AcceptanceTests/Examples/FindExamples.cs",
1166
+ "src/Coypu.AcceptanceTests/Examples/HasExamples.cs",
1167
+ "src/Coypu.AcceptanceTests/Examples/ModalDialogExamples.cs",
1168
+ "src/Coypu.AcceptanceTests/Examples/SelectFromExamples.cs",
1169
+ "src/Coypu.AcceptanceTests/Examples/ShowsExamples.cs",
1170
+ "src/Coypu.AcceptanceTests/Examples/WindowExamples.cs",
1171
+ "src/Coypu.AcceptanceTests/Examples/WithinExamples.cs",
1172
+ "src/Coypu.AcceptanceTests/FindAllWithPredicateAndRetries.cs",
1173
+ "src/Coypu.AcceptanceTests/InnerAndOuterHtml.cs",
1174
+ "src/Coypu.AcceptanceTests/Location.cs",
1175
+ "src/Coypu.AcceptanceTests/MultipleSessions.cs",
1176
+ "src/Coypu.AcceptanceTests/PathHelper.cs",
1177
+ "src/Coypu.AcceptanceTests/Properties/AssemblyInfo.cs",
1178
+ "src/Coypu.AcceptanceTests/Properties/ParallelizableAssemblyInfo.cs",
1179
+ "src/Coypu.AcceptanceTests/Screenshots.cs",
1180
+ "src/Coypu.AcceptanceTests/SnapshotElementScope.cs",
1181
+ "src/Coypu.AcceptanceTests/StaleScopeExamples.cs",
1182
+ "src/Coypu.AcceptanceTests/States.cs",
1183
+ "src/Coypu.AcceptanceTests/TextPrecisionAndMatch.cs",
1184
+ "src/Coypu.AcceptanceTests/WaitAndRetryExamples.cs",
1185
+ "src/Coypu.AcceptanceTests/WebRequests.cs",
1186
+ "src/Coypu.AcceptanceTests/html/states.htm"
1187
+ ],
1188
+ "codeSamples": [
1189
+ {
1190
+ "path": "src/Coypu.AcceptanceTests/BasicAuth.cs",
1191
+ "url": "https://github.com/featurist/coypu/blob/master/src/Coypu.AcceptanceTests/BasicAuth.cs",
1192
+ "excerpt": "using System;\nusing System.IO;\nusing System.Text;\nusing System.Threading;\nusing Coypu.AcceptanceTests.Sites;\nusing Coypu.Drivers.Playwright;\nusing Coypu.NUnit.Matchers;\nusing NUnit.Framework;\n\nnamespace Coypu.AcceptanceTests\n{\n [TestFixture]\n public class BasicAuth\n {\n private SelfHostedSite site;\n private BrowserSession browser;\n\n [SetUp]\n public void SetUp()\n {\n site = new SelfHostedSite();\n }\n\n [TearDown]\n public void TearDown()\n {\n browser.Dispose();\n site.Dispose();\n }\n\n [Test]\n public void It_passes_through_basic_auth_from_url_as_auth_header()\n {\n var configuration = new SessionConfiguration\n {\n Timeout = TimeSpan.FromMilliseconds(1000),\n Port = site.BaseUri.Port,\n AppHost = \"http://someUser:passw0rd@localhost\",\n Driver = typeof(PlaywrightDriver), // Selenium can't do this\n Headless = false,\n Browser = Drivers.Browser.Chromium\n };\n\n browser = new BrowserSession(configuration);\n browser.Visit(\"/\");\n\n browser.Visit(\"/headers\");\n Assert.That(browser, Shows.Content(\"Authorization: \" + GetBasicAuthHeader(\"someUser\", \"passw0rd\")));\n }\n\n private string GetBasicAuthHeader(string username, string password)\n {\n var auth = $\"{username}:{password}\";\n var bytes = Encoding.UTF8.GetBytes(auth);\n return \"Basic \" + Convert.ToBase64String(bytes);\n "
1193
+ },
1194
+ {
1195
+ "path": "src/Coypu.AcceptanceTests/Examples/ApiExamples.cs",
1196
+ "url": "https://github.com/featurist/coypu/blob/master/src/Coypu.AcceptanceTests/Examples/ApiExamples.cs",
1197
+ "excerpt": "using System;\nusing Coypu.Drivers;\nusing Coypu.Drivers.Selenium;\nusing Microsoft.Playwright;\nusing NUnit.Framework;\nusing OpenQA.Selenium;\nusing OpenQA.Selenium.Firefox;\n\nnamespace Coypu.AcceptanceTests.Examples\n{\n /// <summary>\n /// Simple examples for each API method - to show usage and check everything is wired up properly\n /// </summary>\n [TestFixture]\n public class ApiExamples : WaitAndRetryExamples\n {\n public class CustomFirefoxOptionsSeleniumWebDriver : SeleniumWebDriver\n {\n public CustomFirefoxOptionsSeleniumWebDriver(Browser browser, bool headless) : base(CustomOptions(), browser) { }\n\n private static IWebDriver CustomOptions()\n {\n return new FirefoxDriver(new FirefoxOptions());\n }\n }\n\n [Test]\n public void Attributes_on_stale_scope_example()\n {\n var field = Browser.FindField(\"find-this-field\");\n Assert.That(field.Value, Is.EqualTo(\"This value is what we are looking for\"));\n\n ReloadTestPage();\n Assert.That(field.Value, Is.EqualTo(\"This value is what we are looking for\"));\n Assert.That(field.Id, Is.EqualTo(\"find-this-field\"));\n Assert.That(field[\"id\"], Is.EqualTo(\"find-this-field\"));\n }\n\n [Test]\n public void Choose_example()\n {\n Browser.Choose(\"chooseRadio1\");\n Assert.IsTrue(Browser.FindField(\"chooseRadio1\")\n .Selected);\n\n Browser.Choose(\"chooseRadio2\");\n Assert.IsTrue(Browser.F"
1198
+ }
1199
+ ]
1200
+ },
1201
+ {
1202
+ "fullName": "browserbase/stagehand-python",
1203
+ "url": "https://github.com/browserbase/stagehand-python",
1204
+ "categories": [
1205
+ "browser automation"
1206
+ ],
1207
+ "description": "The AI Browser Automation Framework",
1208
+ "language": "Python",
1209
+ "license": "MIT",
1210
+ "stars": 510,
1211
+ "forks": 116,
1212
+ "updatedAt": "2026-08-13T07:23:03Z",
1213
+ "pushedAt": "2026-07-22T23:37:04Z",
1214
+ "archived": false,
1215
+ "defaultBranch": "main",
1216
+ "readmeExcerpt": "<!-- x-stagehand-custom-start -->\n<div id=\"toc\" align=\"center\" style=\"margin-bottom: 0;\">\n <ul style=\"list-style: none; margin: 0; padding: 0;\">\n <a href=\"https://stagehand.dev\">\n <picture>\n <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://raw.githubusercontent.com/browserbase/stagehand/main/media/dark_logo.png\" />\n <img alt=\"Stagehand\" src=\"https://raw.githubusercontent.com/browserbase/stagehand/main/media/light_logo.png\" width=\"200\" style=\"margin-right: 30px;\" />\n </picture>\n </a>\n </ul>\n</div>\n<p align=\"center\">\n <strong>The AI Browser Automation Framework</strong><br>\n <a href=\"https://docs.stagehand.dev/v3/sdk/python\">Read the Docs</a>\n</p>\n\n<p align=\"center\">\n <a href=\"https://github.com/browserbase/stagehand/tree/main?tab=MIT-1-ov-file#MIT-1-ov-file\">\n <picture>\n <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://raw.githubusercontent.com/browserbase/stagehand/main/media/dark_license.svg\" />\n <img alt=\"MIT License\" src=\"https://raw.githubusercontent.com/browserbase/stagehand/main/media/light_license.svg\" />\n </picture>\n </a>\n <a href=\"https://stagehand.dev/discord\">\n <picture>\n <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://raw.githubusercontent.com/browserbase/stagehand/main/media/dark_discord.svg\" />\n <img alt=\"Discord Community\" src=\"https://raw.githubusercontent.com/browserbase/stagehand/main/media/light_discord.svg\" />\n </picture>\n </a>\n</p>\n<!-- prettier-ignore -->\n[![PyPI version](https://img.shields.io/pypi/v/stagehand.svg?label=pypi%20(stable))](https://pypi.org/project/stagehand/)\n\n<p align=\"center\">\n\t<a href=\"https://trendshift.io/repositories/12122\" target=\"_blank\"><img src=\"https://trendshift.io/api/badge/repositories/12122\" alt=\"browserbase%2Fstagehand | Trendshift\" style=\"width: 250px; height: 55px;\" width=\"250\" height=\"55\"/></a>\n</p>\n\n<p align=\"center\">\nIf you're looking for other languages, you can find them\n<a href=\"https://docs.stagehand.dev/v3/first-steps/introduction\"> here</a>\n</p>\n\n<div align=\"center\" style=\"display: flex; align-items: center; justify-content: center; gap: 4px; margin-bottom: 0;\">\n <b>Vibe code</b>\n <span style=\"font-size: 1.05em;\"> Stagehand with </span>\n <a href=\"https://director.ai\" style=\"display: flex; align-items: center;\">\n <span>Director</span>\n </a>\n <span> </span>\n <picture>\n <img alt=\"",
1217
+ "relevantPaths": [
1218
+ ".devcontainer/Dockerfile",
1219
+ ".github/workflows/ci.yml",
1220
+ ".github/workflows/publish-pypi.yml",
1221
+ ".github/workflows/release-doctor.yml",
1222
+ ".release-please-manifest.json",
1223
+ "LICENSE",
1224
+ "RELEASE_WORKFLOWS.md",
1225
+ "bin/check-release-environment",
1226
+ "examples/local_browser_playwright_example.py",
1227
+ "examples/local_server_multiregion_browser_example.py",
1228
+ "examples/remote_browser_playwright_example.py",
1229
+ "pyproject.toml",
1230
+ "release-please-config.json",
1231
+ "scripts/test",
1232
+ "scripts/test_local_mode.py",
1233
+ "scripts/utils/upload-artifact.sh",
1234
+ "tests/__init__.py",
1235
+ "tests/api_resources/__init__.py",
1236
+ "tests/api_resources/test_sessions.py",
1237
+ "tests/conftest.py",
1238
+ "tests/sample_file.txt",
1239
+ "tests/test_client.py",
1240
+ "tests/test_extract_files.py",
1241
+ "tests/test_files.py",
1242
+ "tests/test_local_server.py",
1243
+ "tests/test_models.py",
1244
+ "tests/test_qs.py",
1245
+ "tests/test_required_args.py",
1246
+ "tests/test_response.py",
1247
+ "tests/test_sea_binary.py"
1248
+ ],
1249
+ "codeSamples": [
1250
+ {
1251
+ "path": "examples/local_browser_playwright_example.py",
1252
+ "url": "https://github.com/browserbase/stagehand-python/blob/main/examples/local_browser_playwright_example.py",
1253
+ "excerpt": "\"\"\"\nExample: use a Playwright Page with the Stagehand Python SDK (local browser).\n\nWhat this demonstrates:\n- Start a Stagehand session in local mode\n- Launch a local Playwright browser server and share its CDP URL with Stagehand\n- Pass the Playwright `page` into `session.observe/act/extract/execute`\n so Stagehand auto-detects the correct `frame_id` for that page\n- Stream SSE events by default for observe/act/extract/execute\n- Run the full flow: start → observe → act → extract → agent/execute → end\n\nEnvironment variables required:\n- MODEL_API_KEY\n- BROWSERBASE_API_KEY (can be any value in local mode)\n\nOptional:\n- STAGEHAND_API_URL or STAGEHAND_BASE_URL (defaults to http://127.0.0.1:3000)\n\"\"\"\n\nfrom __future__ import annotations\n\nimport os\nimport sys\nimport json\nimport time\nimport socket\nfrom typing import Any, Optional\nfrom urllib.request import urlopen\n\nfrom env import load_example_env\n\nfrom stagehand import Stagehand\n\n\ndef _print_stream_events(stream: Any, label: str) -> object | None:\n result_payload: object | None = None\n for event in stream:\n if event.type == \"log\":\n print(f\"[{label}][log] {event.data.message}\")\n continue\n\n status = event.data.status\n print(f\"[{label}][system] status={status}\")\n if status == \"finished\":\n result_payload = event.data.result\n elif status == \"error\":\n error_message = event.data.error or \"unknown error\"\n raise RuntimeError(f\"{label} stream reported error: {error_message}\")\n\n return result_payload\n\n\ndef _pick_free_port() -> int:\n with socket."
1254
+ },
1255
+ {
1256
+ "path": "examples/local_server_multiregion_browser_example.py",
1257
+ "url": "https://github.com/browserbase/stagehand-python/blob/main/examples/local_server_multiregion_browser_example.py",
1258
+ "excerpt": "\"\"\"\nExample: local Stagehand server + multiregion Browserbase browser in eu-central-1.\n\nWhat this demonstrates:\n- Run Stagehand server locally (SEA) with Browserbase cloud browser\n- Request a Browserbase session in eu-central-1\n- Attach Playwright to the same browser via CDP (`cdp_url`)\n- Stream SSE events by default for observe/act/extract/execute\n- Run the full flow: start → observe → act → extract → agent/execute → end\n\nEnvironment variables required:\n- MODEL_API_KEY\n- BROWSERBASE_API_KEY\n\nOptional:\n- STAGEHAND_API_URL or STAGEHAND_BASE_URL (defaults to http://127.0.0.1:3000 when server=\"local\")\n\"\"\"\n\nfrom __future__ import annotations\n\nimport os\nimport sys\nfrom typing import Any, Optional\n\nfrom env import load_example_env\n\nfrom stagehand import Stagehand\n\n\ndef _print_stream_events(stream: Any, label: str) -> object | None:\n result_payload: object | None = None\n for event in stream:\n if event.type == \"log\":\n print(f\"[{label}][log] {event.data.message}\")\n continue\n\n status = event.data.status\n print(f\"[{label}][system] status={status}\")\n if status == \"finished\":\n result_payload = event.data.result\n elif status == \"error\":\n error_message = event.data.error or \"unknown error\"\n raise RuntimeError(f\"{label} stream reported error: {error_message}\")\n\n return result_payload\n\n\ndef main() -> None:\n load_example_env()\n model_api_key = os.environ.get(\"MODEL_API_KEY\")\n if not model_api_key:\n sys.exit(\"Set the MODEL_API_KEY environment variable to run this example.\")\n\n "
1259
+ }
1260
+ ]
1261
+ },
1262
+ {
1263
+ "fullName": "Seagate/cortx-s3server",
1264
+ "url": "https://github.com/Seagate/cortx-s3server",
1265
+ "categories": [
1266
+ "s3 compatible storage"
1267
+ ],
1268
+ "description": "CORTX S3 compatible storage server for CORTX",
1269
+ "language": "C++",
1270
+ "license": "Apache-2.0",
1271
+ "stars": 39,
1272
+ "forks": 87,
1273
+ "updatedAt": "2026-02-14T09:14:32Z",
1274
+ "pushedAt": "2023-06-26T06:32:55Z",
1275
+ "archived": true,
1276
+ "defaultBranch": "main",
1277
+ "readmeExcerpt": "[![ license](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://github.com/Seagate/EOS-Sandbox/blob/master/LICENSE) \n[![Codacy Badge](https://app.codacy.com/project/badge/Grade/e02de8d738bb4701b6345624ea2de66c)](https://www.codacy.com/gh/Seagate/cortx-s3server/dashboard?utm_source=github.com&amp;utm_medium=referral&amp;utm_content=Seagate/cortx-s3server&amp;utm_campaign=Badge_Grade)\n[![Slack](https://img.shields.io/badge/chat-on%20Slack-blue\")](https://cortx.link/join-slack) [![YouTube](https://img.shields.io/badge/Video-YouTube-red)](https://cortx.link/videos) [![GitHub contributors](https://img.shields.io/github/contributors/Seagate/cortx-s3server)](https://github.com/Seagate/cortx-s3server/graphs/contributors/)\n\n## Disclaimer: This project is not maintained anymore\n\n\n# CORTX-S3 Server\n\nCORTX Simple Storage Service or CORTX-S3 Server is an object storage service with high data availability, durability, scalability, performance, and security. You can use CORTX-S3 Server to store any amount of data for varying business needs and implement it across industries of varying sizes.\n\nYou can easily manage data and access controls using CORTX-S3 Server data management features.\n\n## Get CORTX-S3 Server ready!\n\nRefer to the [CORTX-S3 Server Quickstart Guide](docs/CORTX-S3%20Server%20Quick%20Start%20Guide.md) to build and test the CORTX-S3 Server.\nFor container based deployments, please refer [CORTX on AWS and Kubernetes - Quick Install Guide](https://github.com/Seagate/cortx-k8s/blob/stable/doc/cortx-aws-k8s-installation.md)\n\n## Contribute to CORTX-S3 Server\n\nWe welcome all Source Code and Documentation contributions to the CORTX-S3 Server component repository. Refer to the [CORTX S3 Server Contributing Guide](CONTRIBUTING.md) document to submit your contributions. Refer to the [CORTX S3 Architecture Guide](docs/CortxS3_Architecture.md) to learn more about how this software is organized.\n\n## CORTX Community\n\nWe are excited about your interest in CORTX and hope you will join us. Refer to the [CORTX Contribution Guide](https://github.com/Seagate/cortx/blob/main/CONTRIBUTING.md) that hosts all information about community values, code of conduct, how to contribute code and documentation, community and code style guide, and how to reach out to us. \n\nWe take community very seriously and we are committed to creating a community built on respectful interac",
1278
+ "relevantPaths": [
1279
+ ".github/workflows/alex_reviewdog.yml",
1280
+ ".github/workflows/dco-check.yml",
1281
+ ".github/workflows/dispatch_submodule_update.yml",
1282
+ ".github/workflows/triage.yml",
1283
+ ".s3cfg",
1284
+ "LICENSE",
1285
+ "addb/addb-py/chronometry/hist__s3req.py",
1286
+ "addb/addb-py/chronometry/s3_req.py",
1287
+ "addb/plugin/plugin.c",
1288
+ "ansible/files/certs/stx-s3-clients/s3/ca.crt",
1289
+ "ansible/files/certs/stx-s3/s3/ca.crt",
1290
+ "ansible/files/certs/stx-s3/s3/ca.key",
1291
+ "ansible/files/certs/stx-s3/s3/s3server.crt",
1292
+ "ansible/files/certs/stx-s3/s3/s3server.csr",
1293
+ "ansible/files/certs/stx-s3/s3/s3server.key",
1294
+ "ansible/files/certs/stx-s3/s3/s3server.pem",
1295
+ "ansible/files/s3-logrotate",
1296
+ "ansible/files/yum.repos.d/centos7.7.1908/cortx_s3_deps.repo",
1297
+ "ansible/files/yum.repos.d/centos7.8.2003/cortx_s3_deps.repo",
1298
+ "ansible/files/yum.repos.d/centos7.9.2009/cortx_s3_deps.repo",
1299
+ "ansible/files/yum.repos.d/rhel8/cortx_s3_deps.repo",
1300
+ "ansible/s3motr-build-depencies.sh",
1301
+ "ansible/setup_release_node.yml",
1302
+ "ansible/setup_s3dev_centos7.yml",
1303
+ "auth-utils/jclient/src/main/java/com/seagates3/javaclient/ClientConfig.java",
1304
+ "auth-utils/jclient/src/main/java/com/seagates3/javaclient/JavaClient.java",
1305
+ "auth-utils/jclient/src/main/java/com/seagates3/javaclient/S3API.java",
1306
+ "auth-utils/jcloudclient/src/main/java/com/seagates3/jcloudclient/ClientConfig.java",
1307
+ "auth-utils/jcloudclient/src/main/java/com/seagates3/jcloudclient/ClientService.java",
1308
+ "auth-utils/jcloudclient/src/main/java/com/seagates3/jcloudclient/EtagGenerator.java"
1309
+ ],
1310
+ "codeSamples": [
1311
+ {
1312
+ "path": "addb/addb-py/chronometry/hist__s3req.py",
1313
+ "url": "https://github.com/Seagate/cortx-s3server/blob/main/addb/addb-py/chronometry/hist__s3req.py",
1314
+ "excerpt": "#\n# Copyright (c) 2020 Seagate Technology LLC and/or its Affiliates\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n# http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\n# For any questions about this software or licensing,\n# please email opensource@seagate.com or cortx-questions@seagate.com.\n#\n\nattr={ \"name\": \"s3_req\" }\ndef query(from_, to_):\n q=f\"\"\"\n SELECT (s3r.time-s3_request_state.time) as time, s3_request_state.state, s3r.state, s3r.s3_request_id as id FROM s3_request_state\n JOIN s3_request_state s3r ON s3r.s3_request_id=s3_request_state.s3_request_id\n WHERE s3_request_state.state=\"{from_}\"\n AND s3r.state=\"{to_}\";\n \"\"\"\n return q\n\nif __name__ == '__main__':\n import sys\n sys.exit(1)\n"
1315
+ },
1316
+ {
1317
+ "path": "addb/addb-py/chronometry/s3_req.py",
1318
+ "url": "https://github.com/Seagate/cortx-s3server/blob/main/addb/addb-py/chronometry/s3_req.py",
1319
+ "excerpt": "#\n# Copyright (c) 2020 Seagate Technology LLC and/or its Affiliates\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n# http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\n# For any questions about this software or licensing,\n# please email opensource@seagate.com or cortx-questions@seagate.com.\n#\n\nimport peewee\nfrom addb2db import *\nfrom playhouse.shortcuts import model_to_dict\nimport matplotlib.pyplot as plt\n\ndef query2dlist(model):\n out=[]\n for m in model:\n out.append(model_to_dict(m))\n return out\n\ndef draw_timeline(timeline, offset):\n for i in range(len(timeline)-1):\n color = ['red', 'green', 'blue', 'yellow', 'magenta'][i%5]\n start = timeline[i]['time']\n end = timeline[i+1]['time']\n label = timeline[i]['state']\n\n plt.hlines(offset, start, end, colors=color, lw=5)\n plt.text(start, offset, label, rotation=90)\n\n end = timeline[-1]['time']\n label = timeline[-1]['state']\n plt.text(end, offset, label, rotation=90)\n\n label = timeline[0]['label']\n plt.text(end, offset, label)\n\n\ndef main():\n parser = argparse.ArgumentParser(description=\"draws s3 request tim"
1320
+ }
1321
+ ]
1322
+ },
1323
+ {
1324
+ "fullName": "drone-plugins/drone-s3-cache",
1325
+ "url": "https://github.com/drone-plugins/drone-s3-cache",
1326
+ "categories": [
1327
+ "s3 compatible storage"
1328
+ ],
1329
+ "description": "Caches build artifacts to S3 compatible storage backends",
1330
+ "language": "Go",
1331
+ "license": "Apache-2.0",
1332
+ "stars": 28,
1333
+ "forks": 32,
1334
+ "updatedAt": "2024-07-25T15:11:00Z",
1335
+ "pushedAt": "2022-12-15T10:52:41Z",
1336
+ "archived": false,
1337
+ "defaultBranch": "master",
1338
+ "readmeExcerpt": "# drone-s3-cache\n\n[![Build Status](http://cloud.drone.io/api/badges/drone-plugins/drone-s3-cache/status.svg)](http://cloud.drone.io/drone-plugins/drone-s3-cache)\n[![Gitter chat](https://badges.gitter.im/drone/drone.png)](https://gitter.im/drone/drone)\n[![Join the discussion at https://discourse.drone.io](https://img.shields.io/badge/discourse-forum-orange.svg)](https://discourse.drone.io)\n[![Drone questions at https://stackoverflow.com](https://img.shields.io/badge/drone-stackoverflow-orange.svg)](https://stackoverflow.com/questions/tagged/drone.io)\n[![](https://images.microbadger.com/badges/image/plugins/s3-cache.svg)](https://microbadger.com/images/plugins/s3-cache \"Get your own image badge on microbadger.com\")\n[![Go Doc](https://godoc.org/github.com/drone-plugins/drone-s3-cache?status.svg)](http://godoc.org/github.com/drone-plugins/drone-s3-cache)\n[![Go Report](https://goreportcard.com/badge/github.com/drone-plugins/drone-s3-cache)](https://goreportcard.com/report/github.com/drone-plugins/drone-s3-cache)\n\nDrone plugin that allows you to cache directories within the build workspace, this plugin is backed by S3 compatible storages. For the usage information and a listing of the available options please take a look at [the docs](http://plugins.drone.io/drone-plugins/drone-s3-cache/).\n\n## Build\n\nBuild the binary with the following command:\n\n```console\nexport GOOS=linux\nexport GOARCH=amd64\nexport CGO_ENABLED=0\nexport GO111MODULE=on\n\ngo build -v -a -tags netgo -o release/linux/amd64/drone-s3-cache\n```\n\n## Docker\n\nBuild the Docker image with the following command:\n\n```console\ndocker build \\\n --label org.label-schema.build-date=$(date -u +\"%Y-%m-%dT%H:%M:%SZ\") \\\n --label org.label-schema.vcs-ref=$(git rev-parse --short HEAD) \\\n --file docker/Dockerfile.linux.amd64 --tag plugins/s3-cache .\n```\n\n## Usage\n\n```console\ndocker run --rm \\\n -e PLUGIN_FLUSH=true \\\n -e PLUGIN_ENDPOINT=\"http://minio.company.com\" \\\n -e PLUGIN_ACCESS_KEY=\"myaccesskey\" \\\n -e PLUGIN_SECRET_KEY=\"mysecretKey\" \\\n -v $(pwd):$(pwd) \\\n -w $(pwd) \\\n plugins/s3-cache\n\ndocker run --rm \\\n -e PLUGIN_RESTORE=true \\\n -e PLUGIN_ENDPOINT=\"http://minio.company.com\" \\\n -e PLUGIN_ACCESS_KEY=\"myaccesskey\" \\\n -e PLUGIN_SECRET_KEY=\"mysecretKey\" \\\n -e DRONE_REPO_OWNER=\"foo\" \\\n -e DRONE_REPO_NAME=\"bar\" \\\n -e DRONE_COMMIT_BRANCH=\"test\" \\\n -v $(pwd):$(pwd) \\\n -w $(pwd) \\\n plugins/s3-cache\n\ndocker ru",
1339
+ "relevantPaths": [
1340
+ "LICENSE",
1341
+ "go.mod",
1342
+ "plugin/impl.go",
1343
+ "plugin/impl_test.go",
1344
+ "plugin/plugin.go",
1345
+ "plugin/plugin_test.go",
1346
+ "storage/s3/s3.go",
1347
+ "storage/s3/s3_test.go"
1348
+ ],
1349
+ "codeSamples": [
1350
+ {
1351
+ "path": "plugin/impl.go",
1352
+ "url": "https://github.com/drone-plugins/drone-s3-cache/blob/master/plugin/impl.go",
1353
+ "excerpt": "// Copyright (c) 2020, the Drone Plugins project authors.\n// Please see the AUTHORS file for details. All rights reserved.\n// Use of this source code is governed by an Apache 2.0 license that can be\n// found in the LICENSE file.\n\npackage plugin\n\nimport (\n\t\"fmt\"\n\t\"net/url\"\n\t\"os\"\n\tpathutil \"path\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/drone-plugins/drone-s3-cache/storage/s3\"\n\t\"github.com/drone/drone-cache-lib/archive/util\"\n\t\"github.com/drone/drone-cache-lib/cache\"\n\t\"github.com/drone/drone-cache-lib/storage\"\n\t\"github.com/sirupsen/logrus\"\n\t\"github.com/urfave/cli/v2\"\n)\n\n// Settings for the plugin.\ntype Settings struct {\n\tMode string\n\tRoot string\n\tFilename string\n\tPath string\n\tFallbackPath string\n\tFlushPath string\n\tFlushAge int\n\tMount cli.StringSlice\n\tRestore bool // DEPRECATED\n\tRebuild bool // DEPRECATED\n\tFlush bool // DEPRECATED\n\n\tS3Options s3.Options\n\tmount []string\n}\n\nconst (\n\trestoreMode = \"restore\"\n\trebuildMode = \"rebuild\"\n\tflushMode = \"flush\"\n\n\tawsDomain = \"amazonaws.com\"\n\tawsEndpoint = \"https://s3.\" + awsDomain\n)\n\n// Validate handles the settings validation of the plugin.\nfunc (p *Plugin) Validate() error {\n\tif err := p.validateMode(); err != nil {\n\t\treturn err\n\t}\n\treturn p.validateS3()\n}\n\nfunc (p *Plugin) validateMode() error {\n\t// Validate the mode\n\tmode := p.settings.Mode\n\thasMode := p.settings.Rebuild || p.settings.Restore || p.settings.Flush\n\tif mode == \"\" {\n\t\tlogrus.WithFields(logrus.Fields{\n\t\t\t\"rebuild\": p.settings.Rebuild,\n\t\t\t\"restore\": p.settings.Restore,\n\t\t\t\"flush\": p.settings.Flush,\n\t\t}).Info(\"mode "
1354
+ },
1355
+ {
1356
+ "path": "plugin/impl_test.go",
1357
+ "url": "https://github.com/drone-plugins/drone-s3-cache/blob/master/plugin/impl_test.go",
1358
+ "excerpt": "// Copyright (c) 2020, the Drone Plugins project authors.\n// Please see the AUTHORS file for details. All rights reserved.\n// Use of this source code is governed by an Apache 2.0 license that can be\n// found in the LICENSE file.\n\npackage plugin\n\nimport (\n\t\"testing\"\n)\n\nfunc TestValidate(t *testing.T) {\n\tt.Skip()\n}\n\nfunc TestExecute(t *testing.T) {\n\tt.Skip()\n}\n"
1359
+ }
1360
+ ]
1361
+ },
1362
+ {
1363
+ "fullName": "balena-io/open-balena-s3",
1364
+ "url": "https://github.com/balena-io/open-balena-s3",
1365
+ "categories": [
1366
+ "s3 compatible storage"
1367
+ ],
1368
+ "description": "Amazon S3-compatible storage backend for openBalena",
1369
+ "language": "Shell",
1370
+ "license": "AGPL-3.0",
1371
+ "stars": 13,
1372
+ "forks": 13,
1373
+ "updatedAt": "2026-08-05T04:14:44Z",
1374
+ "pushedAt": "2026-08-05T04:13:34Z",
1375
+ "archived": false,
1376
+ "defaultBranch": "master",
1377
+ "readmeExcerpt": "open-balena-s3\n==============\n\nAn S3 service based on the [Minio] cloud storage service. It is used by [openBalena] and\n[balenaMachine] to provide Amazon S3-compatible storage.\n\n[Minio]: https://minio.io\n[balenaMachine]: https://www.balena.io/machine\n[openBalena]: https://balena.io/open\n",
1378
+ "relevantPaths": [
1379
+ ".github/workflows/flowzone.yml",
1380
+ "Dockerfile",
1381
+ "LICENSE",
1382
+ "config/s6-overlay/s6-rc.d/create-buckets/dependencies.d/open-balena-s3",
1383
+ "config/s6-overlay/s6-rc.d/open-balena-s3/dependencies.d/confd",
1384
+ "config/s6-overlay/s6-rc.d/open-balena-s3/run",
1385
+ "config/s6-overlay/s6-rc.d/open-balena-s3/type",
1386
+ "config/s6-overlay/s6-rc.d/user/contents.d/open-balena-s3"
1387
+ ],
1388
+ "codeSamples": []
1389
+ },
1390
+ {
1391
+ "fullName": "irods/irods_resource_plugin_s3",
1392
+ "url": "https://github.com/irods/irods_resource_plugin_s3",
1393
+ "categories": [
1394
+ "s3 compatible storage"
1395
+ ],
1396
+ "description": "S3-compatible storage resource plugin for iRODS",
1397
+ "language": "C++",
1398
+ "license": "NOASSERTION",
1399
+ "stars": 12,
1400
+ "forks": 16,
1401
+ "updatedAt": "2026-08-10T19:25:34Z",
1402
+ "pushedAt": "2026-08-10T19:24:30Z",
1403
+ "archived": false,
1404
+ "defaultBranch": "main",
1405
+ "readmeExcerpt": "# iRODS S3 Resource Plugin\n\nThis iRODS storage resource plugin allows iRODS to use any S3-compatible storage device or service to hold iRODS Data Objects, on-premise or in the cloud.\n\nThis plugin can work as a standalone \"cacheless\" resource or as an archive resource under the iRODS compound resource. Either configuration provides a POSIX interface to data held on an object storage device or service.\n\nInstall the plugin either via your package manager (`yum`/`apt`) and [the binary distributions](https://irods.org/download/ \"iRODS Download\") or use the instructions below to build from source.\n\nThe following S3 services and appliances (in no particular order) have been tested (but may not be in continuous integration):\n\n - Amazon (AWS) S3\n - Fujifilm Object Archive\n - MinIO S3\n - Ceph S3\n - Spectra Logic Vail\n - Spectra Logic BlackPearl\n - Google Cloud Storage (GCS)\n - Wasabi S3\n - Oracle OCI\n - Quantum ActiveScale\n - Garage S3\n\n## Build Prerequisites\n\nTo build the S3 Resource Plugin, you will need to have:\n\n- the iRODS Development Tools (irods-dev(el) and irods-runtime) from https://irods.org/download\n\n- libxml2-dev(el)\n\n- libcurl4-gnutls-dev / curl-devel\n\n- libs3 from https://github.com/irods/libs3\n\n## Build Instructions\n\nAssuming the `irods_resource_plugin_s3` repository has been cloned and the desired commit is checked out:\n\n```\n$ mkdir build\n$ cd build\n$ cmake /path/to/irods_resource_plugin_s3\n$ make package\n```\n\nThis will result in a package (deb/rpm) for your platform suitable for installation.\n\n## Example Cacheless Configuration and Usage\n\nAfter installation is complete, the new plugin can be configured in cacheless mode, live on an iRODS Server:\n\n```\nirods@hostname $ iadmin mkresc s3resc s3 $(hostname):/<s3BucketName>/prefix/in/bucket \"S3_DEFAULT_HOSTNAME=s3.us-east-1.amazonaws.com;S3_AUTH_FILE=/var/lib/irods/s3.keypair;S3_REGIONNAME=us-east-1;S3_RETRY_COUNT=1;S3_WAIT_TIME_SECONDS=3;S3_PROTO=HTTP;ARCHIVE_NAMING_POLICY=consistent;HOST_MODE=cacheless_attached\"\n```\n\nA local file can be immediately put into the S3 resource:\n```\nirods@hostname $ iput -R s3resc foo.txt\n```\n\nAn object already in S3 can be registered into the iRODS Catalog:\n```\nirods@hostname $ ireg -R s3resc /<s3BucketName>/full/path/in/bucket /full/logical/path/to/dataObject\n```\n\nThe S3 Keypair file `S3_AUTH_FILE` should have exactly two values (Access Key ID and Secret Access Key), one pe",
1406
+ "relevantPaths": [
1407
+ ".github/workflows/build-and-test-plugin-with-irods-packages.yml",
1408
+ ".github/workflows/build-and-test-plugin.yml",
1409
+ ".github/workflows/linter-irods-clang-format.yml",
1410
+ ".github/workflows/linter-irods-clang-tidy.yml",
1411
+ "LICENSE",
1412
+ "irods_consortium_continuous_integration_test_hook.py",
1413
+ "libs3/.clang-format",
1414
+ "libs3/CMakeLists.txt",
1415
+ "libs3/COPYING-GPLv2",
1416
+ "libs3/COPYING-LGPLv3",
1417
+ "libs3/LICENSE",
1418
+ "libs3/README.md",
1419
+ "libs3/TODO",
1420
+ "libs3/include/libs3/error_parser.h",
1421
+ "libs3/include/libs3/libs3.h",
1422
+ "libs3/include/libs3/libs3_chunked.h",
1423
+ "libs3/include/libs3/request.h",
1424
+ "libs3/include/libs3/request_context.h",
1425
+ "libs3/include/libs3/response_headers_handler.h",
1426
+ "libs3/include/libs3/simplexml.h",
1427
+ "libs3/include/libs3/string_buffer.h",
1428
+ "libs3/include/libs3/util.h",
1429
+ "libs3/src/bucket.c",
1430
+ "libs3/src/bucket_metadata.c",
1431
+ "libs3/src/error_parser.c",
1432
+ "libs3/src/general.c",
1433
+ "libs3/src/multipart.c",
1434
+ "libs3/src/object.c",
1435
+ "libs3/src/object_chunked.c",
1436
+ "libs3/src/request.c"
1437
+ ],
1438
+ "codeSamples": [
1439
+ {
1440
+ "path": "irods_consortium_continuous_integration_test_hook.py",
1441
+ "url": "https://github.com/irods/irods_resource_plugin_s3/blob/main/irods_consortium_continuous_integration_test_hook.py",
1442
+ "excerpt": "from __future__ import print_function\n\nimport glob\nimport optparse\nimport os\nimport random\nimport shutil\nimport stat\nimport string\nimport subprocess\nimport time\nimport platform\nimport distro\nimport logging\nimport sys\n\nimport irods_python_ci_utilities\n\ndef get_package_type():\n log = logging.getLogger(__name__)\n distro_id = distro.id()\n log.debug('linux distribution detected: {0}'.format(distro_id))\n if distro_id in ['debian', 'ubuntu']:\n pt = 'deb'\n elif distro_id in ['rocky', 'almalinux', 'centos', 'rhel', 'scientific', 'opensuse', 'sles']:\n pt = 'rpm'\n else:\n if platform.mac_ver()[0] != '':\n pt = 'osxpkg'\n else:\n pt = 'not_detected'\n log.debug('package type detected: {0}'.format(pt))\n return pt\n\ndef install_test_prerequisites():\n distro_major_version = int(distro.major_version())\n ub24_or_later = (distro.id() == \"ubuntu\" and distro_major_version >= 24)\n deb13_or_later = (distro.id() == 'debian' and distro_major_version >= 13)\n if not any([ub24_or_later, deb13_or_later]):\n irods_python_ci_utilities.subprocess_get_output(['sudo', 'python3', '-m', 'pip', 'install', '--upgrade', 'pip>=20.3.4'], check_rc=True)\n irods_python_ci_utilities.subprocess_get_output(['sudo', 'python3', '-m', 'pip', 'install', 'boto3', '--upgrade'], check_rc=True)\n\n # Minio 7.1.17 imports the annontations module which only exists in Python 3.7 and beyond.\n # For OS which default to Python 3.6, we have to install the previous version of Minio to avoid\n # compatibility issues. The --upgrade flag is ign"
1443
+ }
1444
+ ]
1445
+ },
1446
+ {
1447
+ "fullName": "lolox56/Web-Scraping-Crawler-work",
1448
+ "url": "https://github.com/lolox56/Web-Scraping-Crawler-work",
1449
+ "categories": [
1450
+ "web scraping crawler"
1451
+ ],
1452
+ "description": "These scripts are examples of web scraping activities I've worked on.",
1453
+ "language": "Python",
1454
+ "license": null,
1455
+ "stars": 0,
1456
+ "forks": 0,
1457
+ "updatedAt": "2019-05-14T02:28:56Z",
1458
+ "pushedAt": "2019-05-14T02:27:00Z",
1459
+ "archived": false,
1460
+ "defaultBranch": "master",
1461
+ "readmeExcerpt": "# Web Scraping and Web Crawling \n\nThese scripts are examples of scraping activities I've worked on.\n\nSome are examples from Practical Web Scraping for Data Science book by Seppe vanden Broucke and Bart Baesens.\n\nFew comments and minor changes added. \n",
1462
+ "relevantPaths": [
1463
+ "bookdeposcrap.py",
1464
+ "dynscrap.py",
1465
+ "githubScrape.py",
1466
+ "githubScrape2.py",
1467
+ "harriScrap.py",
1468
+ "scrapHackerNews.py",
1469
+ "scrapHackerNewsApi.py",
1470
+ "scrapeBooks.py",
1471
+ "scrapeGOT.py",
1472
+ "scrapeIATA.py",
1473
+ "scrapeIATASelenium.py",
1474
+ "scrapeIATATest.py",
1475
+ "scrapeInteract.py",
1476
+ "scrapeInteractVis.py",
1477
+ "scrapeMortgage.py",
1478
+ "scrapeMortgages.py",
1479
+ "scrapeQuotes.py",
1480
+ "scrapeZalando.py",
1481
+ "testscrap.py",
1482
+ "webscrap.py",
1483
+ "wikiScrap.py"
1484
+ ],
1485
+ "codeSamples": [
1486
+ {
1487
+ "path": "bookdeposcrap.py",
1488
+ "url": "https://github.com/lolox56/Web-Scraping-Crawler-work/blob/master/bookdeposcrap.py",
1489
+ "excerpt": "import requests\r\nfrom bs4 import BeautifulSoup\r\nimport pandas as pd\r\n\r\nurl = 'https://www.bookdepository.com'\r\nr = requests.get(url)\r\nsoup = BeautifulSoup(r.content,'html.parser')\r\n\r\ndata = {\"bookTitles\": [],\r\n \"bookAuthor\": [],\r\n \"pubDates\": []}\r\n\r\nbtTags = soup.select('.title a')\r\nbookTitles = []\r\nfor btTag in btTags:\r\n bookTitles.append(btTag.text.strip())\r\n\r\nbaTagsSpan = soup.select('.author span a > span')\r\n#print(baTagsSpan)\r\n#baTags = baTagsSpan.select('a > span')\r\nbookAuthors = []\r\nfor baTag in baTagsSpan:\r\n bookAuthors.append(baTag.text.strip())\r\n\r\npdTags = soup.select('.published')\r\npubDates = []\r\nfor pdTag in pdTags:\r\n pubDates.append(pdTag.text.strip('\\n'))\r\n\r\n\r\n\r\n\"\"\"\r\n#print(bookTitles)\r\n#print(bookAuthors)\r\n#print(pubDates)\r\n\"\"\"\r\n\r\n\r\ndata['bookTitles'].extend(bookTitles)\r\ndata['bookAuthor'].extend(bookAuthors)\r\ndata['pubDates'].extend(pubDates)\r\n\r\n\r\ndata['bookAuthor'].append('N/A')\r\n#print(len(bookTitles), len(bookAuthors), len(pubDates), len(baTagsSpan))\r\ndf = pd.DataFrame(data=data)\r\n\r\nprint(df.head())\r\n\r\n\"\"\"\r\n# Code that does the same::\r\n\r\nurl = \"\"\r\n\r\nf = open('books.txt,'w')\r\n\r\nr = requests.get(url)\r\ndata_list = []\r\nnew_item = []\r\nsoup = BeautifulSoup(r.content,'html.parser')\r\n\r\nfor item in soup.findAll('', {'itemprop':'name'}):\r\n new_item.append(item.get('content'))\r\ndata_list.append(new_item)\r\n\r\nnew_item = []\r\nfor item in soup.findAll('', {'itemprop':'contributor'}):\r\n new_item.append(item.get('content'))\r\ndata_list.append(new_item)\r\n\r\nnew_item = []\r\nfor item in soup.findAll('', {'class':'published'}):\r\n new_item.append(st"
1490
+ },
1491
+ {
1492
+ "path": "dynscrap.py",
1493
+ "url": "https://github.com/lolox56/Web-Scraping-Crawler-work/blob/master/dynscrap.py",
1494
+ "excerpt": "# Note that webdrivers are in general slower than Requests. That's why you use webdrivers only for dynamic websites.\r\n\r\nfrom selenium import webdriver\r\nimport json\r\nimport pandas as pd\r\n# import os\r\n\r\nurl = \"https://finance.yahoo.com/quote/AAPL/key-statistics?p=AAPL\"\r\n\r\n# y=os.environ['phanthomPATH'] # added to environmental variables and can be assessed like this\r\n# print(y) #Output (w/out quotes) -- 'C://Users//ASUS//Desktop//phantomjs-2.1.1-windows//bin//phantomjs.exe'\r\n\r\n# creates a webdriver element, a headless browser in this case.\r\nbrowser = webdriver.PhantomJS(executable_path='C://Users//ASUS//Desktop//phantomjs-2.1.1-windows//bin//phantomjs.exe')\r\n\r\nbrowser.get(url) # browser accesses given URL.\r\n\r\n# print(browser.page_source) -- prints out all html+css+scripting source code from website.\r\n\r\n# Quick XML Path (XPATH) TUTORIAL\r\n# ----------------------------------------------------------------------------------------------------------------------\r\n\"\"\"\r\n#element = browser.find_element_by_xpath(\"html\") -- returns a web-element object, an html node in this case.\r\nelements = browser.find_elements_by_xpath(\"html/*\") #returns list of web-element objects, all child nodes of html node - head and body.\r\n\r\nfor element in elements:\r\n print(element.tag_name + \"\\n\") # self-explanatory - prints head and body\r\n newElements = element.find_elements_by_xpath(\"./*\") #goes deeper - obtains all child nodes of head and body\r\n for newElement in newElements:\r\n print(newElement.tag_name) # prints all tags under head and body each\r\n print(\"\\n\")\r\n\"\"\"\r\n# ------------------"
1495
+ }
1496
+ ]
1497
+ },
1498
+ {
1499
+ "fullName": "NicolasMenezzes/WebScraping-Kanui",
1500
+ "url": "https://github.com/NicolasMenezzes/WebScraping-Kanui",
1501
+ "categories": [
1502
+ "web scraping crawler"
1503
+ ],
1504
+ "description": "Web Scraping/Crawler feito em NodeJS, retirando produtos e preço (dos mais populares por categoria) do site da Kanui. ",
1505
+ "language": "JavaScript",
1506
+ "license": null,
1507
+ "stars": 0,
1508
+ "forks": 0,
1509
+ "updatedAt": "2020-05-06T17:12:55Z",
1510
+ "pushedAt": "2021-05-11T13:10:00Z",
1511
+ "archived": false,
1512
+ "defaultBranch": "master",
1513
+ "readmeExcerpt": "# WebScraping-Kanui\n\n# Web Scraping Kanui\n\n> Web Scraping/Crawler feito em NodeJS, retirando produtos e preço (dos mais populares por categoria) do site da Kanui. Foi utilizado libs como Axios para Requisições e verificação da URL e também a lib Cheerio para identificação do HTML e abstração do core do Jquery. Além disso foi gravado todo o conteúdo retirado todo o conteúdo e gravado em um arquivo .txt utilizando a tecnologia fs.\n\n> Link do site que foi retirada as informações: https://www.kanui.com.br/\n\n\n## Tecnologias Utilizadas\n- <a href=\"https://nodejs.org/en/\">NodeJS</a>\n- <a href=\"https://github.com/axios/axios\">Axios</a>\n- <a href=\"https://github.com/cheeriojs/cheerio\">Cheerio</a>\n- <a href=\"https://nodejs.org/api/fs.html\">File System</a>\n\n\n## Reprodução\n\n- Você deve clonar este repositorio\n\n- Após a clonagem, você deve rodar este comando dentro do projeto:\n>\n\n```shell\n$ npm start\n```\n\n- Projeto está livre para qualquer alteração e coletagem de mais dados.\n\n## License\n\n[![License](http://img.shields.io/:license-mit-blue.svg?style=flat-square)](http://badges.mit-license.org)\n\n- **[MIT license](http://opensource.org/licenses/mit-license.php)**\n",
1514
+ "relevantPaths": [
1515
+ "package.json"
1516
+ ],
1517
+ "codeSamples": []
1518
+ },
1519
+ {
1520
+ "fullName": "Neohu-ceo/spider-ops",
1521
+ "url": "https://github.com/Neohu-ceo/spider-ops",
1522
+ "categories": [
1523
+ "web scraping crawler"
1524
+ ],
1525
+ "description": "🕷️ Web scraping & crawler automation skill suite for AI agents — 爬虫自动化运维技能包",
1526
+ "language": null,
1527
+ "license": null,
1528
+ "stars": 0,
1529
+ "forks": 0,
1530
+ "updatedAt": "2026-07-02T02:08:12Z",
1531
+ "pushedAt": "2026-07-02T02:08:08Z",
1532
+ "archived": false,
1533
+ "defaultBranch": "main",
1534
+ "readmeExcerpt": "",
1535
+ "relevantPaths": [],
1536
+ "codeSamples": []
1537
+ },
1538
+ {
1539
+ "fullName": "mlwithshuvo7/Vibe-Coding",
1540
+ "url": "https://github.com/mlwithshuvo7/Vibe-Coding",
1541
+ "categories": [
1542
+ "browser extension automation"
1543
+ ],
1544
+ "description": "A collection of AI-powered coding projects, browser extensions, automation bots, prompts, UI designs, and experiments.",
1545
+ "language": "JavaScript",
1546
+ "license": "MIT",
1547
+ "stars": 0,
1548
+ "forks": 0,
1549
+ "updatedAt": "2026-07-18T21:34:06Z",
1550
+ "pushedAt": "2026-07-18T21:34:02Z",
1551
+ "archived": false,
1552
+ "defaultBranch": "main",
1553
+ "readmeExcerpt": "# 🚀 Vibe-Coding\n\n<p align=\"center\">\n <img src=\"https://readme-typing-svg.herokuapp.com?font=Poppins&size=28&duration=3000&pause=1000&color=1F6FEB&center=true&vCenter=true&width=900&lines=Welcome+to+Vibe-Coding;AI+Projects+%7C+Automation+%7C+Chrome+Extensions;Machine+Learning+%7C+Python+%7C+Web+Development;Open+Source+Projects+by+Shuvo+Kundu;Build.+Learn.+Create.+Share.\" />\n</p>\n\n<p align=\"center\">\n\n![GitHub Repo](https://img.shields.io/badge/Repository-Vibe--Coding-181717?style=for-the-badge&logo=github)\n![Python](https://img.shields.io/badge/Python-3.x-3776AB?style=for-the-badge&logo=python&logoColor=white)\n![JavaScript](https://img.shields.io/badge/JavaScript-ES6-F7DF1E?style=for-the-badge&logo=javascript&logoColor=black)\n![Machine Learning](https://img.shields.io/badge/Machine-Learning-orange?style=for-the-badge)\n![AI](https://img.shields.io/badge/Artificial-Intelligence-red?style=for-the-badge)\n![Chrome Extensions](https://img.shields.io/badge/Chrome-Extensions-4285F4?style=for-the-badge&logo=googlechrome&logoColor=white)\n![Automation](https://img.shields.io/badge/Automation-Bots-success?style=for-the-badge)\n![Open Source](https://img.shields.io/badge/Open-Source-blueviolet?style=for-the-badge)\n![License](https://img.shields.io/badge/License-MIT-brightgreen?style=for-the-badge)\n\n</p>\n\n<p align=\"center\">\n<b>A collection of AI-powered projects, browser extensions, automation bots, prompts, UI designs, and development resources.</b>\n\nBuilt for developers, students, freelancers, and anyone passionate about creating innovative software with modern technologies.\n</p>\n\n---\n\n# 📖 About\n\n**Vibe-Coding** is my personal open-source repository where I organize and share projects related to:\n\n- 🤖 Artificial Intelligence\n- 🧠 Machine Learning\n- 🌐 Web Development\n- 🧩 Chrome Extensions\n- ⚡ Automation Bots\n- 🖥️ Python Applications\n- 🎨 UI/UX Design\n- 📝 AI Prompts\n- 📚 Documentation\n- 🚀 Experimental Projects\n\nThe goal of this repository is to build useful tools, learn modern technologies, and share high-quality resources with the developer community.\n\n---\n\n# 📂 Repository Structure\n\n```text\nVibe-Coding/\n│\n├── 📁 Projects/\n│ ├── Chrome Extensions/\n│ ├── AI Agents/\n│ ├── Automation Bots/\n│ ├── SaaS Apps/\n│ ├── Machine Learning/\n│ ├── Python Projects/\n│ ├── Web Development/\n│ ├── APIs/\n│ ├── Data Science/\n│ ├── Open Source/\n│ └── Experimental/\n│",
1554
+ "relevantPaths": [
1555
+ "LICENSE"
1556
+ ],
1557
+ "codeSamples": []
1558
+ },
1559
+ {
1560
+ "fullName": "Ivos1991/browser_extension_automation",
1561
+ "url": "https://github.com/Ivos1991/browser_extension_automation",
1562
+ "categories": [
1563
+ "browser extension automation"
1564
+ ],
1565
+ "description": null,
1566
+ "language": "Python",
1567
+ "license": null,
1568
+ "stars": 0,
1569
+ "forks": 0,
1570
+ "updatedAt": "2026-05-07T12:47:43Z",
1571
+ "pushedAt": "2026-05-07T15:22:00Z",
1572
+ "archived": false,
1573
+ "defaultBranch": "main",
1574
+ "readmeExcerpt": "# Browser Automation SentinelOne\n\nProduction-style Pytest + Playwright framework for validating a browser extension that allows approved GenAI sites and blocks restricted ones.\n\n## Architecture\n\n- `config/`: environment-backed typed settings\n- `constants/`: shared messages, extension paths, and evidence-mode constants\n- `actions/`: reusable low-level Playwright operations\n- `core/`: browser factory, logging, reporting, evidence, and visual regression utilities\n- `fixtures/`: global browser lifecycle fixtures\n- `pages/`: thin page objects and extension bootstrap page\n- `tests/ui/`: UI scenarios and UI-specific fixtures\n- `.github/workflows/`: CI checks for push and pull requests\n\n## Coverage\n\nImplemented UI scenarios:\n\n- `test_accessing_allowed_chatgpt_url_expects_successful_access`\n- `test_accessing_blocked_gemini_url_expects_access_denied_page`\n- `test_accessing_configured_blocked_url_expects_access_denied_page`\n- `test_accessing_blocked_gemini_url_expects_blocked_page_visual_layout`\n- `test_refreshing_blocked_gemini_url_expects_access_denied_page_to_persist`\n- `test_opening_blocked_gemini_url_in_new_tab_expects_access_denied_page`\n- `test_accessing_blocked_gemini_url_with_invalid_extension_api_key_expects_no_policy_enforcement`\n- `test_accessing_blocked_gemini_url_with_invalid_extension_api_domain_expects_no_policy_enforcement`\n- `test_accessing_blocked_gemini_url_with_missing_extension_configuration_expects_no_policy_enforcement`\n\nThe visual test compares the blocked modal screenshot to a committed baseline in `tests/ui/snapshots/gemini-blocked-modal.png`.\n\nMarker groups:\n\n- `ui`: full browser-extension UI suite\n- `positive`: allowed-access and enforcement-resilience scenarios\n- `negative`: misconfiguration and failure-mode scenarios\n- `visual`: visual regression validation\n\n## Extension Strategy\n\nPlaywright extension automation requires an unpacked extension loaded through a persistent Chromium context.\n\nThis framework supports that directly:\n\n- `--disable-extensions-except=<EXTENSION_PATH>`\n- `--load-extension=<EXTENSION_PATH>`\n\nFor a real CI pipeline, the unpacked extension would come from a build artifact. For this assignment, the practical fallback is:\n\n1. Install the extension once in Chrome\n2. Copy the installed version folder into `extensions/prompt-security`\n3. Run the framework against that unpacked payload\n\nAt runtime, the framework opens the e",
1575
+ "relevantPaths": [
1576
+ ".github/workflows/ci.yml",
1577
+ "conftest.py",
1578
+ "core/browser_factory.py",
1579
+ "core/testing_utils/__init__.py",
1580
+ "core/testing_utils/evidence.py",
1581
+ "core/testing_utils/playwright_artifacts.py",
1582
+ "core/testing_utils/visual_regression.py",
1583
+ "fixtures/browser_fixtures.py",
1584
+ "pyproject.toml",
1585
+ "pytest.ini",
1586
+ "tests/__init__.py",
1587
+ "tests/ui/__init__.py",
1588
+ "tests/ui/conftest.py",
1589
+ "tests/ui/snapshots/gemini-blocked-modal.png",
1590
+ "tests/ui/test_extension_access.py",
1591
+ "tests/ui/test_negative_extension_access.py"
1592
+ ],
1593
+ "codeSamples": [
1594
+ {
1595
+ "path": "conftest.py",
1596
+ "url": "https://github.com/Ivos1991/browser_extension_automation/blob/main/conftest.py",
1597
+ "excerpt": "import pytest\n\nfrom config.settings import Settings\nfrom core.core_utils.logger import configure_logging, get_logger\nfrom core.reporting import attach_text, write_allure_environment\nfrom core.testing_utils.playwright_artifacts import attach_test_evidence\n\n\npytest_plugins = (\"fixtures.browser_fixtures\",)\n\n\n@pytest.fixture(scope=\"session\")\ndef settings() -> Settings:\n return Settings.from_env()\n\n\n@pytest.fixture(scope=\"session\", autouse=True)\ndef framework_logging(settings: Settings) -> None:\n configure_logging(settings.log_dir, settings.log_level)\n\n\n@pytest.fixture(scope=\"session\", autouse=True)\ndef write_environment_metadata(settings: Settings) -> None:\n write_allure_environment(\n settings.allure_results_dir,\n {\n \"target_env\": settings.target_env,\n \"headless\": str(settings.headless).lower(),\n \"browser_channel\": settings.browser_channel,\n \"allowed_url\": settings.allowed_url,\n \"blocked_url\": settings.blocked_url,\n \"extension_path\": str(settings.extension_path or \"\"),\n \"extension_api_domain\": settings.extension_api_domain,\n \"browser_evidence_mode\": settings.browser_evidence_mode,\n \"extension_logs_enabled\": str(settings.extension_logs_enabled).lower(),\n },\n )\n\n\n@pytest.fixture(scope=\"session\")\ndef logger():\n return get_logger(\"tests\")\n\n\ndef pytest_collection_modifyitems(config: pytest.Config, items: list[pytest.Item]) -> None:\n try:\n Settings.from_env()\n except ValueError as error:\n raise pytest.UsageError(str(error)) from er"
1598
+ },
1599
+ {
1600
+ "path": "core/browser_factory.py",
1601
+ "url": "https://github.com/Ivos1991/browser_extension_automation/blob/main/core/browser_factory.py",
1602
+ "excerpt": "import shutil\nfrom pathlib import Path\nfrom tempfile import mkdtemp\n\nfrom playwright.sync_api import BrowserContext, Playwright\n\nfrom config.settings import Settings\nfrom core.exceptions import ExtensionConfigurationError\nfrom core.testing_utils.evidence import should_record_video\n\n\nclass BrowserFactory:\n def __init__(self, playwright: Playwright, settings: Settings, logger, collect_all_evidence_requested: bool = False) -> None:\n self.playwright = playwright\n self.settings = settings\n self.logger = logger\n self.collect_all_evidence_requested = collect_all_evidence_requested\n self._user_data_dir: Path | None = None\n\n def launch(self) -> BrowserContext:\n extension_path = self._validated_extension_path()\n user_data_dir = Path(mkdtemp(prefix=\"pw-ext-\", dir=str(self.settings.playwright_output_dir)))\n self._user_data_dir = user_data_dir\n self.logger.info(\"Launching persistent Chromium context with extension: %s\", extension_path)\n\n context = self.playwright.chromium.launch_persistent_context(\n user_data_dir=str(user_data_dir),\n channel=self.settings.browser_channel,\n headless=self.settings.headless,\n slow_mo=self.settings.slow_mo_ms,\n ignore_default_args=[\"--disable-extensions\"],\n args=[\n f\"--disable-extensions-except={extension_path}\",\n f\"--load-extension={extension_path}\",\n ],\n viewport={\"width\": 1600, \"height\": 1000},\n accept_downloads=True,\n ignore_https_errors=Tru"
1603
+ }
1604
+ ]
1605
+ },
1606
+ {
1607
+ "fullName": "Photon101/browser-extension-automation-starter",
1608
+ "url": "https://github.com/Photon101/browser-extension-automation-starter",
1609
+ "categories": [
1610
+ "browser extension automation"
1611
+ ],
1612
+ "description": null,
1613
+ "language": "JavaScript",
1614
+ "license": null,
1615
+ "stars": 0,
1616
+ "forks": 0,
1617
+ "updatedAt": "2026-05-17T06:33:38Z",
1618
+ "pushedAt": "2026-05-17T06:33:35Z",
1619
+ "archived": false,
1620
+ "defaultBranch": "main",
1621
+ "readmeExcerpt": "# Browser Extension Automation Starter\n\nSmall Chrome/Firefox WebExtension starter for local-first browser automation, page extraction, and repetitive workflow helpers.\n\nThis is proof-of-work for browser-extension jobs where the deliverable needs to stay in the user's browser instead of a cloud service.\n\n## What It Shows\n\n- Manifest V3 extension structure.\n- Content script that extracts page facts without sending data to a server.\n- Popup UI for one-click extraction.\n- Options page for configurable extraction selectors.\n- Shared rules module with unit tests.\n- No build step, no tracking, and no remote code.\n\n## Run Tests\n\n```bash\nnpm test\n```\n\n## Load Locally\n\n1. Open Chrome or Chromium at `chrome://extensions`.\n2. Enable Developer Mode.\n3. Choose `Load unpacked`.\n4. Select this repository directory.\n\nFor Firefox, use `about:debugging#/runtime/this-firefox` and choose `manifest.json`.\n\n## Extension Behavior\n\nThe extension reads the active tab only when the popup action is clicked. It extracts:\n\n- page title\n- canonical URL\n- meta description\n- headings\n- configured CSS selector matches\n\nThe result is rendered in the popup and copied as JSON on request.\n\n## Production Next Steps\n\nFor client work, the next steps are usually platform-specific selectors, auth-aware flows, export destinations, retry/error reporting, and manual review controls for actions that modify pages.\n\n",
1622
+ "relevantPaths": [
1623
+ "package.json",
1624
+ "tests/rules.test.js"
1625
+ ],
1626
+ "codeSamples": [
1627
+ {
1628
+ "path": "tests/rules.test.js",
1629
+ "url": "https://github.com/Photon101/browser-extension-automation-starter/blob/main/tests/rules.test.js",
1630
+ "excerpt": "import assert from \"node:assert/strict\";\nimport { readFileSync } from \"node:fs\";\nimport test from \"node:test\";\nimport vm from \"node:vm\";\n\nconst context = { globalThis: {} };\ncontext.globalThis = context;\nvm.createContext(context);\nvm.runInContext(readFileSync(new URL(\"../src/rules.js\", import.meta.url), \"utf-8\"), context);\n\nconst {\n DEFAULT_SELECTORS,\n buildExtraction,\n cleanText,\n normalizeSelectorList,\n summarizeMatches\n} = context.BrowserExtensionAutomationRules;\n\nfunction plain(value) {\n return JSON.parse(JSON.stringify(value));\n}\n\ntest(\"normalizes selector lists from lines and commas\", () => {\n assert.deepEqual(plain(normalizeSelectorList(\"h1, .price\\nh1\\n[data-id]\")), [\n \"h1\",\n \".price\",\n \"[data-id]\"\n ]);\n});\n\ntest(\"falls back to default selectors for blank input\", () => {\n assert.deepEqual(normalizeSelectorList(\" \\n \"), DEFAULT_SELECTORS);\n});\n\ntest(\"cleans text safely\", () => {\n assert.equal(cleanText(\" A\\n\\t messy value \"), \"A messy value\");\n assert.equal(cleanText(null), \"\");\n});\n\ntest(\"summarizes selector matches\", () => {\n const matches = plain(summarizeMatches([\n { selector: \"a\", text: \" Example link \", href: \"https://example.com\" },\n { selector: \".empty\", text: \" \", href: \"\" }\n ]));\n assert.deepEqual(matches, [\n { selector: \"a\", text: \"Example link\", href: \"https://example.com\" }\n ]);\n});\n\ntest(\"builds extraction packet\", () => {\n const extraction = buildExtraction({\n title: \" Test Page \",\n url: \" https://example.com \",\n description: \" Demo \",\n headings: [\" Main \", \"\"],\n matches: [{ selector: \"h1\", text: \""
1631
+ }
1632
+ ]
1633
+ },
1634
+ {
1635
+ "fullName": "Yechan-Ahn/sfdc-automation-kit",
1636
+ "url": "https://github.com/Yechan-Ahn/sfdc-automation-kit",
1637
+ "categories": [
1638
+ "browser extension automation"
1639
+ ],
1640
+ "description": "Field-tested building blocks for browser-extension automation on Salesforce Lightning: deep Shadow DOM queries, Aura-safe events, safety-gated name matching + a Claude Code skill",
1641
+ "language": "JavaScript",
1642
+ "license": "MIT",
1643
+ "stars": 0,
1644
+ "forks": 0,
1645
+ "updatedAt": "2026-07-31T04:17:23Z",
1646
+ "pushedAt": "2026-07-31T04:17:16Z",
1647
+ "archived": false,
1648
+ "defaultBranch": "master",
1649
+ "readmeExcerpt": "# sfdc-automation-kit\n\nField-tested building blocks for automating Salesforce Lightning from a\nbrowser extension — deep Shadow DOM queries, Aura-safe synthetic events,\nand safety-gated person-name matching. Plus a Claude Code skill that\nteaches an AI assistant every production lesson behind them.\n\nBorn from a real internal tool: a case-assignment macro built by a\n(non-developer) team lead for a customer-service team, iterated from v1.0\nto v1.9 in three weeks of chat-driven feedback, used daily on thousands of\ncases. This kit is the generic, employer-clean distillation — no internal\nsystems, data, or names; just the parts that are true in any Lightning org.\n\n## Why this exists\n\nFrontline teams live in Salesforce, repeat the same ten clicks hundreds of\ntimes a day, and can't get automation built for them: admin permissions,\nIT backlogs, budgets, and the fact that their real routing logic lives in\na spreadsheet IT has never heard of. A browser extension flips that:\ninstalls per-user with no admin rights, sees the same screen the user\nsees, and can read the team's own files. AI assistants can now write most\nof the code — what they lack is the scar tissue. This repo is the scar\ntissue.\n\n### Isn't this what Agentforce / native routing is for?\n\nDifferent axis. Platform-native routing (assignment rules, Omni-Channel,\nAgentforce) is the right answer when an admin, a budget, and a data\nintegration project are available. This kit is for when they aren't:\n\n| | Platform-native | Browser-extension macro |\n|---|---|---|\n| Who can deploy | Admin + project | Any user, today |\n| Rule source | Data inside the org | The team's living spreadsheet + internal APIs, via the user's own session |\n| Decisions | Increasingly LLM-based | Deterministic, explainable, auditable |\n| Cost model | Licenses / per-use | Zero marginal cost |\n\nThe pattern worth stealing: **use AI to build the tool, keep the runtime\ndeterministic.** Wrong-owner assignments are expensive; every automated\ndecision here reduces to one explainable log line, and anything uncertain\nstops and asks a human.\n\n## What's inside\n\n```\nsrc/lightning-dom.js deep shadow-root queries, visible-instance picking,\n effectiveClick, native value setter, human-like\n typing for server-backed lookups, polling waits\nsrc/name-match.js query ladder (spacing/hyphen/prefix variants — never\n ",
1650
+ "relevantPaths": [
1651
+ "LICENSE",
1652
+ "package.json",
1653
+ "skill/references/architecture-and-testing.md",
1654
+ "test/name-match.test.js"
1655
+ ],
1656
+ "codeSamples": [
1657
+ {
1658
+ "path": "test/name-match.test.js",
1659
+ "url": "https://github.com/Yechan-Ahn/sfdc-automation-kit/blob/master/test/name-match.test.js",
1660
+ "excerpt": "// Tests for src/name-match.js — run with: npm test (or node test/name-match.test.js)\n// All person names below are invented for testing.\nimport { strict as assert } from 'node:assert';\nimport {\n ACCEPT_SCORE, lettersOf, tokensOf, editDistance, sameIdentity, scoreCandidate,\n buildQueryLadder, findAwayMarker, stripAwayMarkers, evaluateCandidates, trimToTargetTokens,\n} from '../src/name-match.js';\nimport * as dom from '../src/lightning-dom.js';\n\nlet pass = 0;\nconst fails = [];\nfunction t(name, fn) {\n try { fn(); pass++; } catch (e) { fails.push(`${name}: ${e.message}`); }\n}\n\n/* ---- lightning-dom.js: parses as ESM and exports the API ---- */\nt('lightning-dom exports', () => {\n for (const fn of ['deepQueryAll', 'deepQueryOne', 'deepQueryVisible', 'effectiveClick', 'setNativeValue', 'simulateTyping', 'waitFor', 'sleep']) {\n assert.equal(typeof dom[fn], 'function', fn);\n }\n});\n\n/* ---- normalization ---- */\nt('lettersOf strips spacing/hyphen/case/NBSP', () => {\n assert.equal(lettersOf('Ha Na Yoon'), 'hanayoon');\n assert.equal(lettersOf('Jae-Min Lee'), 'jaeminlee');\n assert.equal(lettersOf(' '), '');\n});\nt('tokensOf splits on hyphen and punctuation', () => {\n assert.deepEqual(tokensOf('Jae-Min Lee'), ['jae', 'min', 'lee']);\n assert.deepEqual(tokensOf('Hana Kim '), ['hana', 'kim']);\n});\nt('editDistance basics', () => {\n assert.equal(editDistance('lenapark', 'linapark'), 1);\n assert.equal(editDistance('abc', 'abc'), 0);\n});\n\n/* ---- identity gate ---- */\nt('identity: spacing/fusion/case variants are same person', () => {\n assert.ok(sameIdentity('Hana Kim', 'HaNa K"
1661
+ }
1662
+ ]
1663
+ },
1664
+ {
1665
+ "fullName": "browser-use/browser-use",
1666
+ "url": "https://github.com/browser-use/browser-use",
1667
+ "categories": [
1668
+ "browser automation"
1669
+ ],
1670
+ "description": "🌐 Make websites accessible for AI agents. Automate tasks online with ease.",
1671
+ "language": "Python",
1672
+ "license": "MIT",
1673
+ "stars": 109121,
1674
+ "forks": 11983,
1675
+ "updatedAt": "2026-08-14T00:31:04Z",
1676
+ "pushedAt": "2026-08-13T19:28:15Z",
1677
+ "archived": false,
1678
+ "defaultBranch": "main",
1679
+ "readmeExcerpt": "<!-- mcp-name: com.browser-use/browser-use -->\n<picture>\n <source media=\"(prefers-color-scheme: light)\" srcset=\"https://github.com/user-attachments/assets/2ccdb752-22fb-41c7-8948-857fc1ad7e24\">\n <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://github.com/user-attachments/assets/774a46d5-27a0-490c-b7d0-e65fcbbfa358\">\n <img alt=\"Shows a black Browser Use Logo in light color mode and a white one in dark color mode.\" src=\"https://github.com/user-attachments/assets/2ccdb752-22fb-41c7-8948-857fc1ad7e24\" width=\"full\">\n</picture>\n\n<div align=\"center\">\n <picture>\n <source media=\"(prefers-color-scheme: light)\" srcset=\"https://github.com/user-attachments/assets/9955dda9-ede3-4971-8ee0-91cbc3850125\">\n <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://github.com/user-attachments/assets/6797d09b-8ac3-4cb9-ba07-b289e080765a\">\n <img alt=\"The AI browser agent.\" src=\"https://github.com/user-attachments/assets/9955dda9-ede3-4971-8ee0-91cbc3850125\" width=\"400\">\n </picture>\n</div>\n\n<div align=\"center\">\n<a href=\"https://cloud.browser-use.com?utm_source=github&utm_medium=readme-badge-downloads\"><img src=\"https://media.browser-use.tools/badges/package\" height=\"48\" alt=\"Browser-Use Package Download Statistics\"></a>\n</div>\n\n---\n\n<div align=\"center\">\n<a href=\"#what-can-browser-use-do\"><img src=\"https://media.browser-use.tools/badges/demos\" alt=\"Demos\"></a>\n<img width=\"16\" height=\"1\" alt=\"\">\n<a href=\"https://docs.browser-use.com\"><img src=\"https://media.browser-use.tools/badges/docs\" alt=\"Docs\"></a>\n<img width=\"16\" height=\"1\" alt=\"\">\n<a href=\"https://browser-use.com/posts\"><img src=\"https://media.browser-use.tools/badges/blog\" alt=\"Blog\"></a>\n<img width=\"16\" height=\"1\" alt=\"\">\n<a href=\"https://browsermerch.com\"><img src=\"https://media.browser-use.tools/badges/merch\" alt=\"Merch\"></a>\n<img width=\"100\" height=\"1\" alt=\"\">\n<a href=\"https://github.com/browser-use/browser-use\"><img src=\"https://media.browser-use.tools/badges/github\" alt=\"Github Stars\"></a>\n<img width=\"4\" height=\"1\" alt=\"\">\n<a href=\"https://x.com/intent/user?screen_name=browser_use\"><img src=\"https://media.browser-use.tools/badges/twitter\" alt=\"Twitter\"></a>\n<img width=\"4\" height=\"1\" alt=\"\">\n<a href=\"https://link.browser-use.com/discord\"><img src=\"https://media.browser-use.tools/badges/discord\" alt=\"Discord\"></a>\n<img width=\"4\" height=\"1\" alt=\"\">\n<a href=\"https://cloud.browser-use.com",
1680
+ "relevantPaths": [
1681
+ ".github/workflows/build-base-image.yml.disabled",
1682
+ ".github/workflows/claude.yml",
1683
+ ".github/workflows/cloud_evals.yml",
1684
+ ".github/workflows/docker.yml",
1685
+ ".github/workflows/eval-on-pr.yml",
1686
+ ".github/workflows/install-script.yml",
1687
+ ".github/workflows/lint.yml",
1688
+ ".github/workflows/package.yaml",
1689
+ ".github/workflows/publish.yml",
1690
+ ".github/workflows/stale-bot.yml",
1691
+ ".github/workflows/test.yaml",
1692
+ "Dockerfile",
1693
+ "LICENSE",
1694
+ "bin/test.sh",
1695
+ "browser_use/README.md",
1696
+ "browser_use/__init__.py",
1697
+ "browser_use/actor/README.md",
1698
+ "browser_use/actor/__init__.py",
1699
+ "browser_use/actor/element.py",
1700
+ "browser_use/actor/mouse.py",
1701
+ "browser_use/actor/page.py",
1702
+ "browser_use/actor/playground/flights.py",
1703
+ "browser_use/actor/playground/mixed_automation.py",
1704
+ "browser_use/actor/playground/playground.py",
1705
+ "browser_use/actor/utils.py",
1706
+ "browser_use/agent/__init__.py",
1707
+ "browser_use/agent/cloud_events.py",
1708
+ "browser_use/agent/gif.py",
1709
+ "browser_use/agent/judge.py",
1710
+ "browser_use/agent/message_manager/service.py"
1711
+ ],
1712
+ "codeSamples": [
1713
+ {
1714
+ "path": "browser_use/__init__.py",
1715
+ "url": "https://github.com/browser-use/browser-use/blob/main/browser_use/__init__.py",
1716
+ "excerpt": "import os\nfrom typing import TYPE_CHECKING\n\nfrom browser_use.logging_config import setup_logging\n\n# Only set up logging if not in MCP mode or if explicitly requested\nif os.environ.get('BROWSER_USE_SETUP_LOGGING', 'true').lower() != 'false':\n\tfrom browser_use.config import CONFIG\n\n\t# Get log file paths from config/environment\n\tdebug_log_file = getattr(CONFIG, 'BROWSER_USE_DEBUG_LOG_FILE', None)\n\tinfo_log_file = getattr(CONFIG, 'BROWSER_USE_INFO_LOG_FILE', None)\n\n\t# Set up logging with file handlers if specified\n\tlogger = setup_logging(debug_log_file=debug_log_file, info_log_file=info_log_file)\nelse:\n\timport logging\n\n\tlogger = logging.getLogger('browser_use')\n\n# Monkeypatch BaseSubprocessTransport.__del__ to handle closed event loops gracefully\nfrom asyncio import base_subprocess\n\n_original_del = base_subprocess.BaseSubprocessTransport.__del__\n\n\ndef _patched_del(self):\n\t\"\"\"Patched __del__ that handles closed event loops without throwing noisy red-herring errors like RuntimeError: Event loop is closed\"\"\"\n\ttry:\n\t\t# Check if the event loop is closed before calling the original\n\t\tif hasattr(self, '_loop') and self._loop and self._loop.is_closed():\n\t\t\t# Event loop is closed, skip cleanup that requires the loop\n\t\t\treturn\n\t\t_original_del(self)\n\texcept RuntimeError as e:\n\t\tif 'Event loop is closed' in str(e):\n\t\t\t# Silently ignore this specific error\n\t\t\tpass\n\t\telse:\n\t\t\traise\n\n\nbase_subprocess.BaseSubprocessTransport.__del__ = _patched_del\n\n\n# Type stubs for lazy imports - fixes linter warnings\nif TYPE_CHECKING:\n\tfrom browser_use.agent.prompts import SystemPrompt\n\tfrom browser_use.agen"
1717
+ },
1718
+ {
1719
+ "path": "browser_use/actor/__init__.py",
1720
+ "url": "https://github.com/browser-use/browser-use/blob/main/browser_use/actor/__init__.py",
1721
+ "excerpt": "\"\"\"CDP-Use High-Level Library\n\nA Playwright-like library built on top of CDP (Chrome DevTools Protocol).\n\"\"\"\n\nfrom .element import Element\nfrom .mouse import Mouse\nfrom .page import Page\nfrom .utils import Utils\n\n__all__ = ['Page', 'Element', 'Mouse', 'Utils']\n"
1722
+ }
1723
+ ]
1724
+ },
1725
+ {
1726
+ "fullName": "browserbase/stagehand",
1727
+ "url": "https://github.com/browserbase/stagehand",
1728
+ "categories": [
1729
+ "browser automation"
1730
+ ],
1731
+ "description": "The SDK For Browser Agents",
1732
+ "language": "TypeScript",
1733
+ "license": "MIT",
1734
+ "stars": 23931,
1735
+ "forks": 1646,
1736
+ "updatedAt": "2026-08-14T00:01:52Z",
1737
+ "pushedAt": "2026-08-14T00:30:17Z",
1738
+ "archived": false,
1739
+ "defaultBranch": "main",
1740
+ "readmeExcerpt": "<div id=\"toc\" align=\"center\" style=\"margin-bottom: 0;\">\n <ul style=\"list-style: none; margin: 0; padding: 0;\">\n <a href=\"https://stagehand.dev\">\n <picture>\n <source media=\"(prefers-color-scheme: dark)\" srcset=\"media/dark_logo.png\" />\n <img alt=\"Stagehand\" src=\"media/light_logo.png\" width=\"200\" style=\"margin-right: 30px;\" />\n </picture>\n </a>\n </ul>\n</div>\n<p align=\"center\">\n <strong>Stagehand is the SDK for browser agents.</strong><br>\n <a href=\"https://docs.stagehand.dev\">Read the Docs</a>\n</p>\n\n<p align=\"center\">\n <a href=\"https://github.com/browserbase/stagehand/tree/main?tab=MIT-1-ov-file#MIT-1-ov-file\">\n <picture>\n <source media=\"(prefers-color-scheme: dark)\" srcset=\"media/dark_license.svg\" />\n <img alt=\"MIT License\" src=\"media/light_license.svg\" />\n </picture>\n </a>\n <a href=\"https://discord.gg/stagehand\">\n <picture>\n <source media=\"(prefers-color-scheme: dark)\" srcset=\"media/dark_discord.svg\" />\n <img alt=\"Discord Community\" src=\"media/light_discord.svg\" />\n </picture>\n </a>\n</p>\n\n<p align=\"center\">\n\t<a href=\"https://trendshift.io/repositories/12122\" target=\"_blank\"><img src=\"https://trendshift.io/api/badge/repositories/12122\" alt=\"browserbase%2Fstagehand | Trendshift\" style=\"width: 250px; height: 55px;\" width=\"250\" height=\"55\"/></a>\n</p>\n\n<p align=\"center\">\n <a href=\"https://deepwiki.com/browserbase/stagehand\">\n <img alt=\"Ask DeepWiki\" src=\"https://deepwiki.com/badge.svg\" />\n </a>\n</p>\n\n## What is Stagehand?\n\nStagehand is the SDK for browser agents. Playwright was built for testing, Stagehand is built for agents. Use familiar APIs, self-healing actions, and network-level security across TypeScript, Python, and Go.\n\n## Why Stagehand?\n\nStagehand gives browser agents an interface built for how they actually work. It combines familiar Playwright-style APIs with self-healing actions, agent-optimized page context, and native support for complex DOM structures like out-of-process iframes and closed Shadow DOMs.\n\nAgents use fewer tokens, recover when websites change, and complete tasks more reliably. With a complete browser driver across TypeScript, Python, and Go, Stagehand delivers the flexibility of AI without sacrificing the speed, control, determinism, reliability, and observability required in production.\n\n### 1. Familiar APIs\n\nThe Playwright-style methods you and your agents al",
1741
+ "relevantPaths": [
1742
+ ".github/workflows/ci.yml",
1743
+ ".github/workflows/preview.yml",
1744
+ ".github/workflows/publish-python.yml",
1745
+ ".github/workflows/release.yml",
1746
+ "LICENSE",
1747
+ "package.json",
1748
+ "packages/docs/images/mcp/browserbase-mcp.png",
1749
+ "packages/docs/media/create-browser-app.gif",
1750
+ "packages/docs/package.json",
1751
+ "packages/docs/tests/sdk-reference.test.ts",
1752
+ "packages/docs/v2/configuration/browser.mdx",
1753
+ "packages/docs/v3/configuration/browser.mdx",
1754
+ "packages/docs/v4/configuration/browser.mdx",
1755
+ "packages/evals/browserbaseCleanup.ts",
1756
+ "packages/evals/core/targets/browserbase.ts",
1757
+ "packages/evals/framework/benchRunner.ts",
1758
+ "packages/evals/framework/claudeCodeRunner.ts",
1759
+ "packages/evals/framework/codexRunner.ts",
1760
+ "packages/evals/framework/runner.ts",
1761
+ "packages/evals/package.json",
1762
+ "packages/evals/scripts/test-evals.ts",
1763
+ "packages/evals/tests/cli.test.ts",
1764
+ "packages/evals/tests/core/browserbase-target.test.ts",
1765
+ "packages/evals/tests/core/fixtures.test.ts",
1766
+ "packages/evals/tests/core/mcp-utils.test.ts",
1767
+ "packages/evals/tests/core/task-portability.test.ts",
1768
+ "packages/evals/tests/core/tool-contract.test.ts",
1769
+ "packages/evals/tests/core/tool-registry.test.ts",
1770
+ "packages/evals/tests/framework/activeRunCleanup.test.ts",
1771
+ "packages/evals/tests/framework/agentModelModes.test.ts"
1772
+ ],
1773
+ "codeSamples": [
1774
+ {
1775
+ "path": "packages/docs/tests/sdk-reference.test.ts",
1776
+ "url": "https://github.com/browserbase/stagehand/blob/main/packages/docs/tests/sdk-reference.test.ts",
1777
+ "excerpt": "import { readdir, readFile } from \"node:fs/promises\";\nimport { extname, relative, resolve, sep } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport python from \"@ast-grep/lang-python\";\nimport { Lang, parse, registerDynamicLanguage, type SgNode } from \"@ast-grep/napi\";\nimport { createProcessor } from \"@mdx-js/mdx\";\nimport { describe, expect, it } from \"vitest\";\n\nregisterDynamicLanguage({ python });\n\ntype Language = \"Go\" | \"Python\" | \"TypeScript\";\n\ntype MdxAttribute = {\n name?: string;\n type?: string;\n value?: unknown;\n};\n\ntype MdxNode = {\n attributes?: MdxAttribute[];\n children?: MdxNode[];\n depth?: number;\n name?: string;\n type?: string;\n value?: string;\n};\n\ntype ReferencePage = {\n classSlug: string;\n filePath: string;\n views: ReferenceTab[];\n};\n\ntype ReferenceTab = {\n methods: ReferenceMethod[];\n title?: string;\n};\n\ntype ReferenceMethod = {\n methodName: string;\n methodSlug: string;\n paramFields: DocumentedField[];\n paramPaths: Array<string | undefined>;\n responseFields: DocumentedField[];\n responseNames: Array<string | undefined>;\n};\n\ntype DocumentedField = {\n key?: string;\n optional: boolean;\n type?: string;\n};\n\ntype ProjectedField = {\n key: string;\n optional: boolean;\n schema: JsonSchema;\n};\n\ntype SchemaField = {\n path: string[];\n required: boolean;\n schema: JsonSchema;\n};\n\ntype SdkMethod = {\n classSlug: string;\n localInputFields: PublicInputField[];\n methodName: string;\n methodSlug: string;\n operationName?: string;\n parameters: string[];\n parameterTypes: Record<string, string>;\n returnType?: string;\n};\n\ntype PublicInp"
1778
+ },
1779
+ {
1780
+ "path": "packages/evals/browserbaseCleanup.ts",
1781
+ "url": "https://github.com/browserbase/stagehand/blob/main/packages/evals/browserbaseCleanup.ts",
1782
+ "excerpt": "import type { V3 } from \"stagehand-v3\";\n\nconst CLOSE_TIMEOUT_MS = 5_000;\n\nasync function settleWithTimeout(promise: Promise<unknown>, timeoutMs: number): Promise<void> {\n let timeoutId: NodeJS.Timeout | undefined;\n const timeout = new Promise<void>((resolve) => {\n timeoutId = setTimeout(resolve, timeoutMs);\n });\n try {\n await Promise.race([promise.catch(() => {}), timeout]);\n } finally {\n if (timeoutId) clearTimeout(timeoutId);\n }\n}\n\nexport async function endBrowserbaseSession(v3?: V3 | null): Promise<void> {\n if (!v3?.isBrowserbase) return;\n if ((process.env.USE_API ?? \"\").toLowerCase() === \"true\") return;\n\n try {\n await settleWithTimeout(v3.context.conn.send(\"Browser.close\"), CLOSE_TIMEOUT_MS);\n } catch {\n // best-effort cleanup\n }\n}\n"
1783
+ }
1784
+ ]
1785
+ },
1786
+ {
1787
+ "fullName": "apify/crawlee",
1788
+ "url": "https://github.com/apify/crawlee",
1789
+ "categories": [
1790
+ "web scraping crawler"
1791
+ ],
1792
+ "description": "Crawlee—A web scraping and browser automation library for Node.js to build reliable crawlers. In JavaScript and TypeScript. Extract data for AI, LLMs, RAG, or GPTs. Download HTML, PDF, JPG, PNG, and other files from websites. Works with Puppeteer, Playwright, Cheerio, JSDOM, and raw HTTP. Both headful and headless mode. With proxy rotation.",
1793
+ "language": "TypeScript",
1794
+ "license": "Apache-2.0",
1795
+ "stars": 25378,
1796
+ "forks": 1620,
1797
+ "updatedAt": "2026-08-14T00:35:10Z",
1798
+ "pushedAt": "2026-08-13T09:45:16Z",
1799
+ "archived": false,
1800
+ "defaultBranch": "master",
1801
+ "readmeExcerpt": "<h1 align=\"center\">\n <a href=\"https://crawlee.dev\">\n <picture>\n <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://raw.githubusercontent.com/apify/crawlee/master/website/static/img/crawlee-dark.svg?sanitize=true\">\n <img alt=\"Crawlee\" src=\"https://raw.githubusercontent.com/apify/crawlee/master/website/static/img/crawlee-light.svg?sanitize=true\" width=\"500\">\n </picture>\n </a>\n <br>\n <small>A web scraping and browser automation library</small>\n</h1>\n\n<p align=center>\n <a href=\"https://trendshift.io/repositories/5179\" target=\"_blank\"><img src=\"https://trendshift.io/api/badge/repositories/5179\" alt=\"apify%2Fcrawlee | Trendshift\" style=\"width: 250px; height: 55px;\" width=\"250\" height=\"55\"/></a>\n</p>\n\n<p align=center>\n <a href=\"https://www.npmjs.com/package/@crawlee/core\" rel=\"nofollow\"><img src=\"https://img.shields.io/npm/v/@crawlee/core.svg\" alt=\"NPM latest version\" data-canonical-src=\"https://img.shields.io/npm/v/@crawlee/core/next.svg\" style=\"max-width: 100%;\"></a>\n <a href=\"https://www.npmjs.com/package/@crawlee/core\" rel=\"nofollow\"><img src=\"https://img.shields.io/npm/dm/@crawlee/core.svg\" alt=\"Downloads\" data-canonical-src=\"https://img.shields.io/npm/dm/@crawlee/core.svg\" style=\"max-width: 100%;\"></a>\n <a href=\"https://discord.gg/jyEM2PRvMU\" rel=\"nofollow\"><img src=\"https://img.shields.io/discord/801163717915574323?label=discord\" alt=\"Chat on discord\" data-canonical-src=\"https://img.shields.io/discord/801163717915574323?label=discord\" style=\"max-width: 100%;\"></a>\n <a href=\"https://github.com/apify/crawlee/actions/workflows/test-ci.yml\"><img src=\"https://github.com/apify/crawlee/actions/workflows/test-ci.yml/badge.svg?branch=master\" alt=\"Build Status\" style=\"max-width: 100%;\"></a>\n</p>\n\nCrawlee covers your crawling and scraping end-to-end and **helps you build reliable scrapers. Fast.**\n\nYour crawlers will appear human-like and fly under the radar of modern bot protections even with the default configuration. Crawlee gives you the tools to crawl the web for links, scrape data, and store it to disk or cloud while staying configurable to suit your project's needs.\n\nCrawlee is available as the [`crawlee`](https://www.npmjs.com/package/crawlee) NPM package.\n\n> 👉 **View full documentation, guides and examples on the [Crawlee project website](https://crawlee.dev)** 👈\n\n> Do you prefer 🐍 Python ",
1802
+ "relevantPaths": [
1803
+ ".github/workflows/check-pr-title.yml",
1804
+ ".github/workflows/deploy-nginx.yml",
1805
+ ".github/workflows/docs.yml",
1806
+ ".github/workflows/publish-to-npm.yml",
1807
+ ".github/workflows/release.yml",
1808
+ ".github/workflows/test-ci.yml",
1809
+ ".github/workflows/test-e2e.yml",
1810
+ ".github/workflows/update_new_issue.yml",
1811
+ "LICENSE.md",
1812
+ "RELEASE.md",
1813
+ "docs/deployment/aws-browsers.md",
1814
+ "docs/deployment/gcp-browsers.md",
1815
+ "docs/examples/basic_crawler.mdx",
1816
+ "docs/examples/basic_crawler.ts",
1817
+ "docs/examples/cheerio_crawler.mdx",
1818
+ "docs/examples/cheerio_crawler.ts",
1819
+ "docs/examples/crawler-plugins/index.mdx",
1820
+ "docs/examples/crawler-plugins/playwright-extra.ts",
1821
+ "docs/examples/crawler-plugins/puppeteer-extra.ts",
1822
+ "docs/examples/http_crawler.mdx",
1823
+ "docs/examples/http_crawler.ts",
1824
+ "docs/examples/jsdom_crawler.mdx",
1825
+ "docs/examples/jsdom_crawler.ts",
1826
+ "docs/examples/jsdom_crawler_react.ts",
1827
+ "docs/examples/playwright_crawler.mdx",
1828
+ "docs/examples/playwright_crawler.ts",
1829
+ "docs/examples/playwright_crawler_firefox.mdx",
1830
+ "docs/examples/playwright_crawler_firefox.ts",
1831
+ "docs/examples/puppeteer_crawler.mdx",
1832
+ "docs/examples/puppeteer_crawler.ts"
1833
+ ],
1834
+ "codeSamples": [
1835
+ {
1836
+ "path": "docs/examples/basic_crawler.ts",
1837
+ "url": "https://github.com/apify/crawlee/blob/master/docs/examples/basic_crawler.ts",
1838
+ "excerpt": "import { BasicCrawler } from 'crawlee';\n\n// Create a BasicCrawler - the simplest crawler that enables\n// users to implement the crawling logic themselves.\nconst crawler = new BasicCrawler({\n // This function will be called for each URL to crawl.\n async requestHandler({ pushData, request, sendRequest, log }) {\n const { url } = request;\n log.info(`Processing ${url}...`);\n\n // Fetch the page HTML via the crawlee sendRequest utility method\n // By default, the method will use the current request that is being handled, so you don't have to\n // provide it yourself. You can also provide a custom request if you want.\n const { body } = await sendRequest();\n\n // Store the HTML and URL to the default dataset.\n await pushData({\n url,\n html: body,\n });\n },\n});\n\n// The initial list of URLs to crawl. Here we use just a few hard-coded URLs.\nawait crawler.addRequests([\n 'https://www.google.com',\n 'https://www.example.com',\n 'https://www.bing.com',\n 'https://www.wikipedia.com',\n]);\n\n// Run the crawler and wait for it to finish.\nawait crawler.run();\n\nconsole.log('Crawler finished.');\n"
1839
+ },
1840
+ {
1841
+ "path": "docs/examples/cheerio_crawler.ts",
1842
+ "url": "https://github.com/apify/crawlee/blob/master/docs/examples/cheerio_crawler.ts",
1843
+ "excerpt": "import { CheerioCrawler, log, LogLevel } from 'crawlee';\n\n// Crawlers come with various utilities, e.g. for logging.\n// Here we use debug level of logging to improve the debugging experience.\n// This functionality is optional!\nlog.setLevel(LogLevel.DEBUG);\n\n// Create an instance of the CheerioCrawler class - a crawler\n// that automatically loads the URLs and parses their HTML using the cheerio library.\nconst crawler = new CheerioCrawler({\n // The crawler downloads and processes the web pages in parallel, with a concurrency\n // automatically managed based on the available system memory and CPU (see AutoscaledPool class).\n // Here we define some hard limits for the concurrency.\n minConcurrency: 10,\n maxConcurrency: 50,\n\n // On error, retry each page at most once.\n maxRequestRetries: 1,\n\n // Increase the timeout for processing of each page.\n requestHandlerTimeoutSecs: 30,\n\n // Limit to 10 requests per one crawl\n maxRequestsPerCrawl: 10,\n\n // This function will be called for each URL to crawl.\n // It accepts a single parameter, which is an object with options as:\n // https://crawlee.dev/js/api/cheerio-crawler/interface/CheerioCrawlerOptions#requestHandler\n // We use for demonstration only 2 of them:\n // - request: an instance of the Request class with information such as the URL that is being crawled and HTTP method\n // - $: the cheerio object containing parsed HTML\n async requestHandler({ pushData, request, $ }) {\n log.debug(`Processing ${request.url}...`);\n\n // Extract data from the page using cheerio.\n "
1844
+ }
1845
+ ]
1846
+ },
1847
+ {
1848
+ "fullName": "temporalio/sdk-typescript",
1849
+ "url": "https://github.com/temporalio/sdk-typescript",
1850
+ "categories": [
1851
+ "workflow engine ci cd"
1852
+ ],
1853
+ "description": "Temporal TypeScript SDK",
1854
+ "language": "TypeScript",
1855
+ "license": "MIT",
1856
+ "stars": 894,
1857
+ "forks": 210,
1858
+ "updatedAt": "2026-08-13T20:42:50Z",
1859
+ "pushedAt": "2026-08-13T21:19:15Z",
1860
+ "archived": false,
1861
+ "defaultBranch": "main",
1862
+ "readmeExcerpt": "<p align=\"center\">\n <img src=\"https://assets.temporal.io/w/ts.png\" alt=\"Temporal TypeScript SDK\" />\n</p>\n\n![Node 20 | 22 | 24](https://img.shields.io/badge/node-20%20|%2022%20|%2024-blue.svg?style=for-the-badge)\n[![MIT](https://img.shields.io/github/license/temporalio/sdk-typescript.svg?style=for-the-badge)](LICENSE)\n[![NPM](https://img.shields.io/npm/v/@temporalio/client?style=for-the-badge)](https://www.npmjs.com/search?q=author%3Atemporal-sdk-team)\n\n[Temporal](https://temporal.io/) is a distributed, scalable, durable, and highly available orchestration engine used to\nexecute asynchronous, long-running business logic in a scalable and resilient way.\n\n**Temporal TypeScript SDK** is the framework for authoring workflows and activities using either the TypeScript or JavaScript programming languages.\n\nFor documentation and samples, see:\n\n- [TypeScript Development Guide](https://docs.temporal.io/develop/typescript)\n- [TypeScript Samples](https://github.com/temporalio/samples-typescript)\n- [TypeScript API Reference](https://typescript.temporal.io/)\n- [General Temporal Documentation](https://docs.temporal.io)\n\n## Quick Start\n\n### Installation\n\nTo add Temporal TypeScript SDK packages to an existing JavaScript project, run:\n\n_(for client-level features, e.g. starting or interracting with Workflows)_\n\n```sh\n# Or `pnpm add` or `yarn add`\nnpm install --save \\\n @temporalio/client \\\n @temporalio/common\n```\n\n_(for worker-level features, including running Workflows, Activities and Nexus Operations)_\n\n```sh\n# Or `pnpm add` or `yarn add`\nnpm install --save \\\n @temporalio/worker \\\n @temporalio/workflow \\\n @temporalio/activity \\\n @temporalio/common\n```\n\nAll `@temporalio/*` packages in a project must have the same version number.\nThis requirement is generally enforced by peer dependencies of the Temporal packages,\nbut it may sometime require extra cares in complex monorepos.\n\n## Requirements\n\n> [!NOTE]\n> The following requirements apply to the current git branch, and not necessarily what's released on NPM.\n\n### Node.js\n\nThe Temporal TypeScript SDK is officially supported on Node 20, 22, and 24.\n\nIn line with [Node.js' release policy](https://nodejs.org/en/about/previous-releases#nodejs-releases),\nwe recommend that production applications only use Node's Active LTS or Maintenance LTS releases.\n\n### Other JavaScript runtime environments\n\nThe `@temporalio/clien",
1863
+ "relevantPaths": [
1864
+ ".github/workflows/changelog.yml",
1865
+ ".github/workflows/ci.yml",
1866
+ ".github/workflows/conventions.yml",
1867
+ ".github/workflows/docs.yml",
1868
+ ".github/workflows/nightly.yml",
1869
+ ".github/workflows/release.yml",
1870
+ ".github/workflows/stress.yml",
1871
+ "LICENSE",
1872
+ "contrib/ai-sdk/package.json",
1873
+ "contrib/ai-sdk/scripts/run-tests.ts",
1874
+ "contrib/ai-sdk/src/__tests__/activities/ai-sdk.ts",
1875
+ "contrib/ai-sdk/src/__tests__/test-ai-sdk-streaming.ts",
1876
+ "contrib/ai-sdk/src/__tests__/test-ai-sdk.ts",
1877
+ "contrib/ai-sdk/src/__tests__/workflows/ai-sdk.ts",
1878
+ "contrib/ai-sdk/src/__tests__/workflows/otel-interceptors.ts",
1879
+ "contrib/ai-sdk/src/plugin.ts",
1880
+ "contrib/ai-sdk/src/workflow.ts",
1881
+ "contrib/external-storage-gcs-google-sdk/README.md",
1882
+ "contrib/external-storage-gcs-google-sdk/package.json",
1883
+ "contrib/external-storage-gcs-google-sdk/src/__tests__/test-google-cloud-client.ts",
1884
+ "contrib/external-storage-gcs-google-sdk/src/google-cloud-client.ts",
1885
+ "contrib/external-storage-gcs-google-sdk/src/index.ts",
1886
+ "contrib/external-storage-gcs-google-sdk/tsconfig.json",
1887
+ "contrib/external-storage-gcs/README.md",
1888
+ "contrib/external-storage-gcs/package.json",
1889
+ "contrib/external-storage-gcs/src/__tests__/test-driver.ts",
1890
+ "contrib/external-storage-gcs/src/client.ts",
1891
+ "contrib/external-storage-gcs/src/driver.ts",
1892
+ "contrib/external-storage-gcs/src/index.ts",
1893
+ "contrib/external-storage-gcs/tsconfig.json"
1894
+ ],
1895
+ "codeSamples": [
1896
+ {
1897
+ "path": "contrib/ai-sdk/scripts/run-tests.ts",
1898
+ "url": "https://github.com/temporalio/sdk-typescript/blob/main/contrib/ai-sdk/scripts/run-tests.ts",
1899
+ "excerpt": "// The AI SDK v7 packages require Node >= 22 (and unflagged require(esm), added in\n// 22.12.0), but the workspace-wide CI test run also executes on older Node versions.\n// Skip instead of failing there.\nimport { spawnSync } from 'node:child_process';\n\nconst [major, minor] = process.versions.node.split('.').map(Number);\nif (major < 22 || (major === 22 && minor < 12)) {\n console.log(`Skipping @temporalio/ai-sdk tests: requires Node >= 22.12.0, running on ${process.versions.node}`);\n process.exit(0);\n}\n\nconst { status } = spawnSync('tsx', ['../../scripts/ava-ci.ts', './lib/__tests__/test-*.js'], {\n stdio: 'inherit',\n shell: process.platform === 'win32',\n});\nprocess.exit(status ?? 1);\n"
1900
+ },
1901
+ {
1902
+ "path": "contrib/ai-sdk/src/__tests__/activities/ai-sdk.ts",
1903
+ "url": "https://github.com/temporalio/sdk-typescript/blob/main/contrib/ai-sdk/src/__tests__/activities/ai-sdk.ts",
1904
+ "excerpt": "export async function getWeather(input: {\n location: string;\n}): Promise<{ city: string; temperatureRange: string; conditions: string }> {\n console.log('Activity execution');\n return {\n city: input.location,\n temperatureRange: '14-20C',\n conditions: 'Sunny with wind.',\n };\n}\n"
1905
+ }
1906
+ ]
1907
+ },
1908
+ {
1909
+ "fullName": "minio/minio",
1910
+ "url": "https://github.com/minio/minio",
1911
+ "categories": [
1912
+ "s3 compatible storage"
1913
+ ],
1914
+ "description": "MinIO is a high-performance, S3 compatible object store, open sourced under GNU AGPLv3 license.",
1915
+ "language": "Go",
1916
+ "license": "AGPL-3.0",
1917
+ "stars": 61393,
1918
+ "forks": 7758,
1919
+ "updatedAt": "2026-08-13T16:30:07Z",
1920
+ "pushedAt": "2026-04-24T17:54:39Z",
1921
+ "archived": true,
1922
+ "defaultBranch": "master",
1923
+ "readmeExcerpt": "> [!NOTE]\n> **THIS REPOSITORY IS NO LONGER MAINTAINED.**\n>\n> **Alternatives:**\n> - **[AIStor Free](https://min.io/download)** — Full-featured, standalone edition for community use (free license)\n> - **[AIStor Enterprise](https://min.io/pricing)** — Distributed edition with commercial support\n\n---\n\n# MinIO Quickstart Guide\n\n[![Slack](https://slack.min.io/slack?type=svg)](https://slack.min.io) [![Docker Pulls](https://img.shields.io/docker/pulls/minio/minio.svg?maxAge=604800)](https://hub.docker.com/r/minio/minio/) [![license](https://img.shields.io/badge/license-AGPL%20V3-blue)](https://github.com/minio/minio/blob/master/LICENSE)\n\n[![MinIO](https://raw.githubusercontent.com/minio/minio/master/.github/logo.svg?sanitize=true)](https://min.io)\n\nMinIO is a high-performance, S3-compatible object storage solution released under the GNU AGPL v3.0 license.\nDesigned for speed and scalability, it powers AI/ML, analytics, and data-intensive workloads with industry-leading performance.\n\n- S3 API Compatible – Seamless integration with existing S3 tools\n- Built for AI & Analytics – Optimized for large-scale data pipelines\n- High Performance – Ideal for demanding storage workloads.\n\nThis README provides instructions for building MinIO from source and deploying onto baremetal hardware.\nUse the [MinIO Documentation](https://github.com/minio/docs) project to build and host a local copy of the documentation.\n\n## MinIO is Open Source Software\n\nWe designed MinIO as Open Source software for the Open Source software community. We encourage the community to remix, redesign, and reshare MinIO under the terms of the AGPLv3 license.\n\nAll usage of MinIO in your application stack requires validation against AGPLv3 obligations, which include but are not limited to the release of modified code to the community from which you have benefited. Any commercial/proprietary usage of the AGPLv3 software, including repackaging or reselling services/features, is done at your own risk.\n\nThe AGPLv3 provides no obligation by any party to support, maintain, or warranty the original or any modified work.\nAll support is provided on a best-effort basis through Github and our [Slack](https://slack.min.io) channel, and any member of the community is welcome to contribute and assist others in their usage of the software.\n\nMinIO [AIStor](https://www.min.io/product/aistor) includes enterprise-grade support and ",
1924
+ "relevantPaths": [
1925
+ ".github/workflows/depsreview.yaml",
1926
+ ".github/workflows/go-cross.yml",
1927
+ ".github/workflows/go-healing.yml",
1928
+ ".github/workflows/go-lint.yml",
1929
+ ".github/workflows/go-resiliency.yml",
1930
+ ".github/workflows/go.yml",
1931
+ ".github/workflows/helm-lint.yml",
1932
+ ".github/workflows/iam-integrations.yaml",
1933
+ ".github/workflows/issues.yaml",
1934
+ ".github/workflows/lock.yml",
1935
+ ".github/workflows/mint.yml",
1936
+ ".github/workflows/mint/minio-compress-encrypt.yaml",
1937
+ ".github/workflows/mint/minio-erasure.yaml",
1938
+ ".github/workflows/mint/minio-pools.yaml",
1939
+ ".github/workflows/mint/minio-resiliency.yaml",
1940
+ ".github/workflows/mint/nginx-1-node.conf",
1941
+ ".github/workflows/mint/nginx-4-node.conf",
1942
+ ".github/workflows/mint/nginx-8-node.conf",
1943
+ ".github/workflows/mint/nginx.conf",
1944
+ ".github/workflows/multipart/docker-compose-site1.yaml",
1945
+ ".github/workflows/multipart/docker-compose-site2.yaml",
1946
+ ".github/workflows/multipart/migrate.sh",
1947
+ ".github/workflows/multipart/nginx-site1.conf",
1948
+ ".github/workflows/multipart/nginx-site2.conf",
1949
+ ".github/workflows/replication.yaml",
1950
+ ".github/workflows/root-disable.yml",
1951
+ ".github/workflows/root.cert",
1952
+ ".github/workflows/root.key",
1953
+ ".github/workflows/run-mint.sh",
1954
+ ".github/workflows/shfmt.yml"
1955
+ ],
1956
+ "codeSamples": []
1957
+ },
1958
+ {
1959
+ "fullName": "microsoft/playwright",
1960
+ "url": "https://github.com/microsoft/playwright",
1961
+ "categories": [
1962
+ "browser automation"
1963
+ ],
1964
+ "description": "Playwright is a framework for Web Testing and Automation. It allows testing Chromium, Firefox and WebKit with a single API. ",
1965
+ "language": "TypeScript",
1966
+ "license": "Apache-2.0",
1967
+ "stars": 94485,
1968
+ "forks": 6282,
1969
+ "updatedAt": "2026-08-13T22:57:56Z",
1970
+ "pushedAt": "2026-08-13T22:03:51Z",
1971
+ "archived": false,
1972
+ "defaultBranch": "main",
1973
+ "readmeExcerpt": "# 🎭 Playwright\n\n[![npm version](https://img.shields.io/npm/v/playwright.svg)](https://www.npmjs.com/package/playwright) <!-- GEN:chromium-version-badge -->[![Chromium version](https://img.shields.io/badge/chromium-152.0.7977.8-blue.svg?logo=google-chrome)](https://www.chromium.org/Home)<!-- GEN:stop --> <!-- GEN:firefox-version-badge -->[![Firefox version](https://img.shields.io/badge/firefox-153.0-blue.svg?logo=firefoxbrowser)](https://www.mozilla.org/en-US/firefox/new/)<!-- GEN:stop --> <!-- GEN:webkit-version-badge -->[![WebKit version](https://img.shields.io/badge/webkit-26.5-blue.svg?logo=safari)](https://webkit.org/)<!-- GEN:stop --> [![Join Discord](https://img.shields.io/badge/join-discord-informational)](https://aka.ms/playwright/discord)\n\n## [Documentation](https://playwright.dev) | [API reference](https://playwright.dev/docs/api/class-playwright)\n\nPlaywright is a framework for web automation and testing. It drives Chromium, Firefox, and WebKit with a single API — in your tests, in your scripts, and as a tool for AI agents.\n\n## Get Started\n\nChoose the path that fits your workflow:\n\n| | Best for | Install |\n|---|---|---|\n| **[Playwright Test](#playwright-test)** | End-to-end testing | `npm init playwright@latest` |\n| **[Playwright CLI](#playwright-cli)** | Coding agents (Claude Code, Copilot) | `npm i -g @playwright/cli@latest` |\n| **[Playwright MCP](#playwright-mcp)** | AI agents and LLM-driven automation | `npx @playwright/mcp@latest` |\n| **[Playwright Library](#playwright-library)** | Browser automation scripts | `npm i playwright` |\n| **[VS Code Extension](#vs-code-extension)** | Test authoring and debugging in VS Code | [Install from Marketplace](https://marketplace.visualstudio.com/items?itemName=ms-playwright.playwright) |\n\n---\n\n## Playwright Test\n\nPlaywright Test is a full-featured test runner built for end-to-end testing. It runs tests across Chromium, Firefox, and WebKit with full browser isolation, auto-waiting, and web-first assertions.\n\n### Install\n\n```bash\nnpm init playwright@latest\n```\n\nOr add manually:\n\n```bash\nnpm i -D @playwright/test\nnpx playwright install\n```\n\n### Write a test\n\n```TypeScript\nimport { test, expect } from '@playwright/test';\n\ntest('has title', async ({ page }) => {\n await page.goto('https://playwright.dev/');\n await expect(page).toHaveTitle(/Playwright/);\n});\n\ntest('get started link', async ({ page }) => {\n awa",
1974
+ "relevantPaths": [
1975
+ ".claude/skills/playwright-test-results/SKILL.md",
1976
+ ".github/actions/download-artifact/action.yml",
1977
+ ".github/actions/run-test/action.yml",
1978
+ ".github/workflows/bot-voice.md",
1979
+ ".github/workflows/copilot-setup-steps.yml",
1980
+ ".github/workflows/create_test_report.yml",
1981
+ ".github/workflows/fix-flakes-prompt.md",
1982
+ ".github/workflows/fix-flakes.yml",
1983
+ ".github/workflows/infra.yml",
1984
+ ".github/workflows/merge.config.ts",
1985
+ ".github/workflows/pr-ci-triage.md",
1986
+ ".github/workflows/pr-ci-triage.yml",
1987
+ ".github/workflows/publish_extension.yml",
1988
+ ".github/workflows/publish_release.yml",
1989
+ ".github/workflows/roll_nodejs.yml",
1990
+ ".github/workflows/roll_stable_test_runner.yml",
1991
+ ".github/workflows/tests_bidi.yml",
1992
+ ".github/workflows/tests_docker.yml",
1993
+ ".github/workflows/tests_docker_changes.yml",
1994
+ ".github/workflows/tests_docker_release.yml",
1995
+ ".github/workflows/tests_extension.yml",
1996
+ ".github/workflows/tests_mcp.yml",
1997
+ ".github/workflows/tests_primary.yml",
1998
+ ".github/workflows/tests_secondary.yml",
1999
+ ".github/workflows/tests_webview_simulator.yml",
2000
+ ".github/workflows/triage.yml",
2001
+ ".github/workflows/update_test_results_db.yml",
2002
+ "LICENSE",
2003
+ "browser_patches/firefox/.gitignore",
2004
+ "browser_patches/firefox/UPSTREAM_CONFIG.sh"
2005
+ ],
2006
+ "codeSamples": [
2007
+ {
2008
+ "path": ".github/workflows/merge.config.ts",
2009
+ "url": "https://github.com/microsoft/playwright/blob/main/.github/workflows/merge.config.ts",
2010
+ "excerpt": "export default {\n testDir: '../../tests',\n reporter: [[require.resolve('../../tests/config/markdownReporter')], ['html']],\n};\n"
2011
+ }
2012
+ ]
2013
+ },
2014
+ {
2015
+ "fullName": "scrapy/scrapy",
2016
+ "url": "https://github.com/scrapy/scrapy",
2017
+ "categories": [
2018
+ "web scraping crawler"
2019
+ ],
2020
+ "description": "Scrapy, a fast high-level web crawling & scraping framework for Python.",
2021
+ "language": "Python",
2022
+ "license": "BSD-3-Clause",
2023
+ "stars": 63841,
2024
+ "forks": 11894,
2025
+ "updatedAt": "2026-08-14T00:02:02Z",
2026
+ "pushedAt": "2026-08-13T09:42:38Z",
2027
+ "archived": false,
2028
+ "defaultBranch": "master",
2029
+ "readmeExcerpt": "|logo|\n\n.. |logo| image:: https://raw.githubusercontent.com/scrapy/scrapy/master/docs/_static/logo.svg\n :target: https://scrapy.org\n :alt: Scrapy\n :width: 480px\n\n|version| |python_version| |tests| |coverage| |conda| |deepwiki|\n\n.. |version| image:: https://img.shields.io/pypi/v/Scrapy.svg\n :target: https://pypi.org/pypi/Scrapy\n :alt: PyPI Version\n\n.. |python_version| image:: https://img.shields.io/pypi/pyversions/Scrapy.svg\n :target: https://pypi.org/pypi/Scrapy\n :alt: Supported Python Versions\n\n.. |tests| image:: https://img.shields.io/github/check-runs/scrapy/scrapy/master?label=tests\n :target: https://github.com/scrapy/scrapy/actions?query=branch%3Amaster\n :alt: Tests\n\n.. |coverage| image:: https://img.shields.io/codecov/c/github/scrapy/scrapy/master.svg\n :target: https://codecov.io/github/scrapy/scrapy?branch=master\n :alt: Coverage report\n\n.. |conda| image:: https://anaconda.org/conda-forge/scrapy/badges/version.svg\n :target: https://anaconda.org/conda-forge/scrapy\n :alt: Conda Version\n\n.. |deepwiki| image:: https://deepwiki.com/badge.svg\n :target: https://deepwiki.com/scrapy/scrapy\n :alt: Ask DeepWiki\n\nScrapy_ is a web scraping framework to extract structured data from websites.\nIt is cross-platform, and requires Python 3.10+. It is maintained by Zyte_\n(formerly Scrapinghub) and `many other contributors`_.\n\n.. _many other contributors: https://github.com/scrapy/scrapy/graphs/contributors\n.. _Scrapy: https://scrapy.org/\n.. _Zyte: https://www.zyte.com/\n\nInstall with:\n\n.. code:: bash\n\n pip install scrapy\n\nAnd follow the documentation_ to learn how to use it.\n\n.. _documentation: https://docs.scrapy.org/en/latest/\n\nIf you wish to contribute, see Contributing_.\n\n.. _Contributing: https://docs.scrapy.org/en/master/contributing.html\n",
2030
+ "relevantPaths": [
2031
+ ".github/workflows/checks.yml",
2032
+ ".github/workflows/codspeed.yml",
2033
+ ".github/workflows/flag-prs-for-triage.yml",
2034
+ ".github/workflows/publish.yml",
2035
+ ".github/workflows/tests-macos.yml",
2036
+ ".github/workflows/tests-ubuntu.yml",
2037
+ ".github/workflows/tests-vcs-deps.yml",
2038
+ ".github/workflows/tests-windows.yml",
2039
+ "LICENSE",
2040
+ "conftest.py",
2041
+ "docs/_ext/scrapydocs.py",
2042
+ "docs/_ext/scrapyfixautodoc.py",
2043
+ "docs/_tests/quotes.html",
2044
+ "docs/_tests/quotes1.html",
2045
+ "docs/conftest.py",
2046
+ "docs/topics/_images/scrapy_architecture.odg",
2047
+ "docs/topics/_images/scrapy_architecture.png",
2048
+ "docs/topics/_images/scrapy_architecture_02.png",
2049
+ "docs/topics/scrapyd.rst",
2050
+ "extras/scrapy.1",
2051
+ "extras/scrapy_bash_completion",
2052
+ "extras/scrapy_zsh_completion",
2053
+ "pyproject.toml",
2054
+ "scrapy/VERSION",
2055
+ "scrapy/__init__.py",
2056
+ "scrapy/__main__.py",
2057
+ "scrapy/addons.py",
2058
+ "scrapy/cmdline.py",
2059
+ "scrapy/commands/__init__.py",
2060
+ "scrapy/commands/bench.py"
2061
+ ],
2062
+ "codeSamples": [
2063
+ {
2064
+ "path": "conftest.py",
2065
+ "url": "https://github.com/scrapy/scrapy/blob/master/conftest.py",
2066
+ "excerpt": "from __future__ import annotations\n\nimport os\nfrom importlib.util import find_spec\nfrom pathlib import Path\nfrom typing import TYPE_CHECKING\n\nimport pytest\nfrom twisted.web.http import H2_ENABLED\n\nfrom scrapy.utils.reactor import set_asyncio_event_loop_policy\nfrom scrapy.utils.reactorless import install_reactor_import_hook\nfrom tests.keys import generate_keys\nfrom tests.mockserver.http import MockServer\nfrom tests.mockserver.mitm_proxy import MitmProxy, mitmdump_cmd\n\nif TYPE_CHECKING:\n from collections.abc import Generator\n\n\ndef _py_files(folder):\n return (str(p) for p in Path(folder).rglob(\"*.py\"))\n\n\ncollect_ignore = [\n # may need extra deps\n \"docs/_ext\",\n # contains scripts to be run by tests/test_crawler_subprocess.py::AsyncCrawlerProcessSubprocess\n *_py_files(\"tests/AsyncCrawlerProcess\"),\n # contains scripts to be run by tests/test_crawler_subprocess.py::AsyncCrawlerRunnerSubprocess\n *_py_files(\"tests/AsyncCrawlerRunner\"),\n # contains scripts to be run by tests/test_crawler_subprocess.py::CrawlerProcessSubprocess\n *_py_files(\"tests/CrawlerProcess\"),\n # contains scripts to be run by tests/test_crawler_subprocess.py::CrawlerRunnerSubprocess\n *_py_files(\"tests/CrawlerRunner\"),\n]\n\nbase_dir = Path(__file__).parent\nignore_file_path = base_dir / \"tests\" / \"ignores.txt\"\nwith ignore_file_path.open(encoding=\"utf-8\") as reader:\n for line in reader:\n file_path = line.strip()\n if file_path and file_path[0] != \"#\":\n collect_ignore.append(file_path)\n\nif not H2_ENABLED:\n collect_ignore.extend(\n (\n \"scr"
2067
+ },
2068
+ {
2069
+ "path": "docs/_ext/scrapydocs.py",
2070
+ "url": "https://github.com/scrapy/scrapy/blob/master/docs/_ext/scrapydocs.py",
2071
+ "excerpt": "# pylint: disable=import-error\nfrom collections.abc import Sequence\nfrom operator import itemgetter\nfrom typing import Any, TypedDict\n\nfrom docutils import nodes\nfrom docutils.nodes import Element, General, Node, document\nfrom docutils.parsers.rst import Directive\nfrom sphinx.application import Sphinx\nfrom sphinx.util.nodes import make_refnode\n\n\nclass SettingData(TypedDict):\n docname: str\n setting_name: str\n refid: str\n\n\nclass SettingslistNode(General, Element):\n pass\n\n\nclass SettingsListDirective(Directive):\n def run(self) -> Sequence[Node]:\n return [SettingslistNode()]\n\n\ndef is_setting_index(node: Node) -> bool:\n if node.tagname == \"index\" and node[\"entries\"]: # type: ignore[index,attr-defined]\n # index entries for setting directives look like:\n # [('pair', 'SETTING_NAME; setting', 'std:setting-SETTING_NAME', '')]\n entry_type, info, _ = node[\"entries\"][0][:3] # type: ignore[index]\n return entry_type == \"pair\" and info.endswith(\"; setting\")\n return False\n\n\ndef get_setting_name_and_refid(node: Node) -> tuple[str, str]:\n \"\"\"Extract setting name from directive index node\"\"\"\n _, info, refid = node[\"entries\"][0][:3] # type: ignore[index]\n return info.replace(\"; setting\", \"\"), refid\n\n\ndef collect_scrapy_settings_refs(app: Sphinx, doctree: document) -> None:\n env = app.builder.env\n\n if not hasattr(env, \"scrapy_all_settings\"):\n emptyList: list[SettingData] = []\n env.scrapy_all_settings = emptyList # type: ignore[attr-defined]\n\n for node in doctree.findall(is_setting_index):\n setting_"
2072
+ }
2073
+ ]
2074
+ },
2075
+ {
2076
+ "fullName": "puppeteer/puppeteer",
2077
+ "url": "https://github.com/puppeteer/puppeteer",
2078
+ "categories": [
2079
+ "browser automation"
2080
+ ],
2081
+ "description": "JavaScript API for Chrome and Firefox",
2082
+ "language": "TypeScript",
2083
+ "license": "Apache-2.0",
2084
+ "stars": 95460,
2085
+ "forks": 9563,
2086
+ "updatedAt": "2026-08-14T00:36:36Z",
2087
+ "pushedAt": "2026-08-13T19:02:54Z",
2088
+ "archived": false,
2089
+ "defaultBranch": "main",
2090
+ "readmeExcerpt": "# Puppeteer\n\n[![build](https://github.com/puppeteer/puppeteer/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/puppeteer/puppeteer/actions/workflows/ci.yml)\n[![npm puppeteer package](https://img.shields.io/npm/v/puppeteer.svg)](https://npmjs.org/package/puppeteer)\n\n<img src=\"https://user-images.githubusercontent.com/10379601/29446482-04f7036a-841f-11e7-9872-91d1fc2ea683.png\" height=\"200\" align=\"right\"/>\n\n> Puppeteer is a JavaScript library which provides a high-level API to control\n> Chrome or Firefox over the\n> [DevTools Protocol](https://chromedevtools.github.io/devtools-protocol/) or [WebDriver BiDi](https://pptr.dev/webdriver-bidi).\n> Puppeteer runs in the headless (no visible UI) by default\n\n## [Get started](https://pptr.dev/docs) | [API](https://pptr.dev/api) | [FAQ](https://pptr.dev/faq) | [Contributing](https://pptr.dev/contributing) | [Troubleshooting](https://pptr.dev/troubleshooting)\n\n## Installation\n\n```bash npm2yarn\nnpm i puppeteer # Downloads compatible Chrome during installation.\nnpm i puppeteer-core # Alternatively, install as a library, without downloading Chrome.\n```\n\n:::note\n\nModern package managers (including npm (see the [RFC](https://github.com/npm/rfcs/pull/868)), pnpm, Yarn, Bun, and Deno) block dependency install scripts by default. If the install script is blocked, Puppeteer will not download the browser during installation, leading to runtime errors.\n\nYou can manually download the required browsers after installation by running:\n\n```bash npm2yarn\nnpx puppeteer browsers install\n```\n\nAlternatively, you can configure your package manager to allow the install script to run (for example, with npm, by adding `\"puppeteer\"` to `\"allowScripts\"` in your `package.json`).\n\n:::\n\n## MCP\n\nInstall [`chrome-devtools-mcp`](https://github.com/ChromeDevTools/chrome-devtools-mcp),\na Puppeteer-based MCP server for browser automation and debugging.\n\nPuppeteer also supports the experimental [WebMCP](https://pptr.dev/guides/webmcp) API.\n\n## Example\n\n```ts\nimport puppeteer from 'puppeteer';\n// Or import puppeteer from 'puppeteer-core';\n\n// Launch the browser and open a new blank page.\nconst browser = await puppeteer.launch();\nconst page = await browser.newPage();\n\n// Navigate the page to a URL.\nawait page.goto('https://developer.chrome.com/');\n\n// Set the screen size.\nawait page.setViewport({width: 1080, height: 1024});\n\n// Open the searc",
2091
+ "relevantPaths": [
2092
+ ".github/ISSUE_TEMPLATE/03-issue-browsers.yml",
2093
+ ".github/release-please.yml",
2094
+ ".github/workflows/bisect.yml",
2095
+ ".github/workflows/changed-packages.yml",
2096
+ ".github/workflows/ci.yml",
2097
+ ".github/workflows/convetional-commit.yml",
2098
+ ".github/workflows/daily.yml",
2099
+ ".github/workflows/deflake.yml",
2100
+ ".github/workflows/devtools.yml",
2101
+ ".github/workflows/pre-release.yml",
2102
+ ".github/workflows/publish.yml",
2103
+ ".github/workflows/release-please.yml",
2104
+ ".github/workflows/scorecards-analysis.yml",
2105
+ ".github/workflows/stale.yml",
2106
+ ".github/workflows/update-browser-pins.yml",
2107
+ ".release-please-manifest.json",
2108
+ "LICENSE",
2109
+ "docker/Dockerfile",
2110
+ "docker/test/smoke-test.js",
2111
+ "docs/api/puppeteer.browser._asyncdisposesymbol_.md",
2112
+ "docs/api/puppeteer.browser._disposesymbol_.md",
2113
+ "docs/api/puppeteer.browser.addscreen.md",
2114
+ "docs/api/puppeteer.browser.browsercontexts.md",
2115
+ "docs/api/puppeteer.browser.close.md",
2116
+ "docs/api/puppeteer.browser.cookies.md",
2117
+ "docs/api/puppeteer.browser.createbrowsercontext.md",
2118
+ "docs/api/puppeteer.browser.defaultbrowsercontext.md",
2119
+ "docs/api/puppeteer.browser.deletecookie.md",
2120
+ "docs/api/puppeteer.browser.deletematchingcookies.md",
2121
+ "docs/api/puppeteer.browser.disconnect.md"
2122
+ ],
2123
+ "codeSamples": [
2124
+ {
2125
+ "path": "docker/test/smoke-test.js",
2126
+ "url": "https://github.com/puppeteer/puppeteer/blob/main/docker/test/smoke-test.js",
2127
+ "excerpt": "/**\n * @license\n * Copyright 2024 Google Inc.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport puppeteer from 'puppeteer';\n\nconst browser = await puppeteer.launch({\n dumpio: true,\n});\nconst page = await browser.newPage();\nawait page.goto('https://example.com');\nawait page.screenshot({\n path: 'test.png',\n});\nawait browser.close();\nconsole.log('done');\n"
2128
+ }
2129
+ ]
2130
+ },
2131
+ {
2132
+ "fullName": "n8n-io/n8n",
2133
+ "url": "https://github.com/n8n-io/n8n",
2134
+ "categories": [
2135
+ "workflow engine ci cd"
2136
+ ],
2137
+ "description": "Fair-code workflow automation platform with native AI capabilities. Combine visual building with custom code, self-host or cloud, 400+ integrations.",
2138
+ "language": "TypeScript",
2139
+ "license": "NOASSERTION",
2140
+ "stars": 200533,
2141
+ "forks": 60120,
2142
+ "updatedAt": "2026-08-14T00:36:37Z",
2143
+ "pushedAt": "2026-08-14T00:36:28Z",
2144
+ "archived": false,
2145
+ "defaultBranch": "master",
2146
+ "readmeExcerpt": "![Banner image](https://user-images.githubusercontent.com/10284570/173569848-c624317f-42b1-45a6-ab09-f0ea3c247648.png)\n\n# n8n – The Platform for AI Agents and Workflow Automation\n\nFair-code platform to build and deploy AI agents and workflows. Combine a visual canvas with custom code, run it self-hosted or in the [cloud](https://app.n8n.cloud/login), and connect to 1500+ integrations. AI automation you can trust with real work, from prototype to production.\n\n![n8n.io - Screenshot](https://raw.githubusercontent.com/n8n-io/n8n/master/assets/n8n-screenshot-readme.png)\n\n## Key Capabilities\n\n- **AI-Native Automation Platform**: Build and operationalize AI workflows and multi-step agents using your own data, models, and tools\n- **Model Flexibility, No Lock-In**: Connect to OpenAI, Anthropic, Google, or open-source models and switch providers without changing your architecture\n- **From Prototype to Production**: Design multi-step AI workflows with logic, tool use, human approvals, and full observability\n- **Code When You Need It**: Combine visual building with JavaScript, Python, and npm packages for advanced AI workflows\n- **Enterprise-Ready AI**: Self-host or deploy securely with role-based access, audit trails, and support for sensitive data\n- **Leverage What Already Exists**: 1500+ integrations and 9,000+ workflow [templates](https://n8n.io/workflows) to connect AI with your existing systems\n\n## Quick Start\n\nTry n8n instantly with [npx](https://docs.n8n.io/hosting/installation/npm/) (requires [Node.js](https://nodejs.org/en/)):\n\n```\nnpx n8n\n```\n\nOr deploy with [Docker](https://docs.n8n.io/hosting/installation/docker/):\n\n```\ndocker volume create n8n_data\ndocker run -it --rm --name n8n -p 5678:5678 -v n8n_data:/home/node/.n8n docker.n8n.io/n8nio/n8n\n```\n\nAccess the editor at http://localhost:5678\n\n## Resources\n\n- 📚 [Documentation](https://docs.n8n.io)\n- 🔧 [1500+ Integrations](https://n8n.io/integrations)\n- 💡 [Example Workflows](https://n8n.io/workflows)\n- 🤖 [AI & LangChain Guide](https://docs.n8n.io/advanced-ai/)\n- 👥 [Community Forum](https://community.n8n.io)\n- 📖 [Community Tutorials](https://community.n8n.io/c/tutorials/28)\n\n## Support\n\nNeed help? Our community forum is the place to get support and connect with other users:\n[community.n8n.io](https://community.n8n.io)\n\n## License\n\nn8n is [fair-code](https://faircode.io) distributed under the [Sustainable ",
2147
+ "relevantPaths": [],
2148
+ "codeSamples": []
2149
+ },
2150
+ {
2151
+ "fullName": "dagster-io/dagster",
2152
+ "url": "https://github.com/dagster-io/dagster",
2153
+ "categories": [
2154
+ "workflow engine ci cd"
2155
+ ],
2156
+ "description": "An orchestration platform for the development, production, and observation of data assets.",
2157
+ "language": "Python",
2158
+ "license": "Apache-2.0",
2159
+ "stars": 15991,
2160
+ "forks": 2237,
2161
+ "updatedAt": "2026-08-13T22:44:14Z",
2162
+ "pushedAt": "2026-08-13T22:44:06Z",
2163
+ "archived": false,
2164
+ "defaultBranch": "master",
2165
+ "readmeExcerpt": "<div align=\"center\">\n <!-- Note: Do not try adding the dark mode version here with the `picture` element, it will break formatting in PyPI -->\n <a target=\"_blank\" href=\"https://dagster.io\" style=\"background:none\">\n <img alt=\"dagster logo\" src=\"https://raw.githubusercontent.com/dagster-io/dagster/master/.github/dagster-logo-light.svg\" width=\"auto\" height=\"100%\">\n </a>\n <a target=\"_blank\" href=\"https://github.com/dagster-io/dagster\" style=\"background:none\">\n <img src=\"https://img.shields.io/github/stars/dagster-io/dagster?labelColor=4F43DD&color=163B36&logo=github\">\n </a>\n <a target=\"_blank\" href=\"https://github.com/dagster-io/dagster/blob/master/LICENSE\" style=\"background:none\">\n <img src=\"https://img.shields.io/badge/License-Apache_2.0-blue.svg?label=license&labelColor=4F43DD&color=163B36\">\n </a>\n <a target=\"_blank\" href=\"https://pypi.org/project/dagster/\" style=\"background:none\">\n <img src=\"https://img.shields.io/pypi/v/dagster?labelColor=4F43DD&color=163B36\">\n </a>\n <a target=\"_blank\" href=\"https://pypi.org/project/dagster/\" style=\"background:none\">\n <img src=\"https://img.shields.io/pypi/pyversions/dagster?labelColor=4F43DD&color=163B36\">\n </a>\n <a target=\"_blank\" href=\"https://twitter.com/dagster\" style=\"background:none\">\n <img src=\"https://img.shields.io/badge/twitter-dagster-blue.svg?labelColor=4F43DD&color=163B36&logo=twitter\" />\n </a>\n <a target=\"_blank\" href=\"https://dagster.io/slack\" style=\"background:none\">\n <img src=\"https://img.shields.io/badge/slack-dagster-blue.svg?labelColor=4F43DD&color=163B36&logo=slack\" />\n </a>\n <a target=\"_blank\" href=\"https://linkedin.com/showcase/dagster\" style=\"background:none\">\n <img src=\"https://img.shields.io/badge/linkedin-dagster-blue.svg?labelColor=4F43DD&color=163B36&logo=linkedin\" />\n </a>\n</div>\n\n**Dagster is a cloud-native data pipeline orchestrator for the whole development lifecycle, with integrated lineage and observability, a declarative programming model, and best-in-class testability.**\n\nIt is designed for **developing and maintaining data assets**, such as tables, data sets, machine learning models, and reports.\n\nWith Dagster, you declare—as Python functions—the data assets that you want to build. Dagster then helps you run your functions at the right time and keep your assets up-to-date.\n\nHere is an example of a graph of three assets defined in Python:\n\n```pyth",
2166
+ "relevantPaths": [
2167
+ ".buildkite/buildkite-shared/buildkite_shared/test_utils.py",
2168
+ ".buildkite/buildkite-shared/buildkite_shared_tests/__init__.py",
2169
+ ".buildkite/buildkite-shared/buildkite_shared_tests/test_slug.py",
2170
+ ".buildkite/buildkite-shared/buildkite_shared_tests/test_utils.py",
2171
+ ".buildkite/buildkite-shared/pyproject.toml",
2172
+ ".buildkite/dagster-buildkite/dagster_buildkite/pipelines/prerelease_package.py",
2173
+ ".buildkite/dagster-buildkite/dagster_buildkite/steps/test_project.py",
2174
+ ".buildkite/dagster-buildkite/dagster_buildkite_tests/__init__.py",
2175
+ ".buildkite/dagster-buildkite/dagster_buildkite_tests/helpers.py",
2176
+ ".buildkite/dagster-buildkite/dagster_buildkite_tests/test_pipelines/__init__.py",
2177
+ ".buildkite/dagster-buildkite/dagster_buildkite_tests/test_pipelines/test_dagster.py",
2178
+ ".buildkite/dagster-buildkite/dagster_buildkite_tests/test_pipelines/test_prerelease_package.py",
2179
+ ".buildkite/dagster-buildkite/pyproject.toml",
2180
+ ".claude/dev_workflow.md",
2181
+ ".claude/ui_workflow.md",
2182
+ ".github/workflows/automate-stale-issues.yml",
2183
+ ".github/workflows/build-docs.yml",
2184
+ ".github/workflows/check-docs.yml",
2185
+ ".github/workflows/copybara-sync-gate.yml",
2186
+ ".github/workflows/update-dagster-ui-yarn-lock.yml",
2187
+ ".tmp/broken_api_tests_log.txt",
2188
+ "LICENSE",
2189
+ "conftest.py",
2190
+ "docs/.yarn/releases/yarn-4.14.1.cjs",
2191
+ "docs/docs/about/releases.md",
2192
+ "docs/docs/deployment/dagster-plus/deploying-code/branch-deployments/testing-against-prod-data.md",
2193
+ "docs/docs/deployment/execution/customizing-run-queue-priority.md",
2194
+ "docs/docs/deployment/troubleshooting/github-ci-cd-self-hosted-ubuntu-20-04-runners.md",
2195
+ "docs/docs/examples/full-pipelines/dbt/dbt-tests.md",
2196
+ "docs/docs/guides/automate/schedules/testing-schedules.md"
2197
+ ],
2198
+ "codeSamples": [
2199
+ {
2200
+ "path": ".buildkite/buildkite-shared/buildkite_shared/test_utils.py",
2201
+ "url": "https://github.com/dagster-io/dagster/blob/master/.buildkite/buildkite-shared/buildkite_shared/test_utils.py",
2202
+ "excerpt": "from collections.abc import Sequence\nfrom typing import Any\n\nfrom buildkite_shared.step_builders.step_builder import StepConfiguration, is_group_step\nfrom dagster_shared.yaml_utils import safe_load_yaml\n\n\ndef _step_skip(step: StepConfiguration) -> str | None:\n if is_group_step(step):\n return step.get(\"skip\") or step[\"steps\"][0].get(\"skip\")\n return step.get(\"skip\")\n\n\ndef _find_step(steps: Sequence[StepConfiguration], name: str) -> StepConfiguration | None:\n \"\"\"Find a step by name, searching top-level steps and group sub-steps.\"\"\"\n all_steps = list(steps)\n for step in steps:\n if is_group_step(step):\n all_steps.extend(step[\"steps\"])\n\n # Prefer exact key match\n for step in all_steps:\n if step.get(\"key\") == name:\n return step\n # Suffix match on group or label\n for step in all_steps:\n label = step.get(\"group\") or step.get(\"label\") or \"\"\n if label.endswith(f\" {name}\"):\n return step\n # Substring match — require surrounding spaces or start/end of string\n for step in all_steps:\n label = step.get(\"group\") or step.get(\"label\") or \"\"\n if f\" {name} \" in f\" {label} \":\n return step\n return None\n\n\ndef get_step_skip(steps: Sequence[StepConfiguration], name: str) -> str | None:\n \"\"\"Return the skip value for a step in the pipeline.\n\n Searches top-level steps and group sub-steps. Matches on `key` first\n (exact), then falls back to matching the `group` or `label` as a distinct\n suffix after a space, then a word-boundary substring check.\n \"\"\"\n step = _"
2203
+ },
2204
+ {
2205
+ "path": ".buildkite/buildkite-shared/buildkite_shared_tests/__init__.py",
2206
+ "url": "https://github.com/dagster-io/dagster/blob/master/.buildkite/buildkite-shared/buildkite_shared_tests/__init__.py",
2207
+ "excerpt": "# This test package exists so that buildkite-shared is discoverable as a Python package\n# for change detection purposes (discovery requires a tox.ini). The contents of\n# buildkite-shared are tested via the pipeline tests in dagster-buildkite and\n# dagster-internal-buildkite.\n"
2208
+ }
2209
+ ]
2210
+ },
2211
+ {
2212
+ "fullName": "prefecthq/prefect",
2213
+ "url": "https://github.com/prefecthq/prefect",
2214
+ "categories": [
2215
+ "workflow engine ci cd"
2216
+ ],
2217
+ "description": "Prefect is a workflow orchestration framework for building resilient data pipelines in Python.",
2218
+ "language": "Python",
2219
+ "license": "Apache-2.0",
2220
+ "stars": 23618,
2221
+ "forks": 2461,
2222
+ "updatedAt": "2026-08-13T22:28:58Z",
2223
+ "pushedAt": "2026-08-13T23:07:00Z",
2224
+ "archived": false,
2225
+ "defaultBranch": "main",
2226
+ "readmeExcerpt": "<p align=\"center\"><img src=\"https://github.com/PrefectHQ/prefect/assets/3407835/c654cbc6-63e8-4ada-a92a-efd2f8f24b85\" width=1000></p>\n\n<p align=\"center\">\n <a href=\"https://pypi.org/project/prefect/\" alt=\"PyPI version\">\n <img alt=\"PyPI\" src=\"https://img.shields.io/pypi/v/prefect?color=0052FF&labelColor=090422\" />\n </a>\n <a href=\"https://pypi.org/project/prefect/\" alt=\"PyPI downloads/month\">\n <img alt=\"Downloads\" src=\"https://img.shields.io/pypi/dm/prefect?color=0052FF&labelColor=090422\" />\n </a>\n <a href=\"https://github.com/prefecthq/prefect/\" alt=\"Stars\">\n <img src=\"https://img.shields.io/github/stars/prefecthq/prefect?color=0052FF&labelColor=090422\" />\n </a>\n <a href=\"https://github.com/prefecthq/prefect/pulse\" alt=\"Activity\">\n <img src=\"https://img.shields.io/github/commit-activity/m/prefecthq/prefect?color=0052FF&labelColor=090422\" />\n </a>\n <br>\n <a href=\"https://prefect.io/slack\" alt=\"Slack\">\n <img src=\"https://img.shields.io/badge/slack-join_community-red.svg?color=0052FF&labelColor=090422&logo=slack\" />\n </a>\n <a href=\"https://www.youtube.com/c/PrefectIO/\" alt=\"YouTube\">\n <img src=\"https://img.shields.io/badge/youtube-watch_videos-red.svg?color=0052FF&labelColor=090422&logo=youtube\" />\n </a>\n</p>\n\n\n<p align=\"center\">\n <a href=\"https://docs.prefect.io/v3/get-started/index?utm_source=oss&utm_medium=oss&utm_campaign=oss_gh_repo&utm_term=none&utm_content=none\">\n Installation\n </a>\n ·\n <a href=\"https://docs.prefect.io/v3/get-started/quickstart?utm_source=oss&utm_medium=oss&utm_campaign=oss_gh_repo&utm_term=none&utm_content=none\">\n Quickstart\n </a>\n ·\n <a href=\"https://docs.prefect.io/v3/how-to-guides/workflows/write-and-run?utm_source=oss&utm_medium=oss&utm_campaign=oss_gh_repo&utm_term=none&utm_content=none\">\n Build workflows\n </a>\n ·\n <a href=\"https://docs.prefect.io/v3/concepts/deployments?utm_source=oss&utm_medium=oss&utm_campaign=oss_gh_repo&utm_term=none&utm_content=none\">\n Deploy workflows\n </a>\n ·\n <a href=\"https://app.prefect.cloud/?utm_source=oss&utm_medium=oss&utm_campaign=oss_gh_repo&utm_term=none&utm_content=none\">\n Prefect Cloud\n </a>\n</p>\n\n# Prefect\n\nPrefect is a workflow orchestration framework for building data pipelines in Python.\nIt's the simplest way to elevate a script into a prod",
2227
+ "relevantPaths": [
2228
+ ".github/release.yml",
2229
+ ".github/workflows/agents-md-update.yml",
2230
+ ".github/workflows/api-compatibility-tests.yaml",
2231
+ ".github/workflows/benchmarks.yaml",
2232
+ ".github/workflows/claude.yml",
2233
+ ".github/workflows/codeql-analysis.yml",
2234
+ ".github/workflows/codspeed-benchmarks.yaml",
2235
+ ".github/workflows/copy-linked-issue-labels.yml",
2236
+ ".github/workflows/dbt-benchmarks.yaml",
2237
+ ".github/workflows/devin-fix-flaky-tests.yaml",
2238
+ ".github/workflows/docker-images.yaml",
2239
+ ".github/workflows/docs-broken-links.yaml",
2240
+ ".github/workflows/docs-update.yml",
2241
+ ".github/workflows/helm-chart-release.yaml",
2242
+ ".github/workflows/integration-package-release.yaml",
2243
+ ".github/workflows/integration-package-tests.yaml",
2244
+ ".github/workflows/integration-tests.yaml",
2245
+ ".github/workflows/k8s-integration-tests.yaml",
2246
+ ".github/workflows/kickoff-release.yaml",
2247
+ ".github/workflows/labeler.yml",
2248
+ ".github/workflows/markdown-tests.yaml",
2249
+ ".github/workflows/nightly-release.yaml",
2250
+ ".github/workflows/notify-on-failure.yaml",
2251
+ ".github/workflows/npm_update_latest_prefect.yaml",
2252
+ ".github/workflows/prefect-aws-docker-images.yaml",
2253
+ ".github/workflows/prefect-aws-docker-test.yaml",
2254
+ ".github/workflows/prefect-azure-docker-images.yaml",
2255
+ ".github/workflows/prefect-azure-docker-test.yaml",
2256
+ ".github/workflows/prefect-client-publish.yaml",
2257
+ ".github/workflows/prefect-client.yaml"
2258
+ ],
2259
+ "codeSamples": []
2260
+ },
2261
+ {
2262
+ "fullName": "apache/airflow",
2263
+ "url": "https://github.com/apache/airflow",
2264
+ "categories": [
2265
+ "workflow engine ci cd"
2266
+ ],
2267
+ "description": "Apache Airflow - A platform to programmatically author, schedule, and monitor workflows",
2268
+ "language": "Python",
2269
+ "license": "Apache-2.0",
2270
+ "stars": 46473,
2271
+ "forks": 17587,
2272
+ "updatedAt": "2026-08-14T00:26:21Z",
2273
+ "pushedAt": "2026-08-14T00:19:35Z",
2274
+ "archived": false,
2275
+ "defaultBranch": "main",
2276
+ "readmeExcerpt": "<!--\n Licensed to the Apache Software Foundation (ASF) under one\n or more contributor license agreements. See the NOTICE file\n distributed with this work for additional information\n regarding copyright ownership. The ASF licenses this file\n to you under the Apache License, Version 2.0 (the\n \"License\"); you may not use this file except in compliance\n with the License. You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing,\n software distributed under the License is distributed on an\n \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n KIND, either express or implied. See the License for the\n specific language governing permissions and limitations\n under the License.\n-->\n\n<!-- START Apache Airflow, please keep comment here to allow auto update of PyPI readme.md -->\n# Apache Airflow\n\n| Category | Badges |\n|------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| License | [![License](https://img.shields.io/:license-Apache%202-blue.svg)](https://www.apache.org/licenses/LICENSE-2.0.txt) ",
2277
+ "relevantPaths": [
2278
+ ".github/actions/migration_tests/action.yml",
2279
+ ".github/actions/post_tests_failure/action.yml",
2280
+ ".github/actions/post_tests_success/action.yml",
2281
+ ".github/workflows/additional-ci-image-checks.yml",
2282
+ ".github/workflows/additional-prod-image-tests.yml",
2283
+ ".github/workflows/airflow-distributions-tests.yml",
2284
+ ".github/workflows/airflow-e2e-tests.yml",
2285
+ ".github/workflows/asf-allowlist-check.yml",
2286
+ ".github/workflows/automatic-backport.yml",
2287
+ ".github/workflows/backport-cli.yml",
2288
+ ".github/workflows/basic-tests.yml",
2289
+ ".github/workflows/check-newsfragment-pr-number.yml",
2290
+ ".github/workflows/ci-amd.yml",
2291
+ ".github/workflows/ci-arm.yml",
2292
+ ".github/workflows/ci-duration-monitor.yml",
2293
+ ".github/workflows/ci-image-build.yml",
2294
+ ".github/workflows/ci-image-checks.yml",
2295
+ ".github/workflows/ci-notification.yml",
2296
+ ".github/workflows/codeql-analysis.yml",
2297
+ ".github/workflows/e2e-flaky-tests-report.yml",
2298
+ ".github/workflows/finalize-tests.yml",
2299
+ ".github/workflows/generate-constraints.yml",
2300
+ ".github/workflows/helm-tests.yml",
2301
+ ".github/workflows/integration-system-tests.yml",
2302
+ ".github/workflows/java-sdk-release-verify.yml",
2303
+ ".github/workflows/k8s-tests.yml",
2304
+ ".github/workflows/kustomize-overlays-tests.yml",
2305
+ ".github/workflows/milestone-tag-assistant.yml",
2306
+ ".github/workflows/notify-uv-lock-conflicts.yml",
2307
+ ".github/workflows/openlineage-e2e-compat-tests.yml"
2308
+ ],
2309
+ "codeSamples": []
2310
+ },
2311
+ {
2312
+ "fullName": "restic/restic",
2313
+ "url": "https://github.com/restic/restic",
2314
+ "categories": [
2315
+ "storage backup"
2316
+ ],
2317
+ "description": "Fast, secure, efficient backup program",
2318
+ "language": "Go",
2319
+ "license": "BSD-2-Clause",
2320
+ "stars": 35497,
2321
+ "forks": 1827,
2322
+ "updatedAt": "2026-08-13T23:10:52Z",
2323
+ "pushedAt": "2026-08-01T20:25:16Z",
2324
+ "archived": false,
2325
+ "defaultBranch": "master",
2326
+ "readmeExcerpt": "[![Documentation](https://readthedocs.org/projects/restic/badge/?version=latest)](https://restic.readthedocs.io/en/latest/?badge=latest)\n[![Build Status](https://github.com/restic/restic/workflows/test/badge.svg)](https://github.com/restic/restic/actions?query=workflow%3Atest)\n[![Go Report Card](https://goreportcard.com/badge/github.com/restic/restic)](https://goreportcard.com/report/github.com/restic/restic)\n\n# Introduction\n\nrestic is a backup program that is fast, efficient and secure. It supports the three major operating systems (Linux, macOS, Windows) and a few smaller ones (FreeBSD, OpenBSD).\n\nFor detailed usage and installation instructions check out the [documentation](https://restic.readthedocs.io/en/latest).\n\nYou can ask questions in our [Discourse forum](https://forum.restic.net).\n\n## Quick start\n\nOnce you've [installed](https://restic.readthedocs.io/en/latest/020_installation.html) restic, start\noff with creating a repository for your backups:\n\n $ restic init --repo /tmp/backup\n enter password for new backend:\n enter password again:\n created restic backend 085b3c76b9 at /tmp/backup\n Please note that knowledge of your password is required to access the repository.\n Losing your password means that your data is irrecoverably lost.\n\nand add some data:\n\n $ restic --repo /tmp/backup backup ~/work\n enter password for repository:\n scan [/home/user/work]\n scanned 764 directories, 1816 files in 0:00\n [0:29] 100.00% 54.732 MiB/s 1.582 GiB / 1.582 GiB 2580 / 2580 items 0 errors ETA 0:00\n duration: 0:29, 54.47MiB/s\n snapshot 40dc1520 saved\n\nNext you can either use `restic restore` to restore files or use `restic\nmount` to mount the repository via fuse and browse the files from previous\nsnapshots.\n\nFor more options check out the [online documentation](https://restic.readthedocs.io/en/latest/).\n\n# Backends\n\nSaving a backup on the same machine is nice but not a real backup strategy.\nTherefore, restic supports the following backends for storing backups natively:\n\n- [Local directory](https://restic.readthedocs.io/en/latest/030_preparing_a_new_repo.html#local)\n- [sftp server (via SSH)](https://restic.readthedocs.io/en/latest/030_preparing_a_new_repo.html#sftp)\n- [HTTP REST server](https://restic.readthedocs.io/en/latest/030_preparing_a_new_repo.html#rest-server) ([protocol](https://restic.readthedocs.io/en/latest/100_refe",
2327
+ "relevantPaths": [
2328
+ ".github/workflows/codespell.yml",
2329
+ ".github/workflows/docker.yml",
2330
+ ".github/workflows/tests.yml",
2331
+ "LICENSE",
2332
+ "changelog/unreleased/.gitignore",
2333
+ "changelog/unreleased/issue-21870",
2334
+ "changelog/unreleased/issue-21892",
2335
+ "changelog/unreleased/issue-3129",
2336
+ "changelog/unreleased/issue-3202",
2337
+ "changelog/unreleased/issue-5372",
2338
+ "changelog/unreleased/pull-21845",
2339
+ "changelog/unreleased/pull-21883",
2340
+ "changelog/unreleased/pull-21937",
2341
+ "changelog/unreleased/pull-21977",
2342
+ "cmd/restic/cmd_backup_integration_test.go",
2343
+ "cmd/restic/cmd_backup_test.go",
2344
+ "cmd/restic/cmd_cat_test.go",
2345
+ "cmd/restic/cmd_check_integration_test.go",
2346
+ "cmd/restic/cmd_check_test.go",
2347
+ "cmd/restic/cmd_copy_integration_test.go",
2348
+ "cmd/restic/cmd_diff_integration_test.go",
2349
+ "cmd/restic/cmd_dump_test.go",
2350
+ "cmd/restic/cmd_find_integration_test.go",
2351
+ "cmd/restic/cmd_forget_integration_test.go",
2352
+ "cmd/restic/cmd_forget_test.go",
2353
+ "cmd/restic/cmd_generate_integration_test.go",
2354
+ "cmd/restic/cmd_init_integration_test.go",
2355
+ "cmd/restic/cmd_key_integration_test.go",
2356
+ "cmd/restic/cmd_list_integration_test.go",
2357
+ "cmd/restic/cmd_ls_integration_test.go"
2358
+ ],
2359
+ "codeSamples": [
2360
+ {
2361
+ "path": "cmd/restic/cmd_backup_integration_test.go",
2362
+ "url": "https://github.com/restic/restic/blob/master/cmd/restic/cmd_backup_integration_test.go",
2363
+ "excerpt": "package main\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"runtime\"\n\t\"slices\"\n\t\"strings\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/restic/restic/internal/data\"\n\t\"github.com/restic/restic/internal/errors\"\n\t\"github.com/restic/restic/internal/fs\"\n\t\"github.com/restic/restic/internal/global\"\n\t\"github.com/restic/restic/internal/repository\"\n\t\"github.com/restic/restic/internal/restic\"\n\trtest \"github.com/restic/restic/internal/test\"\n\t\"github.com/restic/restic/internal/ui/backup\"\n)\n\nfunc testRunBackupAssumeFailure(t testing.TB, dir string, target []string, opts BackupOptions, gopts global.Options) error {\n\treturn withTermStatus(t, gopts, func(ctx context.Context, gopts global.Options) error {\n\t\tt.Logf(\"backing up %v in %v\", target, dir)\n\t\tif dir != \"\" {\n\t\t\tcleanup := rtest.Chdir(t, dir)\n\t\t\tdefer cleanup()\n\t\t}\n\n\t\topts.GroupBy = data.SnapshotGroupByOptions{Host: true, Path: true}\n\t\treturn runBackup(ctx, opts, gopts, gopts.Term, target)\n\t})\n}\n\nfunc testRunBackupOutput(t testing.TB, opts BackupOptions, gopts global.Options, target []string) ([]byte, error) {\n\tbuf, err := withCaptureStdout(t, gopts, func(ctx context.Context, gopts global.Options) error {\n\t\treturn runBackup(ctx, opts, gopts, gopts.Term, target)\n\t})\n\treturn buf.Bytes(), err\n}\n\nfunc testRunBackup(t testing.TB, dir string, target []string, opts BackupOptions, gopts global.Options) {\n\terr := testRunBackupAssumeFailure(t, dir, target, opts, gopts)\n\trtest.Assert(t, err == nil, \"Error while backing up: %v\", err)\n}\n\nfunc TestBackup(t *testing.T) {\n\ttestBackup(t, false)\n}\n\nfunc TestBackupWithFilesystemSnapsh"
2364
+ },
2365
+ {
2366
+ "path": "cmd/restic/cmd_backup_test.go",
2367
+ "url": "https://github.com/restic/restic/blob/master/cmd/restic/cmd_backup_test.go",
2368
+ "excerpt": "package main\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"runtime\"\n\t\"sort\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/restic/restic/internal/errors\"\n\trtest \"github.com/restic/restic/internal/test\"\n)\n\nfunc TestCollectTargets(t *testing.T) {\n\tdir := rtest.TempDir(t)\n\n\tfooSpace := \"foo \"\n\tbarStar := \"bar*\" // Must sort before the others, below.\n\tif runtime.GOOS == \"windows\" { // Doesn't allow \"*\" or trailing space.\n\t\tfooSpace = \"foo\"\n\t\tbarStar = \"bar\"\n\t}\n\n\tvar expect []string\n\tfor _, filename := range []string{\n\t\tbarStar, \"baz\", \"cmdline arg\", fooSpace,\n\t\t\"fromfile\", \"fromfile-raw\", \"fromfile-verbatim\", \"quux\",\n\t} {\n\t\t// All mentioned files must exist for collectTargets.\n\t\tf, err := os.Create(filepath.Join(dir, filename))\n\t\trtest.OK(t, err)\n\t\trtest.OK(t, f.Close())\n\n\t\texpect = append(expect, f.Name())\n\t}\n\n\tf1, err := os.Create(filepath.Join(dir, \"fromfile\"))\n\trtest.OK(t, err)\n\t// Empty lines should be ignored. A line starting with '#' is a comment.\n\t_, err = fmt.Fprintf(f1, \"\\n%s*\\n # here's a comment\\n\", f1.Name())\n\trtest.OK(t, err)\n\trtest.OK(t, f1.Close())\n\n\tf2, err := os.Create(filepath.Join(dir, \"fromfile-verbatim\"))\n\trtest.OK(t, err)\n\tfor _, filename := range []string{fooSpace, barStar} {\n\t\t// Empty lines should be ignored. CR+LF is allowed.\n\t\t_, err = fmt.Fprintf(f2, \"%s\\r\\n\\n\", filepath.Join(dir, filename))\n\t\trtest.OK(t, err)\n\t}\n\trtest.OK(t, f2.Close())\n\n\tf3, err := os.Create(filepath.Join(dir, \"fromfile-raw\"))\n\trtest.OK(t, err)\n\tfor _, filename := range []string{\"baz\", \"quux\"} {\n\t\t_, err = fmt.Fprintf(f3, \"%s\\x00\", filepath.Join(dir, filename))\n\t\trtest.OK(t"
2369
+ }
2370
+ ]
2371
+ },
2372
+ {
2373
+ "fullName": "rclone/rclone",
2374
+ "url": "https://github.com/rclone/rclone",
2375
+ "categories": [
2376
+ "storage"
2377
+ ],
2378
+ "description": "\"rsync for cloud storage\" - Google Drive, S3, Dropbox, Backblaze B2, One Drive, Swift, Hubic, Wasabi, Google Cloud Storage, Azure Blob, Azure Files, Yandex Files",
2379
+ "language": "Go",
2380
+ "license": "MIT",
2381
+ "stars": 59129,
2382
+ "forks": 5308,
2383
+ "updatedAt": "2026-08-14T00:34:43Z",
2384
+ "pushedAt": "2026-08-13T18:10:41Z",
2385
+ "archived": false,
2386
+ "defaultBranch": "master",
2387
+ "readmeExcerpt": "<!-- markdownlint-disable-next-line first-line-heading no-inline-html -->\n[<img src=\"https://rclone.org/img/logo_on_light__horizontal_color.svg\" width=\"50%\" alt=\"rclone logo\">](https://rclone.org/#gh-light-mode-only)\n<!-- markdownlint-disable-next-line no-inline-html -->\n[<img src=\"https://rclone.org/img/logo_on_dark__horizontal_color.svg\" width=\"50%\" alt=\"rclone logo\">](https://rclone.org/#gh-dark-mode-only)\n\n[Website](https://rclone.org) |\n[Documentation](https://rclone.org/docs/) |\n[Download](https://rclone.org/downloads/) |\n[Contributing](CONTRIBUTING.md) |\n[Changelog](https://rclone.org/changelog/) |\n[Installation](https://rclone.org/install/) |\n[Forum](https://forum.rclone.org/)\n\n[![Build Status](https://github.com/rclone/rclone/workflows/build/badge.svg)](https://github.com/rclone/rclone/actions?query=workflow%3Abuild)\n[![Go Report Card](https://goreportcard.com/badge/github.com/rclone/rclone)](https://goreportcard.com/report/github.com/rclone/rclone)\n[![GoDoc](https://godoc.org/github.com/rclone/rclone?status.svg)](https://godoc.org/github.com/rclone/rclone)\n[![Docker Pulls](https://img.shields.io/docker/pulls/rclone/rclone)](https://hub.docker.com/r/rclone/rclone)\n\n# Rclone\n\nRclone *(\"rsync for cloud storage\")* is a command-line program to sync files and\ndirectories to and from different cloud storage providers.\n\n## Storage providers\n\n- 1Fichier [:page_facing_up:](https://rclone.org/fichier/)\n- Akamai Netstorage [:page_facing_up:](https://rclone.org/netstorage/)\n- Alibaba Cloud (Aliyun) Object Storage System (OSS) [:page_facing_up:](https://rclone.org/s3/#alibaba-oss)\n- Amazon S3 [:page_facing_up:](https://rclone.org/s3/)\n- ArvanCloud Object Storage (AOS) [:page_facing_up:](https://rclone.org/s3/#arvan-cloud-object-storage-aos)\n- Bizfly Cloud Simple Storage [:page_facing_up:](https://rclone.org/s3/#bizflycloud)\n- Backblaze B2 [:page_facing_up:](https://rclone.org/b2/)\n- Box [:page_facing_up:](https://rclone.org/box/)\n- Ceph [:page_facing_up:](https://rclone.org/s3/#ceph)\n- China Mobile Ecloud Elastic Object Storage (EOS) [:page_facing_up:](https://rclone.org/s3/#china-mobile-ecloud-eos)\n- Citrix ShareFile [:page_facing_up:](https://rclone.org/sharefile/)\n- Cloudflare R2 [:page_facing_up:](https://rclone.org/s3/#cloudflare-r2)\n- Cloudinary [:page_facing_up:](https://rclone.org/cloudinary/)\n- Cubbit DS3 [:page_facing_up:](https://rclone.org/s3/#Cubbit",
2388
+ "relevantPaths": [
2389
+ ".github/workflows/build.yml",
2390
+ ".github/workflows/build_publish_docker_image.yml",
2391
+ ".github/workflows/build_publish_docker_plugin.yml",
2392
+ ".github/workflows/notify.yml",
2393
+ ".github/workflows/winget.yml",
2394
+ "Dockerfile",
2395
+ "RELEASE.md",
2396
+ "backend/alias/alias_internal_test.go",
2397
+ "backend/alias/test/files/four/five/underfive.txt",
2398
+ "backend/alias/test/files/four/under four.txt",
2399
+ "backend/alias/test/files/one%.txt",
2400
+ "backend/alias/test/files/three/underthree.txt",
2401
+ "backend/alias/test/files/two.html",
2402
+ "backend/archive/archive_internal_test.go",
2403
+ "backend/archive/archive_test.go",
2404
+ "backend/archive/squashfs/squashfs_test.go",
2405
+ "backend/archive/squashfs/testdata/1.sqfs",
2406
+ "backend/archive/squashfs/testdata/2.sqfs",
2407
+ "backend/archive/squashfs_malformed_test.go",
2408
+ "backend/azureblob/arrow_internal_test.go",
2409
+ "backend/azureblob/arrowlist/arrow_test.go",
2410
+ "backend/azureblob/arrowlist/arrowlist_test.go",
2411
+ "backend/azureblob/azureblob_internal_test.go",
2412
+ "backend/azureblob/azureblob_test.go",
2413
+ "backend/azurefiles/azurefiles_internal_test.go",
2414
+ "backend/azurefiles/azurefiles_test.go",
2415
+ "backend/b2/api/types_test.go",
2416
+ "backend/b2/b2_internal_test.go",
2417
+ "backend/b2/b2_test.go",
2418
+ "backend/box/box_test.go"
2419
+ ],
2420
+ "codeSamples": [
2421
+ {
2422
+ "path": "backend/alias/alias_internal_test.go",
2423
+ "url": "https://github.com/rclone/rclone/blob/master/backend/alias/alias_internal_test.go",
2424
+ "excerpt": "package alias\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"path\"\n\t\"path/filepath\"\n\t\"sort\"\n\t\"testing\"\n\n\t_ \"github.com/rclone/rclone/backend/local\" // pull in test backend\n\t\"github.com/rclone/rclone/fs\"\n\t\"github.com/rclone/rclone/fs/config\"\n\t\"github.com/rclone/rclone/fs/config/configfile\"\n\t\"github.com/stretchr/testify/require\"\n)\n\nvar (\n\tremoteName = \"TestAlias\"\n)\n\nfunc prepare(t *testing.T, root string) {\n\tconfigfile.Install()\n\n\t// Configure the remote\n\tconfig.FileSetValue(remoteName, \"type\", \"alias\")\n\tconfig.FileSetValue(remoteName, \"remote\", root)\n}\n\nfunc TestNewFS(t *testing.T) {\n\ttype testEntry struct {\n\t\tremote string\n\t\tsize int64\n\t\tisDir bool\n\t}\n\tfor testi, test := range []struct {\n\t\tremoteRoot string\n\t\tfsRoot string\n\t\tfsList string\n\t\twantOK bool\n\t\tentries []testEntry\n\t}{\n\t\t{\"\", \"\", \"\", true, []testEntry{\n\t\t\t{\"four\", -1, true},\n\t\t\t{\"one%.txt\", 6, false},\n\t\t\t{\"three\", -1, true},\n\t\t\t{\"two.html\", 7, false},\n\t\t}},\n\t\t{\"\", \"four\", \"\", true, []testEntry{\n\t\t\t{\"five\", -1, true},\n\t\t\t{\"under four.txt\", 9, false},\n\t\t}},\n\t\t{\"\", \"\", \"four\", true, []testEntry{\n\t\t\t{\"four/five\", -1, true},\n\t\t\t{\"four/under four.txt\", 9, false},\n\t\t}},\n\t\t{\"four\", \"..\", \"\", true, []testEntry{\n\t\t\t{\"five\", -1, true},\n\t\t\t{\"under four.txt\", 9, false},\n\t\t}},\n\t\t{\"\", \"../../three\", \"\", true, []testEntry{\n\t\t\t{\"underthree.txt\", 9, false},\n\t\t}},\n\t\t{\"four\", \"../../five\", \"\", true, []testEntry{\n\t\t\t{\"underfive.txt\", 6, false},\n\t\t}},\n\t} {\n\t\twhat := fmt.Sprintf(\"test %d remoteRoot=%q, fsRoot=%q, fsList=%q\", testi, test.remoteRoot, test.fsRoot, test.fsList)\n\n\t\tremoteRoot, err := filepath.Abs(filepath.FromSlash(path.Join"
2425
+ },
2426
+ {
2427
+ "path": "backend/archive/archive_internal_test.go",
2428
+ "url": "https://github.com/rclone/rclone/blob/master/backend/archive/archive_internal_test.go",
2429
+ "excerpt": "//go:build !plan9\n\npackage archive\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\t\"os/exec\"\n\t\"path\"\n\t\"path/filepath\"\n\t\"strconv\"\n\t\"strings\"\n\t\"testing\"\n\n\t_ \"github.com/rclone/rclone/backend/local\"\n\t\"github.com/rclone/rclone/fs\"\n\t\"github.com/rclone/rclone/fs/cache\"\n\t\"github.com/rclone/rclone/fs/filter\"\n\t\"github.com/rclone/rclone/fs/operations\"\n\t\"github.com/rclone/rclone/fstest\"\n\t\"github.com/rclone/rclone/fstest/fstests\"\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n)\n\n// FIXME need to test Open with seek\n\n// run - run a shell command\nfunc run(t *testing.T, args ...string) {\n\tcmd := exec.Command(args[0], args[1:]...)\n\tfs.Debugf(nil, \"run args = %v\", args)\n\tout, err := cmd.CombinedOutput()\n\tif err != nil {\n\t\tt.Fatalf(`\n----------------------------\nFailed to run %v: %v\nCommand output was:\n%s\n----------------------------\n`, args, err, out)\n\t}\n}\n\n// check the dst and src are identical\nfunc checkTree(ctx context.Context, name string, t *testing.T, dstArchive, src string, expectedCount int) {\n\tt.Run(name, func(t *testing.T) {\n\t\tfs.Debugf(nil, \"check %q vs %q\", dstArchive, src)\n\t\tFarchive, err := cache.Get(ctx, dstArchive)\n\t\tif err != fs.ErrorIsFile {\n\t\t\trequire.NoError(t, err)\n\t\t}\n\t\tFsrc, err := cache.Get(ctx, src)\n\t\tif err != fs.ErrorIsFile {\n\t\t\trequire.NoError(t, err)\n\t\t}\n\n\t\tvar matches bytes.Buffer\n\t\topt := operations.CheckOpt{\n\t\t\tFdst: Farchive,\n\t\t\tFsrc: Fsrc,\n\t\t\tMatch: &matches,\n\t\t}\n\n\t\tfor _, action := range []string{\"Check\", \"Download\"} {\n\t\t\tt.Run(action, func(t *testing.T) {\n\t\t\t\tmatches.Reset()\n\t\t\t\tif action == \"Download\" {\n\t\t\t\t\tassert.NoErr"
2430
+ }
2431
+ ]
2432
+ },
2433
+ {
2434
+ "fullName": "goreleaser/goreleaser",
2435
+ "url": "https://github.com/goreleaser/goreleaser",
2436
+ "categories": [
2437
+ "package release artifacts"
2438
+ ],
2439
+ "description": "Release engineering, simplified",
2440
+ "language": "Go",
2441
+ "license": "MIT",
2442
+ "stars": 15982,
2443
+ "forks": 1097,
2444
+ "updatedAt": "2026-08-14T00:30:19Z",
2445
+ "pushedAt": "2026-08-13T06:37:45Z",
2446
+ "archived": false,
2447
+ "defaultBranch": "main",
2448
+ "readmeExcerpt": "<p align=\"center\">\n <img alt=\"GoReleaser Logo\" src=\"https://avatars2.githubusercontent.com/u/24697112?v=3&s=200\" height=\"200\" />\n <h3 align=\"center\">GoReleaser</h3>\n <p align=\"center\">Release engineering, simplified.</p>\n <p align=\"center\">\n <img height=\"30\" src=\"https://cdn.simpleicons.org/go/555555/ffffff\" alt=\"Go\" />\n <img height=\"30\" src=\"https://cdn.simpleicons.org/rust/555555/ffffff\" alt=\"Rust\" />\n <img height=\"30\" src=\"https://cdn.simpleicons.org/zig/555555/ffffff\" alt=\"Zig\" />\n <img height=\"30\" src=\"https://cdn.simpleicons.org/typescript/555555/ffffff\" alt=\"TypeScript\" />\n <img height=\"30\" src=\"https://cdn.simpleicons.org/python/555555/ffffff\" alt=\"Python\" />\n </p>\n</p>\n\n---\n\nWe handle the complexities of releasing so you can focus in building what really\nmatters: **your software**.\n\n![](https://goreleaser.com/static/goreleaser.svg)\n\n---\n\n## Get GoReleaser\n\n- [On your machine](https://goreleaser.com/install/);\n- [On CI/CD systems](https://goreleaser.com/ci/).\n\n## Documentation\n\nDocumentation is hosted live at https://goreleaser.com\n\n## Community\n\nYou have questions, need support and or just want to talk about GoReleaser?\n\nHere are ways to get in touch with the GoReleaser community:\n\n[![Follow on 𝕏](https://img.shields.io/badge/Follow_on_𝕏-000000?style=for-the-badge&logo=x&logoColor=white)](https://twitter.com/goreleaser)\n[![Follow Telegram Channel](https://img.shields.io/badge/Follow_on_Telegram-26A5E4?style=for-the-badge&logo=telegram&logoColor=%23FFFFFF)](https://t.me/goreleasernews)\n[![GitHub Discussions](https://img.shields.io/badge/Discuss_on_GITHUB-181717?style=for-the-badge&logo=github&logoColor=white)](https://github.com/goreleaser/goreleaser/discussions)\n\nYou can find the links above and all others [here](https://goreleaser.com/links/).\n\n### Code of Conduct\n\nThis project adheres to the Contributor Covenant [code of conduct](https://github.com/goreleaser/.github/blob/main/CODE_OF_CONDUCT.md).\nBy participating, you are expected to uphold this code.\nWe appreciate your contribution.\nPlease refer to our [contributing guidelines](CONTRIBUTING.md) for further information.\n\n## Badges\n\n[![Release](https://img.shields.io/github/release/goreleaser/goreleaser.svg?style=for-the-badge)](https://github.com/goreleaser/goreleaser/releases/latest)\n[![Software License](https://img.shields.io/badge/license-MIT-brightgreen.svg?style=for-the",
2449
+ "relevantPaths": [
2450
+ ".github/workflows/build.yml",
2451
+ ".github/workflows/cleanup-nightlies.yml",
2452
+ ".github/workflows/codeql.yml",
2453
+ ".github/workflows/depsreview.yaml",
2454
+ ".github/workflows/docs.yml",
2455
+ ".github/workflows/generate.yml",
2456
+ ".github/workflows/gitleaks.yml",
2457
+ ".github/workflows/govulncheck.yml",
2458
+ ".github/workflows/grype.yml",
2459
+ ".github/workflows/lint.yml",
2460
+ ".github/workflows/milestone.yml",
2461
+ ".github/workflows/moderator.yml",
2462
+ ".github/workflows/nightly-oss.yml",
2463
+ ".github/workflows/release.yml",
2464
+ ".github/workflows/sbom-scan.yml",
2465
+ ".github/workflows/scorecard.yml",
2466
+ ".goreleaser.yaml",
2467
+ "Dockerfile",
2468
+ "LICENSE.md",
2469
+ "cmd/build_test.go",
2470
+ "cmd/check_test.go",
2471
+ "cmd/config_test.go",
2472
+ "cmd/healthcheck_test.go",
2473
+ "cmd/helper_test.go",
2474
+ "cmd/init_test.go",
2475
+ "cmd/release.go",
2476
+ "cmd/release_test.go",
2477
+ "cmd/root_test.go",
2478
+ "cmd/schema_test.go",
2479
+ "cmd/testdata/good.yml"
2480
+ ],
2481
+ "codeSamples": [
2482
+ {
2483
+ "path": "cmd/build_test.go",
2484
+ "url": "https://github.com/goreleaser/goreleaser/blob/main/cmd/build_test.go",
2485
+ "excerpt": "package cmd\n\nimport (\n\t\"path/filepath\"\n\t\"testing\"\n\n\t\"github.com/goreleaser/goreleaser/v2/internal/pipeline\"\n\t\"github.com/goreleaser/goreleaser/v2/internal/skips\"\n\t\"github.com/goreleaser/goreleaser/v2/internal/testctx\"\n\t\"github.com/goreleaser/goreleaser/v2/pkg/config\"\n\t\"github.com/goreleaser/goreleaser/v2/pkg/context\"\n\t\"github.com/stretchr/testify/require\"\n)\n\nfunc TestBuild(t *testing.T) {\n\tsetup(t)\n\tcmd := newBuildCmd()\n\tcmd.cmd.SetArgs([]string{\"--snapshot\", \"--timeout=1m\", \"--parallelism=2\", \"--deprecated\"})\n\trequire.NoError(t, cmd.cmd.Execute())\n}\n\nfunc TestBuildAutoSnapshot(t *testing.T) {\n\tt.Run(\"clean\", func(t *testing.T) {\n\t\tsetup(t)\n\t\tcmd := newBuildCmd()\n\t\tcmd.cmd.SetArgs([]string{\"--auto-snapshot\"})\n\t\trequire.NoError(t, cmd.cmd.Execute())\n\t\tmatches, err := filepath.Glob(\"./dist/fake_*/fake\")\n\t\trequire.NoError(t, err)\n\t\trequire.Len(t, matches, 1)\n\t})\n\n\tt.Run(\"dirty\", func(t *testing.T) {\n\t\tsetup(t)\n\t\tcreateFile(t, \"foo\", \"force dirty tree\")\n\t\tcmd := newBuildCmd()\n\t\tcmd.cmd.SetArgs([]string{\"--auto-snapshot\"})\n\t\trequire.NoError(t, cmd.cmd.Execute())\n\t\tmatches, err := filepath.Glob(\"./dist/fake_*/fake_snapshot\")\n\t\trequire.NoError(t, err)\n\t\trequire.Len(t, matches, 1)\n\t})\n}\n\nfunc TestBuildSingleTarget(t *testing.T) {\n\tsetup(t)\n\tcmd := newBuildCmd()\n\tcmd.cmd.SetArgs([]string{\"--snapshot\", \"--timeout=1m\", \"--parallelism=2\", \"--deprecated\", \"--single-target\"})\n\trequire.NoError(t, cmd.cmd.Execute())\n}\n\nfunc TestBuildInvalidConfig(t *testing.T) {\n\tsetup(t)\n\tcreateFile(t, \"goreleaser.yml\", \"version: 2\\nfoo: bar\")\n\tcmd := newBuildCmd()\n\tcmd.cmd.SetArgs([]string{\"--snapshot\", "
2486
+ },
2487
+ {
2488
+ "path": "cmd/check_test.go",
2489
+ "url": "https://github.com/goreleaser/goreleaser/blob/main/cmd/check_test.go",
2490
+ "excerpt": "package cmd\n\nimport (\n\t\"os\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/require\"\n)\n\nfunc TestCheckConfig(t *testing.T) {\n\tcmd := newCheckCmd()\n\tcmd.cmd.SetArgs([]string{\"-f\", \"testdata/good.yml\"})\n\trequire.NoError(t, cmd.cmd.Execute())\n}\n\nfunc TestCheckConfigNoArgs(t *testing.T) {\n\tcmd := newCheckCmd()\n\tcmd.cmd.SetArgs(nil)\n\trequire.NoError(t, cmd.cmd.Execute())\n\trequire.Equal(t, 1, cmd.checked)\n}\n\nfunc TestCheckConfigMultipleFiles(t *testing.T) {\n\tcmd := newCheckCmd()\n\tcmd.cmd.SetArgs([]string{\"testdata/good.yml\", \"testdata/invalid.yml\"})\n\trequire.Error(t, cmd.cmd.Execute())\n\trequire.Equal(t, 2, cmd.checked)\n}\n\nfunc TestCheckConfigThatDoesNotExist(t *testing.T) {\n\tcmd := newCheckCmd()\n\tcmd.cmd.SetArgs([]string{\"-f\", \"testdata/nope.yml\"})\n\trequire.ErrorIs(t, cmd.cmd.Execute(), os.ErrNotExist)\n\trequire.Equal(t, 0, cmd.checked)\n}\n\nfunc TestCheckConfigUnmarshalError(t *testing.T) {\n\tcmd := newCheckCmd()\n\tcmd.cmd.SetArgs([]string{\"-f\", \"testdata/unmarshal_error.yml\"})\n\trequire.EqualError(t, cmd.cmd.Execute(), \"yaml: unmarshal errors:\\n line 2: field foo not found in type config.Project\")\n\trequire.Equal(t, 0, cmd.checked)\n}\n\nfunc TestCheckConfigInvalid(t *testing.T) {\n\tcmd := newCheckCmd()\n\tcmd.cmd.SetArgs([]string{\"-f\", \"testdata/invalid.yml\"})\n\trequire.Error(t, cmd.cmd.Execute())\n\trequire.Equal(t, 1, cmd.checked)\n}\n\nfunc TestCheckConfigInvalidQuiet(t *testing.T) {\n\tcmd := newCheckCmd()\n\tcmd.cmd.SetArgs([]string{\"-f\", \"testdata/invalid.yml\", \"-q\"})\n\trequire.Error(t, cmd.cmd.Execute())\n\trequire.Equal(t, 1, cmd.checked)\n}\n\nfunc TestCheckConfigDeprecated(t *testing.T) {\n\tcmd := new"
2491
+ }
2492
+ ]
2493
+ },
2494
+ {
2495
+ "fullName": "sigstore/cosign",
2496
+ "url": "https://github.com/sigstore/cosign",
2497
+ "categories": [
2498
+ "package release artifacts"
2499
+ ],
2500
+ "description": "Code signing and transparency for containers and binaries",
2501
+ "language": "Go",
2502
+ "license": "Apache-2.0",
2503
+ "stars": 6206,
2504
+ "forks": 785,
2505
+ "updatedAt": "2026-08-13T19:18:46Z",
2506
+ "pushedAt": "2026-08-13T18:25:42Z",
2507
+ "archived": false,
2508
+ "defaultBranch": "main",
2509
+ "readmeExcerpt": "<p align=\"center\">\n <img style=\"max-width: 100%;width: 300px;\" src=\"https://raw.githubusercontent.com/sigstore/community/main/artwork/cosign/horizontal/color/sigstore_cosign-horizontal-color.svg\" alt=\"Cosign logo\"/>\n</p>\n\n# cosign\n\nSigning OCI containers (and other artifacts) using [Sigstore](https://sigstore.dev/)!\n\n[![Go Report Card](https://goreportcard.com/badge/github.com/sigstore/cosign)](https://goreportcard.com/report/github.com/sigstore/cosign)\n[![e2e-tests](https://github.com/sigstore/cosign/actions/workflows/e2e-tests.yml/badge.svg)](https://github.com/sigstore/cosign/actions/workflows/e2e-tests.yml)\n[![CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/5715/badge)](https://bestpractices.coreinfrastructure.org/projects/5715)\n[![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/sigstore/cosign/badge)](https://securityscorecards.dev/viewer/?uri=github.com/sigstore/cosign)\n\nCosign aims to make signatures **invisible infrastructure**.\n\nCosign supports:\n\n* \"Keyless signing\" with the Sigstore public good Fulcio certificate authority and Rekor transparency log (default)\n* Hardware and KMS signing\n* Signing with a cosign generated encrypted private/public keypair\n* Container Signing, Verification and Storage in an OCI registry.\n* Bring-your-own PKI\n\n## Info\n\n`Cosign` is developed as part of the [`sigstore`](https://sigstore.dev) project.\nWe also use a [slack channel](https://sigstore.slack.com)!\nClick [here](https://join.slack.com/t/sigstore/shared_invite/zt-2ub0ztl5z-PkWb_Ldwef5d6nb~oryaTA) for the invite link.\n\n## Installation\n\nFor Homebrew, Arch, Nix, GitHub Action, and Kubernetes installs see the [installation docs](https://docs.sigstore.dev/cosign/system_config/installation/).\n\nFor Linux and macOS binaries see the [GitHub release assets](https://github.com/sigstore/cosign/releases/latest).\n\n:rotating_light: If you are downloading releases of cosign from our GCS bucket - please see more information on the July 31, 2023 [deprecation notice](https://blog.sigstore.dev/cosign-releases-bucket-deprecation/) :rotating_light:\n\n## Developer Installation\n\nIf you have Go 1.22+, you can setup a development environment:\n\n```shell\n$ git clone https://github.com/sigstore/cosign\n$ cd cosign\n$ go install ./cmd/cosign\n$ $(go env GOPATH)/bin/cosign\n```\n\n## Contributing\n\nIf you are interested in contributing to `cosign`, pl",
2510
+ "relevantPaths": [
2511
+ ".github/workflows/build.yaml",
2512
+ ".github/workflows/codeql-analysis.yml",
2513
+ ".github/workflows/conformance-nightly.yml",
2514
+ ".github/workflows/conformance.yml",
2515
+ ".github/workflows/cosign-test.key",
2516
+ ".github/workflows/cosign-test.pub",
2517
+ ".github/workflows/cut-release.yml",
2518
+ ".github/workflows/depsreview.yml",
2519
+ ".github/workflows/donotsubmit.yaml",
2520
+ ".github/workflows/e2e-tests.yml",
2521
+ ".github/workflows/e2e-with-binary.yml",
2522
+ ".github/workflows/github-oidc.yaml",
2523
+ ".github/workflows/golangci-lint.yml",
2524
+ ".github/workflows/kind-verify-attestation.yaml",
2525
+ ".github/workflows/scorecard-action.yml",
2526
+ ".github/workflows/tests.yaml",
2527
+ ".github/workflows/validate-release.yml",
2528
+ ".github/workflows/verify-docgen.yaml",
2529
+ ".github/workflows/whitespace.yaml",
2530
+ ".goreleaser.yml",
2531
+ "Dockerfile",
2532
+ "LICENSE",
2533
+ "artifacthub-repo.yml",
2534
+ "cmd/cosign/cli/attest.go",
2535
+ "cmd/cosign/cli/attest/attest.go",
2536
+ "cmd/cosign/cli/attest/attest_blob.go",
2537
+ "cmd/cosign/cli/attest/attest_blob_test.go",
2538
+ "cmd/cosign/cli/attest/common.go",
2539
+ "cmd/cosign/cli/attest/common_test.go",
2540
+ "cmd/cosign/cli/attest_blob.go"
2541
+ ],
2542
+ "codeSamples": [
2543
+ {
2544
+ "path": "cmd/cosign/cli/attest.go",
2545
+ "url": "https://github.com/sigstore/cosign/blob/main/cmd/cosign/cli/attest.go",
2546
+ "excerpt": "//\n// Copyright 2021 The Sigstore Authors.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage cli\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/sigstore/cosign/v3/cmd/cosign/cli/attest\"\n\t\"github.com/sigstore/cosign/v3/cmd/cosign/cli/generate\"\n\t\"github.com/sigstore/cosign/v3/cmd/cosign/cli/options\"\n\t\"github.com/sigstore/cosign/v3/cmd/cosign/cli/signcommon\"\n\t\"github.com/spf13/cobra\"\n)\n\nfunc Attest() *cobra.Command {\n\to := &options.AttestOptions{}\n\n\tcmd := &cobra.Command{\n\t\tUse: \"attest\",\n\t\tShort: \"Attest the supplied container image\",\n\t\tExample: ` cosign attest --key <key path>|<kms uri> [--predicate <path>] [--a key=value] [--no-upload=true|false] [--record-creation-timestamp=true|false] [--f] [--r] <image uri>\n\n # attach an attestation to a container image Google sign-in\n cosign attest --timeout 90s --predicate <FILE> --type <TYPE> <IMAGE>\n\n # attach an attestation to a container image with a local key pair file\n cosign attest --predicate <FILE> --type <TYPE> --key cosign.key <IMAGE>\n\n # attach an attestation to a container image with a key pair stored in Azure Key Vault\n c"
2547
+ },
2548
+ {
2549
+ "path": "cmd/cosign/cli/attest/attest.go",
2550
+ "url": "https://github.com/sigstore/cosign/blob/main/cmd/cosign/cli/attest/attest.go",
2551
+ "excerpt": "//\n// Copyright 2021 The Sigstore Authors.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage attest\n\nimport (\n\t\"context\"\n\t_ \"crypto/sha256\" // for `crypto.SHA256`\n\t\"fmt\"\n\t\"os\"\n\t\"time\"\n\n\t\"github.com/google/go-containerregistry/pkg/name\"\n\tv1 \"github.com/google/go-containerregistry/pkg/v1\"\n\t\"google.golang.org/protobuf/encoding/protojson\"\n\n\t\"github.com/sigstore/cosign/v3/cmd/cosign/cli/options\"\n\t\"github.com/sigstore/cosign/v3/cmd/cosign/cli/signcommon\"\n\t\"github.com/sigstore/cosign/v3/internal/ui\"\n\t\"github.com/sigstore/cosign/v3/pkg/cosign/attestation\"\n\tcbundle \"github.com/sigstore/cosign/v3/pkg/cosign/bundle\"\n\tcremote \"github.com/sigstore/cosign/v3/pkg/cosign/remote\"\n\t\"github.com/sigstore/cosign/v3/pkg/oci/mutate\"\n\tociremote \"github.com/sigstore/cosign/v3/pkg/oci/remote\"\n\t\"github.com/sigstore/cosign/v3/pkg/oci/static\"\n\t\"github.com/sigstore/cosign/v3/pkg/types\"\n\tprotobundle \"github.com/sigstore/protobuf-specs/gen/pb-go/bundle/v1\"\n\t\"github.com/sigstore/sigstore/pkg/signature\"\n)\n\n// nolint\ntype AttestCommand struct {\n\toptions.KeyOpts\n\toptions.RegistryOptions\n\tCertPath "
2552
+ }
2553
+ ]
2554
+ },
2555
+ {
2556
+ "fullName": "renovatebot/renovate",
2557
+ "url": "https://github.com/renovatebot/renovate",
2558
+ "categories": [
2559
+ "package release artifacts"
2560
+ ],
2561
+ "description": "Home of the Renovate CLI: Cross-platform Dependency Automation by Mend.io",
2562
+ "language": "TypeScript",
2563
+ "license": "AGPL-3.0",
2564
+ "stars": 22257,
2565
+ "forks": 3252,
2566
+ "updatedAt": "2026-08-13T22:36:08Z",
2567
+ "pushedAt": "2026-08-13T22:47:28Z",
2568
+ "archived": false,
2569
+ "defaultBranch": "main",
2570
+ "readmeExcerpt": "![Mend Renovate CLI banner](https://docs.renovatebot.com/assets/images/mend-renovate-cli-banner.jpg)\n\n[![License: AGPL-3.0-only](https://img.shields.io/badge/license-%20%09AGPL--3.0--only-blue.svg)](https://raw.githubusercontent.com/renovatebot/renovate/main/license)\n[![codecov](https://codecov.io/gh/renovatebot/renovate/branch/main/graph/badge.svg)](https://codecov.io/gh/renovatebot/renovate)\n[![Renovate enabled](https://img.shields.io/badge/renovate-enabled-brightgreen.svg)](https://renovatebot.com/)\n[![Build status](https://github.com/renovatebot/renovate/actions/workflows/build.yml/badge.svg)](https://github.com/renovatebot/renovate/actions/workflows/build.yml)\n![Docker Pulls](https://img.shields.io/docker/pulls/renovate/renovate?color=turquoise)\n[![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/renovatebot/renovate/badge)](https://securityscorecards.dev/viewer/?uri=github.com/renovatebot/renovate)\n\n# What is the Mend Renovate CLI?\n\nRenovate is an automated dependency update tool.\nIt helps to update dependencies in your code without needing to do it manually.\nWhen Renovate runs on your repo, it looks for references to dependencies (both public and private) and, if there are newer versions available, Renovate can create pull requests to update your versions automatically.\n\n## Features\n\n- Delivers update PRs directly to your repo\n - Relevant package files are discovered automatically\n - Pull Requests automatically generated in your repo\n- Provides useful information to help you decide which updates to accept (age, adoption, pass rates, merge confidence)\n- Highly configurable and flexible to fit in with your needs and repository standards\n- Largest collection of languages and platforms (listed below)\n- Connects with private repositories and package registries\n\n### Languages\n\nRenovate can provide updates for most popular languages, platforms, and registries including: npm, Java, Python, .NET, Scala, Ruby, Go, Docker and more.\nSupports over [90 different package managers](https://docs.renovatebot.com/modules/manager/).\n\n### Platforms\n\nRenovate updates code repositories on the following platforms: GitHub, GitLab, Bitbucket, Azure DevOps, AWS Code Commit (experimental), Gitea, Forgejo, Gerrit (experimental), SCM-Manager (experimental)\n\n## Ways to run Renovate\n\nThe most effective way to run Renovate is to use an automated job schedul",
2571
+ "relevantPaths": [
2572
+ ".devcontainer/Dockerfile",
2573
+ ".github/workflows/auto-label-needs-discussion.yml",
2574
+ ".github/workflows/auto-pr.yml",
2575
+ ".github/workflows/build.yml",
2576
+ ".github/workflows/cancel-stale-merge-queue-workflows.yml",
2577
+ ".github/workflows/check-commit-messages.yml",
2578
+ ".github/workflows/check-npm-packument-size.yml",
2579
+ ".github/workflows/close-answered-discussions.yml",
2580
+ ".github/workflows/close-answered-discussions/script.cjs",
2581
+ ".github/workflows/codeql-analysis.yml",
2582
+ ".github/workflows/dependency-review.yml",
2583
+ ".github/workflows/devcontainer.yml",
2584
+ ".github/workflows/find-issues-with-missing-labels.yml",
2585
+ ".github/workflows/label-actions.yml",
2586
+ ".github/workflows/lock.yml",
2587
+ ".github/workflows/mend-slack.yml",
2588
+ ".github/workflows/scorecard.yml",
2589
+ ".github/workflows/undesirable-test-additions.yaml",
2590
+ ".github/workflows/update-data.yml",
2591
+ ".github/workflows/ws_scan.yaml",
2592
+ ".releaserc.json",
2593
+ "docs/development/major-release.md",
2594
+ "docs/usage/key-concepts/minimum-release-age.md",
2595
+ "lib/config/migrations/custom/fetch-release-notes-migration.spec.ts",
2596
+ "lib/config/migrations/custom/fetch-release-notes-migration.ts",
2597
+ "lib/config/migrations/custom/separate-major-release-migration.spec.ts",
2598
+ "lib/config/migrations/custom/separate-major-release-migration.ts",
2599
+ "lib/modules/datasource/artifactory/__fixtures__/releases-as-files.html",
2600
+ "lib/modules/datasource/artifactory/__fixtures__/releases-as-folders.html",
2601
+ "lib/modules/datasource/artifactory/__snapshots__/index.spec.ts.snap"
2602
+ ],
2603
+ "codeSamples": [
2604
+ {
2605
+ "path": "lib/config/migrations/custom/fetch-release-notes-migration.spec.ts",
2606
+ "url": "https://github.com/renovatebot/renovate/blob/main/lib/config/migrations/custom/fetch-release-notes-migration.spec.ts",
2607
+ "excerpt": "import { FetchReleaseNotesMigration } from './fetch-release-notes-migration.ts';\n\ndescribe('config/migrations/custom/fetch-release-notes-migration', () => {\n it('migrates', async () => {\n await expect(FetchReleaseNotesMigration).toMigrate(\n {\n fetchReleaseNotes: false,\n },\n {\n fetchChangeLogs: 'off',\n },\n );\n await expect(FetchReleaseNotesMigration).toMigrate(\n {\n fetchReleaseNotes: true,\n },\n {\n fetchChangeLogs: 'pr',\n },\n );\n await expect(FetchReleaseNotesMigration).toMigrate(\n {\n fetchReleaseNotes: 'pr',\n },\n {\n fetchChangeLogs: 'pr',\n },\n );\n await expect(FetchReleaseNotesMigration).toMigrate(\n {\n fetchReleaseNotes: 'off',\n },\n {\n fetchChangeLogs: 'off',\n },\n );\n await expect(FetchReleaseNotesMigration).toMigrate(\n {\n fetchReleaseNotes: 'branch',\n },\n {\n fetchChangeLogs: 'branch',\n },\n );\n });\n});\n"
2608
+ },
2609
+ {
2610
+ "path": "lib/config/migrations/custom/fetch-release-notes-migration.ts",
2611
+ "url": "https://github.com/renovatebot/renovate/blob/main/lib/config/migrations/custom/fetch-release-notes-migration.ts",
2612
+ "excerpt": "import { isBoolean } from '@sindresorhus/is';\nimport type { RenovateConfig } from '../../types.ts';\nimport { RenamePropertyMigration } from '../base/rename-property-migration.ts';\n\nexport class FetchReleaseNotesMigration extends RenamePropertyMigration {\n constructor(originalConfig: RenovateConfig, migratedConfig: RenovateConfig) {\n super(\n 'fetchReleaseNotes',\n 'fetchChangeLogs',\n originalConfig,\n migratedConfig,\n );\n }\n\n override run(value: unknown): void {\n let newValue: unknown = value;\n\n if (isBoolean(value)) {\n newValue = value ? 'pr' : 'off';\n }\n\n super.run(newValue);\n }\n}\n"
2613
+ }
2614
+ ]
2615
+ }
2616
+ ]
2617
+ }