Back to Explorer
Beginner Friendly Open-Source Python

Good First Issues in Python

Explore curated starter issues in high-scoring Python repositories. Every listed issue belongs to a welcoming repository scored by C-Rankβ„’ on PR merge rates, review responsiveness, and first-timer acceptance.

Updated: Sun, 30 Aug 2026 UTC (Live GitHub Sync)
Real-Time Radar

Arm Issue Sniper for fresh Python beginner issues

Beginner issues in welcoming S/A-Tier repositories get snatched within 15 minutes. Receive instant alerts on Discord, Telegram, or Email the minute a maintainer opens a new task.

Live Good First Issues (30)

Real-Time Open GitHub Issues
omnigent-ai/omnigent9,501 Tier A Β· 67 pts
#5869Opened today
[Feature] Deep-link the New Chat screen directly to a specific registered host (?host=<host_id>)

Problem or use case We run one shared, always-on omnigent-server with many long-lived, persistent hosts registered against it (one per developer workspace, provisioned by an internal platform β€” think one host per Coder/devcontainer workspace, each corresponding to a specific project/repo checkout). Each workspace exposes a dashboard tile that opens the shared omnigent web UI. Today that tile can only open the generic New Chat screen (/), where the user must manually find and pick their specific workspace's host from what can be a long, growing list of registered hosts. There's no way for the tile's URL to say "open New Chat pre-bound to this host" β€” the user has to correctly identify their own workspace among potentially dozens of others every time. We looked for an existing mechanism and found: No ?host=<id>//new/:hostId-style route on the New Chat screen (web/src/App.tsx, web/src/shell/NewChatDialog.tsx). The only related mechanism, ?project=<name> on /, only pre-selects a host

Featurehelp wantedcomp:web-uiP2-medium
1
omnigent-ai/omnigent9,501 Tier A Β· 67 pts
#5860Opened today
Background daemon drops CLAUDE_CODE_ENABLE_TELEMETRY (corrected replacement for #5103)

Version / pin omnigent CLI 0.10.0 (uv tool install --force "omnigent[tracing,claude-sdk]") Vendored tree pinned at tag v0.10.0, commit 40755dd8dddb07e1eb6e4055d1d9936e184ceb9b Host: macOS (darwin 25.5.0) Why a new issue This corrects and replaces #5103 (closed COMPLETED, no comments). #5103's impact claim was too strong and our later measurement disproved it: it said the claude-sdk lane "cannot export any telemetry at all regardless of how the daemon environment is configured." That is wrong β€” when the daemon itself is started in the foreground with the telemetry env set, the lane exports fine (claude_code.* events observed with model, token, cost and session identity). This issue states only the still-true, still-open remainder. Still-true claims OMNIGENT_RUNNER_ENV_PASSTHROUGH (omnigent/host/connect.py:581, consumed by _build_runner_env) did not deliver any named variable to a claude-sdk harness process in our probes β€” neither CLAUDE_CODE_ENABLE_TELEMETRY nor a completely gene

Bughelp wantedcomp:serverP2-medium
2
omnigent-ai/omnigent9,501 Tier A Β· 67 pts
#5859Opened today
Server never extracts the dispatching client's TRACEPARENT: cross-service runs split into disjoint traces

Version / pin omnigent CLI 0.10.0 (uv tool install --force "omnigent[tracing,claude-sdk]") Vendored tree pinned at tag v0.10.0, commit 40755dd8dddb07e1eb6e4055d1d9936e184ceb9b Host: macOS (darwin 25.5.0) Summary omnigent/runtime/telemetry.py ships both halves of W3C trace-context propagation: get_traceparent_env() (:670) to inject, and extract_trace_context() (:723) to extract. But no launch path extracts the dispatching client's incoming TRACEPARENT: the server generates its own conversation trace and propagates that downward. A wrapper that starts a span, sets TRACEPARENT in the environment, and invokes omnigent run ends up with a trace containing only its own spans; every span and event the run produces (runner, harness, harness-CLI telemetry) rides an omnigent-generated trace id. Measured exhibit (0.10.0, claude-sdk harness) One dispatch of ours: the dispatching wrapper's trace 5fed4abf… holds exactly its own 8 spans and nothing else. The same run's claude_code.* events carry o

Bughelp wantedcomp:servercomp:runner
1
omnigent-ai/omnigent9,501 Tier A Β· 67 pts
#5858Opened today
Per-run valued env for harness spawns: generic passthrough from bundle spec into _build_harness_spawn_env overrides

Version / pin omnigent CLI 0.10.0 (uv tool install --force "omnigent[tracing,claude-sdk]") Vendored tree pinned at tag v0.10.0, commit 40755dd8dddb07e1eb6e4055d1d9936e184ceb9b Host: macOS (darwin 25.5.0) Summary os_env.sandbox.env_passthrough already solves the named half of environment delivery to spawned harnesses: a bundle spec can list env var names, the spec parser validates them (omnigent/inner/os_env.py:230-231), and the direct-mode executors (acp, codex, pi, kimi, goose, hermes, qwen) plus the sandbox spawn allowlist honour them, so the spawned CLI keeps whatever telemetry/config env the runner holds. This works well and we use it. What is missing is the valued half: values that vary per run. A dispatching client cannot set, e.g., OTEL_RESOURCE_ATTRIBUTES=myapp.run.id=<N> on the harness process of the specific run it is dispatching. env_passthrough resolves names from the runner's environment, which is per-daemon; per-run values cannot travel that way, especially when Harness

Featurehelp wantedcomp:reprP2-medium
1
semantica-agi/semantica10,546 Tier A Β· 67 pts
#1272Opened today
FAISS: persist vector_ids and metadata across index save/load

Description FAISSIndex.save() currently persists only the underlying FAISS index, while the associated vector_ids and metadata are kept only in memory. As a result, loading a previously saved FAISS index does not restore the logical IDs and metadata associated with the stored vectors. Reproduction Create a FAISS store. Add vectors with IDs and metadata. Save the index. Start a new process and load the saved index. Inspect the store. The loaded index can contain the physical vectors, but vector_ids and metadata are not restored. This can cause: count() to report an incorrect value. get_vector(id) / scan_vectors() to behave incorrectly. Existing IDs to be invisible to duplicate detection. Re-running a migration after restarting the process to add duplicate physical vectors. Expected behavior Saving and loading a FAISS store should preserve the complete logical state associated with the index: vector IDs metadata underlying FAISS vectors/index Suggested fix Persist vector_ids and me

bughelp wanted
1
semantica-agi/semantica10,546 Tier A Β· 67 pts
#1271Opened today
Improve generate_typed() API consistency across LLM provider wrappers

Description The LLM wrappers are not completely consistent in how generate_typed() is exposed and typed across providers. The underlying BaseProvider already provides typed-generation functionality, but the public wrapper APIs do not all present it with the same explicit interface/documentation. Suggested improvement Review the existing LLM wrappers and standardize: generate_typed() availability method signatures type annotations documentation test coverage This would make the public semantica.llms API more predictable regardless of provider. Note This appears to be broader API consistency work rather than a blocker specific to PR #1262. Priority Non-blocking / follow-up.

enhancementhelp wanted
semantica-agi/semantica10,546 Tier A Β· 67 pts
#1270Opened today
Align generate_structured() return annotations across LLM providers

Description Some LLM provider wrappers annotate generate_structured() as returning a Dict, while the underlying structured parsing behavior can produce broader JSON-compatible structures, including a top-level list. This makes the public type annotations narrower than the actual supported runtime result. Suggested improvement Review the return annotations across the LLM providers and align them with the actual structured-output contract. In particular, consider using a broader JSON-compatible return type where both objects and arrays are supported. Why This would make the public API typing more accurate and consistent across providers. Priority Non-blocking / follow-up.

enhancementhelp wanted
2
semantica-agi/semantica10,546 Tier A Β· 67 pts
#1269Opened today
Gemini legacy provider: avoid unnecessary GenerativeModel recreation for per-call model overrides

Description The legacy Gemini SDK path can create a new GenerativeModel instance when a different model is supplied for an individual request. This is functionally acceptable, but repeated requests using the same alternate model can result in unnecessary model-object creation. Suggested improvement Consider caching/reusing model instances per model name where appropriate, while keeping credential isolation and provider-instance behavior safe. For example, a provider could maintain model instances keyed by model name rather than recreating the same model object for every request. Note This is primarily a performance/implementation improvement and does not block the current provider-wrapper PR. Priority Non-blocking / follow-up.

enhancementhelp wanted
semantica-agi/semantica10,546 Tier A Β· 67 pts
#1268Opened today
Gemini provider: make per-call model override behavior consistent across generate methods

Description The Gemini provider handles the optional per-call model argument inconsistently between generate() and generate_structured(). A caller passing: model="some-model" should get consistent model-selection behavior regardless of which generation method they use. Expected behavior generate(model=...) and generate_structured(model=...) should both honor the per-call model override consistently across the supported Gemini SDK paths. Why Inconsistent model selection can be surprising for callers using the same provider through different generation methods. Suggested improvement Align the model-selection logic between generate() and generate_structured() and add regression tests covering per-call model overrides. Priority Non-blocking / follow-up.

bughelp wanted
semantica-agi/semantica10,546 Tier A Β· 67 pts
#1267Opened today
[FEATURE] Publish official Docker images (docker pull semantica)

Problem Statement There's a Dockerfile for the Knowledge Explorer app and dev docker-compose files in the repo, but there's no published, versioned image on a registry. Anyone who wants to run Semantica in a container today has to clone the repo and build it themselves β€” there's no docker pull path, which is the default first step for a lot of infra/platform teams evaluating a new tool before they touch pip install. Proposed Solution Publish official, versioned images to a registry (GHCR under ghcr.io/semantica-agi/semantica, and/or Docker Hub) as part of the release pipeline, tagged to match PyPI releases: docker pull ghcr.io/semantica-agi/semantica:0.6.7 docker pull ghcr.io/semantica-agi/semantica:latest docker run -p 8000:8000 ghcr.io/semantica-agi/semantica:latest Concretely: Add a docker-build-push.yml workflow (or extend .github/workflows/release.yml) that builds and pushes on tag release, alongside the existing PyPI publish step Tag images with the exact semver (0.6.7), plus

enhancementhelp wanted
omnigent-ai/omnigent9,501 Tier A Β· 67 pts
#5830Opened today
[Feature] Add configurable composer send shortcut

Problem Desktop users have different expectations for whether Enter sends a message or inserts a newline. The web composer currently provides no preference, while mobile must avoid accidental submission from Enter. Proposed behavior Add a device-local setting that switches desktop submission between Enter and Command/Ctrl+Enter. Apply the choice to existing-session and new-session composers. Keep mobile Enter reserved for inserting a newline. Show the active chords in composer tooltips and the keyboard shortcuts reference. Make General the default Settings section.

Featurehelp wantedcomp:web-uiP2-medium
1
omnigent-ai/omnigent9,501 Tier A Β· 67 pts
#5813Opened today
OSV advisory scan always fails: uv export --all-extras conflicts with declared extra conflicts

What happens The OSV advisory scan (uv.lock) step in .github/workflows/security-scan.yml runs: uv export --frozen --format requirements-txt --all-extras > /tmp/uv-req-full.txt --all-extras cannot be satisfied, because pyproject.toml declares extras that conflict: [[{'extra': 'antigravity'}, {'extra': 'cwsandbox'}], [{'extra': 'antigravity'}, {'extra': 'modal'}], [{'extra': 'antigravity'}, {'extra': 'databricks'}], [{'group': 'lint'}, {'extra': 'antigravity'}]] so uv exits 2: error: Extras `antigravity` and `cwsandbox` are incompatible with the declared conflicts: {`omnigent[antigravity]`, `omnigent[cwsandbox]`} Why it matters The step only fires when uv.lock is in the changeset, so it is invisible until a PR touches the lockfile, and then it always fails. No advisory is ever evaluated: the export dies before pip-audit runs, so the scan blocks PRs without providing the check it exists to provide. For a fork PR the effect is larger. A failed Security Scan fails the Security

Bughelp wantedcomp:infraP2-medium
2
omnigent-ai/omnigent9,501 Tier A Β· 67 pts
#5808Opened today
Slack and Discord bots ignore attached files

What happens Attach a file to a message addressed to the Slack or Discord bot and ask the agent to work with it. The agent never sees it β€” it answers as though only the text was sent. Why Neither bot reads inbound attachments. handle_message takes message.content and nothing else; message.attachments is dropped on the floor. This is not a permissions or intent problem. Discord's message_content intent, which the bot already requires, covers "message content, attachments, embeds and components", so the data is already in the payload the bot receives. Slack likewise delivers a files array on the message event. Both bots simply ignore it. The only file handling either bot has today is the reverse direction: announcing a file the agent produced (format_output_file, from response.output_file.done). What it would take The server already accepts uploads: POST /v1/sessions/{session_id}/resources/files GET /v1/sessions/{session_id}/resources/files/{file_id}/content So the work is the plumbi

Featurehelp wantedcomp:serverP1-high
4
repowise-dev/repowise6,219 Tier S Β· 70 pts
#1996Opened today
[Bug] repowise update --full --dry-run mutates the index via upgrade_to_full

Summary In RepoWise 0.46.0, repowise update --full --dry-run enters the full-upgrade branch and invokes upgrade_to_full. The dry-run flag is not checked or passed through on that branch. Reproduction Initialize a repository with a fast index. Snapshot the .repowise database, state, and configuration hashes. Run repowise update --full --dry-run. Observe that the command announces and starts the full upgrade instead of returning a read-only plan. Index state can change before cancellation. The control-flow cause is in packages/cli/src/repowise/cli/commands/update_cmd/command.py: the if full branch dispatches upgrade_to_full(...) and returns before the normal dry-run guard later in run_update. Expected behavior Dry-run must print the planned full upgrade and estimate without invoking the upgrade worker, provider calls, persistence, locks, or state/config writes. Actual behavior The upgrade worker runs. This can backfill the Git tier, generate documentation, consume provider compute, alt

help wanted
3
omnigent-ai/omnigent9,501 Tier A Β· 67 pts
#5803Opened today
[Bug] Kimi custom providers are reported as unconfigured

Description Kimi Code supports custom OpenAI-compatible providers such as OpenRouter. A Kimi installation configured this way works normally from the command line, but Omnigent reports the Kimi harness as unavailable. The readiness check in omnigent/onboarding/kimi_auth.py only accepts providers identified as Kimi or Moonshot by provider type or hostname. An OpenRouter provider is therefore rejected even when it has a valid API key and is the configured default provider. This causes the host to advertise: kimi-native: false As a result, Kimi cannot be selected in the Omnigent UI without patching the readiness check. Issue #5126 and PR #5138 added support for direct Kimi/Moonshot API-key authentication. They do not cover custom providers supported by Kimi Code itself. Steps to reproduce Configure Kimi Code to use OpenRouter: toml default_model = "openrouter/moonshotai/kimi-k3" [providers.openrouter] type = "openai" base_url = "https://openrouter.ai/api/v1" api_key = "" Confirm Kimi w

Bughelp wantedP2-mediumtriaged
2
LeyckerS/moondownloader1,579 Tier S Β· 75 pts
#179Opened 1 day ago
ci: wire render_gui.py into the web workflow β€” the check that gates more than syntax

Follow-up to #174, which landed its minimal half in #176: web/-only pull requests now get a syntax check (node --check web/app.js). That catches parse errors and nothing else. render_gui.py already exists as a real GUI check β€” headless-Chromium screenshots that fail on JS runtime errors, element overflow, horizontal scroll, or missing rows. Wired into the same workflow it would gate the class of breakage the syntax check cannot see: code that parses and then breaks the page. What #174 established and what it did not: node --check was verified on the runner. render_gui.py inside a GitHub Actions runner was not β€” locally it needs pip install -r requirements.txt plus playwright install chromium, and #174 estimated ~1–2 minutes of job time. Whether it runs headless in CI at all, and what it actually costs, is the open question β€” so this is a problem statement, not a recipe. First step for whoever takes it: get render_gui.py to produce its screenshots in a runner on a scratch branch

enhancementhelp wanted
LeyckerS/moondownloader1,579 Tier S Β· 75 pts
#178Opened 1 day ago
a stall-killed link whose re-extraction fails is never counted β€” both front-ends wait forever

Found while re-reviewing #154's counting paths. It exists on main independent of that PR, in both front-ends, so it gets its own issue per the usual scope rule. The accounting A run finishes only when every link is counted. In the CLI: mark_done() bumps n_done and sets all_done once n_done >= len(urls) (moon_cli.py:95-98); each browser_worker exits only on all_done.is_set() and q.empty() (moon_cli.py:183); run() gathers those workers (moon_cli.py:292). The engine is the same shape: mark_done at moon_engine.py:355-358, the worker's exit check at moon_engine.py:216. The dropped path A stall-killed download is re-queued for re-extraction with the same record (moon_cli.py:163-167; engine equivalent in _do_dl), and on pickup the entry is flagged is_re = rec.stall_kills > 0 (moon_cli.py:196, moon_engine.py:231). If that re-extraction then fails: the retry branch excludes it β€” not is_re at moon_cli.py:260 and moon_engine.py:316; the fail branch excludes it too β€” not is_re at moon_cli.py:

bughelp wanted
apache/airflow46,647 Tier A Β· 63 pts
#72264Opened 1 day ago
GCSToGCSOperator: move_object=True raises NotFound (404) exception on task retry when source object was already deleted

Under which category would you file this issue? Airflow Core Apache Airflow version 3.2.2 What happened and how to reproduce it? When running GCSToGCSOperator with move_object=True, if a task fails after the file has been successfully copied and deleted from the source bucket (e.g., not acknowledge due to network issue), a task retry will attempt to delete the source object again. Because the object was already deleted in the previous run, the hook.delete() call raises a google.api_core.exceptions.NotFound (404) error, causing the task retry to fail completely rather than succeeding idempotently. Logs of error: [2026-08-28 19:07:45] INFO - Object application/interface/myfile.xml in bucket professional-bucket-europe-west1-in rewritten to object ... [2026-08-28 19:07:45] INFO - Blob application/interface/myfile.xml deleted. [2026-08-28 19:07:45] INFO - Executing copy of ... ... [2026-08-28 19:07:55] WARNING - Blob application/interface/myfile.xml in bucket professional-bucket-europe-west

kind:bugprovider:googlearea:providersgood first issue
2
BlessedRebuS/Krawl626 Tier S Β· 75 pts
#295Opened 1 day ago
Provide a way to insert Carto API key so that map doesnt have the watermark

Since recently, Carto started to require an API key to use map tiles, thus showing watermark on any requests without one. API key should append to the end of request of every tile (e.g. https://basemaps.cartocdn.com/rastertiles/voyager/{z}/{x}/{y}.png?key=YOUR_KEY).

enhancementgood first issuefrontend
sipyourdrink-ltd/bernstein995 Tier S Β· 76 pts
#4745Opened 1 day ago
Preprint "Receipts, Not Logs": seeking an arXiv endorsement (cs.CR) and skeptical readers

Maintainer's note, not a work item β€” nothing here needs a PR. I wrote a paper about the evidence layer this repository ships: "Receipts, Not Logs: Offline-Verifiable Run Records for LLM Agent Orchestration" The short version: agent frameworks produce logs, and a log proves only what the operator says happened. Bernstein takes the opposite bet β€” the coordination loop is deterministic Python with no model in the scheduling path, every run appends to a hash-chained journal, and a finished run collapses into one Ed25519-signed receipt that anyone verifies offline from the file alone. The paper states the trust model, what it deliberately does not protect against, and an adversary matrix measured on real runs of this repository's own backlog. It is not on arXiv yet, for two reasons: the same journal now also projects into a TRACE Trust Record, and that section has to match the spec as it currently stands (#4740 and #4743 are that alignment); and I want another week of production runs be

help wantedsize/s
maziyarpanahi/openmed5,074 Tier A Β· 64 pts
#2981Opened 1 day ago
Validate federated round scheduling windows

Summary Private-training rounds need explicit enrollment, update-submission, aggregation, and evaluation windows. Ambiguous or overlapping deadlines make lifecycle state and air-gapped participation nondeterministic. Scope Define an immutable UTC schedule with strictly ordered phase boundaries, optional maximum durations, and deterministic serialization. Resolve the active or next phase from a caller-injected timestamp without reading the system clock. Acceptance criteria Before-start, exact-boundary, active-phase, and after-finish cases resolve predictably for every phase. Naive timestamps, non-UTC offsets, reversed or equal boundaries, booleans, and excessive durations fail with field-only errors. The schedule contains no site identity, patient count, local metric, or network endpoint. .venv/bin/python -m pytest tests/unit/training/test_federated_schedule.py -q passes. Out of scope Network coordination, client notification, retries, or selecting the round lifecycle state. Extend

help wantedgood first issueroadmap-v2feature
maziyarpanahi/openmed5,074 Tier A Β· 64 pts
#2982Opened 1 day ago
Compare federated client capabilities with round requirements

Summary A client capability envelope and an immutable round manifest are useful only if compatibility is checked before enrollment. The comparison must explain incompatibility without exposing client identity, exact hardware inventory, or local data characteristics. Scope Compare protocol versions, training backend, model and adapter format, quantization support, declared resource class, deterministic-kernel support, privacy mechanism, and secure-aggregation mode. Return compatible, review-required, or incompatible with stable field-level reason codes and a metadata-only deterministic report. Acceptance criteria Exact match, supported version range, insufficient resources, unsupported privacy mode, adapter mismatch, and unknown requirement cases have table-driven tests. Unknown mandatory requirements fail closed; optional capability differences are distinguished from hard incompatibilities. Reports exclude client IDs, site names, hardware serials, paths, endpoints, patient counts, l

help wantedroadmap-v2featureP1
maziyarpanahi/openmed5,074 Tier A Β· 64 pts
#2979Opened 1 day ago
Add bounded streaming digests for multimodal assets

Summary Several multimodal modules compute SHA-256 independently, and callers need a shared streaming helper that does not load large PDFs, images, DICOM objects, or audio files into memory. Scope Hash bytes and binary streams in bounded chunks, returning the SHA-256 digest and byte count with an optional hard maximum. Preserve a seekable stream's position, never close caller-owned streams, and keep errors free of paths, filenames, and byte content. Acceptance criteria Bytes, seekable streams, non-seekable streams, empty input, and multi-chunk input match hashlib.sha256 reference digests. Exceeding the configured maximum fails before unbounded reading and reports only the limit category and numeric counts. Tests verify position restoration for seekable streams, no implicit close, and bounded read request sizes. .venv/bin/python -m pytest tests/unit/multimodal/test_digest.py -q passes. Out of scope Cryptographic signatures, content-addressed storage, or opening filesystem paths. Ma

help wantedgood first issueroadmap-v2feature
maziyarpanahi/openmed5,074 Tier A Β· 64 pts
#2980Opened 1 day ago
Build a privacy-safe multimodal preflight report

Summary The new asset manifest, media-type detector, modality profiles, resource limits, and streaming digest checks need one pre-decode entry point. Without a common report, each future VLM, OCR, DICOM, waveform, and audio provider will assemble different safety behavior. Scope Orchestrate manifest validation, declared-versus-detected media type, modality-specific fields, digest matching, and resource limits into a single accept-or-abstain report. Return deterministic findings, reason codes, schema versions, numeric metadata, and digests only; never open a heavy decoder or copy source content into the report. Acceptance criteria Synthetic happy-path examples for image, PDF, DICOM, and audio are accepted with byte-stable JSON. Media mismatch, malformed manifest, digest mismatch, insufficient metadata, and every resource-limit class produce ordered fail-closed findings. A sentinel test proves filenames, paths, OCR text, transcripts, DICOM values, credentials, and raw prefix bytes do

help wantedroadmap-v2featureP1
maziyarpanahi/openmed5,074 Tier A Β· 64 pts
#2978Opened 1 day ago
Validate modality-specific multimodal manifest fields

Summary A generic asset manifest can be structurally valid while still omitting the metadata needed to preflight its declared modality. Image dimensions, PDF page counts, DICOM frame geometry, and audio duration need explicit cross-field rules. Scope Add versioned image, PDF, DICOM, and audio manifest profiles that declare required, optional, and inapplicable metadata fields. Validate a privacy-safe asset manifest into deterministic field-only findings without opening or decoding the asset. Acceptance criteria Image width/height, PDF page count, DICOM frame count plus dimensions, and audio duration requirements have table-driven valid and invalid tests. Inapplicable fields, missing required fields, zero values, booleans, and non-finite numeric values produce stable categorical findings. Results contain only field names and reason codes, never source paths, embedded metadata, or media content. .venv/bin/python -m pytest tests/unit/multimodal/test_manifest_profiles.py -q passes. Out

help wantedgood first issueroadmap-v2feature
2
maziyarpanahi/openmed5,074 Tier A Β· 64 pts
#2977Opened 1 day ago
Add stable abstention reason codes for multimodal pipelines

Summary Image, document, waveform, and audio paths need a shared way to explain why processing stopped. Free-form messages are hard to evaluate and can accidentally contain OCR text, DICOM metadata, transcripts, or paths. Scope Define typed preflight, decode, inference, and post-process abstention stages with stable reason codes for unsupported media, malformed media, resource limits, low quality, PHI uncertainty, speaker uncertainty, temporal instability, and unavailable providers. Provide deterministic metadata-only serialization and strict validation without a free-text message field. Acceptance criteria Every documented stage and reason code round-trips with stable JSON output. Invalid stage-reason combinations and unknown values fail without echoing submitted content. The serialized schema cannot contain OCR text, transcripts, pixel data, DICOM values, paths, URLs, or model prompts. .venv/bin/python -m pytest tests/unit/multimodal/test_abstention.py -q passes. Out of scope De

help wantedgood first issueroadmap-v2feature
maziyarpanahi/openmed5,074 Tier A Β· 64 pts
#2976Opened 1 day ago
Add synthetic governed-agent trace fixtures

Summary The v3.1 safety contracts need a shared offline fixture pack so contributors can test allow, denial, abstention, and reviewer-handoff behavior without constructing traces ad hoc or using real clinical content. Scope Add a versioned JSONL fixture manifest and import-light loader for synthetic governed-agent trace cases. Cover read-only allow, minimum-data projection, missing capability, purpose mismatch, expired consent, human review, and bounded failure scenarios using opaque identifiers and digests only. Acceptance criteria Every declared case loads deterministically and is classified by a stable expected outcome and reason code. Fixture validation rejects unknown fields, duplicate case IDs, malformed digests, and undeclared expected outcomes with PHI-safe errors. A coverage assertion keeps focused tests synchronized with all fixture case IDs, and the committed fixture contains no names, chart text, credentials, or tool arguments. .venv/bin/python -m pytest tests/unit/eval/

help wantedgood first issueroadmap-v2feature
maziyarpanahi/openmed5,074 Tier A Β· 64 pts
#2975Opened 1 day ago
Render privacy-safe agent policy decision matrices

Summary Reviewers and tests need to compare policy decisions across tools and purposes without inspecting tool arguments or clinical outputs. There is no compact matrix artifact for this metadata-only view. Scope Model matrix rows using policy version, capability ID, purpose ID, tool ID, outcome reason code, and reviewer-required flag. Render deterministic JSON and Markdown with stable row ordering and duplicate-key validation. Acceptance criteria Empty, allow, deny, abstain, and review-required synthetic matrices render byte-stably across repeated runs. Duplicate decision keys and unknown outcome codes fail closed without echoing submitted values. A sentinel test proves prompts, arguments, outputs, evidence text, bearer values, and filesystem paths cannot appear in the artifact schema. .venv/bin/python -m pytest tests/unit/agent/test_policy_matrix.py -q passes. Out of scope Evaluating policies, granting capabilities, or executing tools. A reviewer UI or persistent audit database.

help wantedgood first issueroadmap-v2feature
SikamikanikoBG/homelab-monitor181 Tier S Β· 79 pts
#287Opened 1 day ago
Accessibility pass on the dashboard (checklist)

The dashboard is a single-file, dark-mode, chart-heavy page, and accessibility got no dedicated pass. Current state in static/dashboard.html: 40 aria-label attributes vs 4 tabindex, Chart.js canvases with no text alternative, and the tab/filter controls are mouse-driven. Nothing is broken in an aggressive way β€” but a keyboard-only or screen-reader user has a rough ride. Suggested scope (take any section β€” each is independently shippable) Keyboard reachability: tab order through the sidebar tabs, range filters and card actions; visible focus styles in the dark theme. Landmarks & roles: role on the data tables, labels on icon-only buttons (the inline-SVG header icons in particular). Charts: a short text summary per chart (peak/last value) so the sparklines aren't canvas-only. Colour: the status colours (green/amber/red dots) shouldn't be the only channel β€” a text state is already rendered next to most of them, so verify coverage. A PR that takes one section with a short "what I c

help wantedpriority: stretchdesign
SikamikanikoBG/homelab-monitor181 Tier S Β· 79 pts
#286Opened 1 day ago
Docs: a dedicated `website/security.md` page

The security model is real and partly tested β€” tests/test_hardening.py covers the per-host posture checks, docker-compose.readonly.yml exists for a read-only setup, the MCP server documents its read-only guardrail, and API-key auth for the API surface lives in backend/auth.py. But the documentation is scattered: one paragraph in features.md, a "Security model" section in how-it-works.md (the no-login design decision, the read-write Docker/D-Bus sockets, the "keep it behind your LAN" guidance), and nothing else. There's no dedicated page, and the nav (mkdocs.yml) has no entry for it. For a self-hosted tool that SSHes into your fleet, that's the page a newcomer looks for first. Suggested scope A website/security.md page that gathers what's already true and documented in one place, and adds what's missing: the no-login design decision and why (already in how-it-works.md), the socket/D-Bus privileges and the write-action flags that reduce them, API-key auth for the API/MCP surface, the

documentationgood first issue
1

Top Python Repositories with Beginner Issues (20)

Updated Daily via GitHub GraphQL
pymc-labs
pathmc
pymc-labs/pathmc
Sβ€’Elite
108Β·Python

Structural causal models with Bayesian estimation and interventional simulation via a concise DSL.

#bayesian-inference#causal-inference
94%
Merge Rate
1h
Review Time
83%
1st-Timers
2 GFI
Scorecard
andrefetch
postal
andrefetch/postal
Bβ€’Solid
72Β·Python

An open-source, terminal-based AI coding agent that reads your code, calls tools, and helps you build.

#agentic-ai#ai#cli
100%
Merge Rate
16h
Review Time
100%
1st-Timers
5 GFI
Scorecard
minihellboy
factorminer
minihellboy/factorminer
Sβ€’Elite
97Β·Python

A Self-Evolving Agent with Skills and Experience Memory for Financial Alpha Discovery

96%
Merge Rate
<1h
Review Time
100%
1st-Timers
1 GFI
Scorecard
GuyTeichman
RNAlysis
GuyTeichman/RNAlysis
Sβ€’Elite
141Β·Python

Analyze your RNA sequencing data without writing a single line of code

#bioinformatics#bioinformatics-analysis#bioinformatics-pipeline
93%
Merge Rate
3h
Review Time
100%
1st-Timers
4 GFI
Scorecard
SikamikanikoBG
homelab-monitor
SikamikanikoBG/homelab-monitor
Sβ€’Elite
181Β·Python

Plug-and-play homelab dashboard in one container β€” GPU, local-AI VRAM, Docker, systemd, host health. Built-in read-only MCP server so AI agents can explore it too.

#ai-infrastructure#docker#gpu
94%
Merge Rate
21h
Review Time
75%
1st-Timers
13 GFI
Scorecard
gadievron
raptor
gadievron/raptor
Sβ€’Elite
3.6kΒ·Python

Raptor turns Claude Code into a general-purpose AI offensive/defensive security agent. By using Claude.md and creating rules, sub-agents, and skills, and orchestrating security tool usage, we configure the agent for adversarial thinking, and perform research or attack/defense operations.

95%
Merge Rate
12h
Review Time
63%
1st-Timers
2 GFI
Scorecard
rhesis-ai
rhesis
rhesis-ai/rhesis
Sβ€’Elite
387Β·Python

The collaboration layer for AI teams: domain experts annotate and review agent behavior, engineers improve the agent from what they find.

#annotations#feedback-loop#hypothesis-testing
93%
Merge Rate
4d
Review Time
91%
1st-Timers
6 GFI
Scorecard
JdeRobot
RoboticsAcademy
JdeRobot/RoboticsAcademy
Sβ€’Elite
493Β·Python

Learn Robotics with JdeRobot

#computer-vision#gazebo#hacktoberfest
90%
Merge Rate
1h
Review Time
100%
1st-Timers
10 GFI
Scorecard
Metabuilder-Labs
tokenjam
Metabuilder-Labs/tokenjam
Sβ€’Elite
104Β·Python

Token Efficiency For AI Agents

#ai-agents#autonomous-agents#cli
91%
Merge Rate
21h
Review Time
85%
1st-Timers
41 GFI
Scorecard
getsolus
packages
getsolus/packages
Sβ€’Elite
138Β·Python

Solus Package Monorepo & Issue Tracker

#hacktoberfest#solus
95%
Merge Rate
1d
Review Time
93%
1st-Timers
1 GFI
Scorecard
jannikmi
timezonefinder
jannikmi/timezonefinder
Sβ€’Elite
536Β·Python

Offline timezone lookup for WGS84 coordinates, with no polygon simplification - so the answer stays correct at timezone borders.

#coordinates#geolocation#latitude
88%
Merge Rate
16h
Review Time
100%
1st-Timers
3 GFI
Scorecard
mont127
MacNdCheese
mont127/MacNdCheese
Sβ€’Elite
183Β·Python

Macndcheese is an app that runs almost any steam game and with the additional support for epic games.

80%
Merge Rate
1h
Review Time
80%
1st-Timers
7 GFI
Scorecard
ascii-supply-networks
dagster-slurm
ascii-supply-networks/dagster-slurm
Sβ€’Elite
57Β·Python

Dagster SLURM integration

#dagster#feray#hpc
96%
Merge Rate
<1h
Review Time
100%
1st-Timers
1 GFI
Scorecard
Lightning-AI
litData
Lightning-AI/litData
Sβ€’Elite
611Β·Python

Speed up model training by fixing data loading.

86%
Merge Rate
<1h
Review Time
67%
1st-Timers
6 GFI
Scorecard
albumentations-team
AlbumentationsX
albumentations-team/AlbumentationsX
Sβ€’Elite
533Β·Python

Next-generation Albumentations: dual-licensed for open-source and commercial use

#data-augmentation#deep-learning#deeplearning
94%
Merge Rate
18h
Review Time
75%
1st-Timers
1 GFI
Scorecard
stenolabs
stenoai
stenolabs/stenoai
Sβ€’Elite
1.3kΒ·Python

Steno is the highly secure privacy-first AI notepad & notetaker for all your confidential conversations. On Windows & MacOS. For government and defence sectors.

#ai#apple-silicon#gemma4
92%
Merge Rate
10h
Review Time
80%
1st-Timers
3 GFI
Scorecard
fossasia
voxbento
fossasia/voxbento
Sβ€’Elite
1.5kΒ·Python

Open Source AI powered Interpretation Platform https://voxbento.com

88%
Merge Rate
20h
Review Time
63%
1st-Timers
4 GFI
Scorecard
doronz88
pymobiledevice3
doronz88/pymobiledevice3
Sβ€’Elite
2.7kΒ·Python

Pure python3 implementation for working with iDevices (iPhone, etc...).

#afc#instruments#ios
92%
Merge Rate
1d
Review Time
100%
1st-Timers
5 GFI
Scorecard
sipyourdrink-ltd
bernstein
sipyourdrink-ltd/bernstein
Sβ€’Elite
995Β·Python

Deterministic orchestrator for CLI coding agents (Claude Code, Codex, Gemini CLI, +40 more). No model in the coordination loop, so parallel runs in per-task git worktrees replay byte-identically. Signed lineage plus an opt-in HMAC audit chain a reviewer checks offline. Cluster mode, air-gap deploy. Status: beta. https://bernstein.run

#agent-fleet#agent-orchestrator#agent-swarm
92%
Merge Rate
2d
Review Time
81%
1st-Timers
60 GFI
Scorecard
passagemath
passagemath
passagemath/passagemath
Sβ€’Elite
101Β·Python

General purpose mathematical software system, compatible fork of https://github.com/sagemath/sage supporting modularized installation with pip. Main repository, containing Sage library (src/), modularized pip-installable packages (pkgs/), Sage distribution (build/). Source repo for most packages in https://pypi.org/org/passagemath/

#computer-algebra-system#mathematics
91%
Merge Rate
2d
Review Time
80%
1st-Timers
3 GFI
Scorecard

How to make your first Python open-source pull request

Finding approachable Good First Issues in Python allows you to build real-world software engineering experience. Instead of submitting PRs to abandoned repositories, GetMerged verifies maintainer review speeds and first-timer acceptance rates before you write a single line of code.

Select any issue above to claim it directly on GitHub, or click a repository to inspect full maintainer review turnaround metrics and triage guidance!

Get this week's top welcoming repos + fresh Good First Issues for Python

Free weekly email, scoped to Python. No account needed - confirm once and unsubscribe anytime.