Good First Issues in JavaScript
Explore curated starter issues in high-scoring JavaScript repositories. Every listed issue belongs to a welcoming repository scored by C-Rank™ on PR merge rates, review responsiveness, and first-timer acceptance.
Arm Issue Sniper for fresh JavaScript 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)
Context Surfaced while building #17840 (path materialization), where idempotence is an acceptance criterion. The materializer filters against store state rather than trusting the store to dedupe — this ticket is why it has to. The behaviour is already pinned by a passing CONTROL spec in PR #17854 (test/playwright/unit/data/TreeStorePathMaterialization.spec.mjs, "CONTROL: a raw add() of the same node DOES duplicate it"). That spec asserts the current, wrong behaviour deliberately, so the AC below includes inverting it. Live latest-open sweep: checked the latest 20 open issues at 2026-08-29T16:28:32Z, plus a keyword sweep for duplicate/childrenMap/sibling/TreeStore across the latest 60 open; no equivalent found. A2A in-flight sweep: latest 30 messages across all read states — active claims are Brain #215, Engine #17850/#17853, Institution #48/#50, DevIndex #11, Skills #15, #17820/#17838/#17844; none claims src/data/. The Problem Adding a record whose key already exists corrupts the S
Abstract Steps to reproduce Start Firefox with clean profile Install TST Size the current window to full height vertically (but not "maximised", just a normal window at full height) Open a few tabs Using the TST context menu, move a tab to a new window Expected result The new window should also be full height as well, or at least it should not extend off screen. When using Firefox's native tab context menu to move to new window, the new window matches my expectations: it is full height (just like the original window) without extending off screen. Actual result The new window created by TST extends off screen a small amount. So far, I have only tested my current OS (Linux), so this might be platform specific behaviour. I wonder if it's related to TST adding 20 to the new window's top and left...? Curiously though, the new TST-opened window seems to be wider on both the left and right sides. The top edge remains at the top of the screen like the original window, but the bottom edge ext
Cleanup in test/service/ImageryFreshnessReportServiceSpec.scala:49 is a blanket delete by job name, run in both beforeAll and afterAll: private def cleanUp(): Unit = { val _ = run(sqlu"DELETE FROM background_job_run WHERE job_name IN ($pollJob, $syncJob)") } It removes every row under those two job names, not just the ones the spec seeded. On CI's empty schema that is the same thing. On a developer's database it is not: the dev app's own nightly actors record real runs under exactly those names, and running this spec destroys that history — which is what the Health panel and /adminapi/imageryFreshness read. It would also take a concurrently running suite's rows, and the beforeAll half means the loss happens even on a run that is interrupted before afterAll. Noticed while tracking down six orphaned check-imagery-age-actor rows in a dev DB (residue of two interrupted ImageryAdminSpec runs, unrelated to this). Those rows would have silently disappeared the next time this spec ran, whi
The design-token fallback plugins are inconsistent in how they handle var(--wpds-*) references that appear inside string literals (e.g. content: "var(--wpds-border-radius-sm)";) rather than as actual CSS var() functions. Discovered while reviewing #80401 (comment thread) Lightning CSS's behavior is already correct: Plugin Behavior PostCSS Regexp-based — matches and rewrites the text anywhere in the declaration, including inside quoted strings. esbuild / Vite Skip CSS files but rewrite the same text anywhere in JS/TS source. Lightning CSS AST-based — only adds fallbacks to parsed var() functions; leaves plain strings untouched. Ask: Align the PostCSS (and esbuild/Vite) plugins in packages/theme/postcss-plugins (and equivalents) to only inject fallbacks for actual var() function references, not incidental text matches inside strings/comments, matching Lightning CSS's AST-aware behavior.
Time: ~60 min · Difficulty: Beginner · No-code (YAML + comments only) The problem templates/portals.example.yml assumes the user is looking for an AI job. Measured on today's main: 36 mentions of "AI Engineer" Example entries are literally named Ashby — AI Engineer, Greenhouse — AI + visa sponsorship, Wellfound - AI + Visa sponsorship, Ashby — Agentic… Every example query builds on "AI Engineer" OR "LLM Engineer" OR "Forward Deployed" career-ops is a job-search tool for any profession. A nurse, an accountant, or a project manager who copies this template today has no starting point: every example teaches the AI-engineer search and nothing else. This has been requested by community members repeatedly since May (specialty-agnostic defaults, and opening the tool's framing to non-technical profiles: consulting, PMO, banking, customer success). What done looks like The example entries cover 3-4 different professions (e.g. one healthcare, one finance/ops, one marketing/sales, on
Description On the Meshery website, under Getting Started, the “Meshery Docs” link is not highlighted, so it is not visually prominent and does not clearly look like a clickable link. It should be highlighted like the “Extension Points” text in the other section, so users can easily identify it as a hyperlink. Expected Behavior The “Meshery Docs” text should be clearly highlighted and visible as a clickable link, similar to “Extension Points”. Screenshots Meshery Docs Expected Environment: OS: Mac Linux Windows Browser: Chrome Safari Firefox Version: Device: Desktop Mobile Contributor Guides and Handbook The meshery.io website uses Jekyll and GitHub Pages. Site content is found under the master branch. 📚 See the Contributing to Meshery.io Website section of the readme.md and other contributing instructions, too. 🎨 Wireframes and designs for Meshery UI in Figma (open invite) 🙋🏾🙋🏼 Questions: Discussion Forum and Community Slack 📺 Self-
We ship country-focused connectivity lists (Iran, Russia, China, Brazil, India…) so people can quickly check which services matter for that country. Germany is Europe's largest internet market and no European country is covered yet — if you're familiar with the German internet, you know better than we do which sites matter. Same recipe as #405: id: 'germany', emoji 🇩🇪, ≥10 members mixing global services relevant locally with major German platforms (e.g. Otto, Deutsche Bahn, DHL, Spiegel, Check24, bund.de…), names in every full locale pack (common/locale-registry.js is the current list), favicons committed via pnpm fetch-favicons. pnpm check green; comment to claim; PR targets dev.
Overview We need to keep project information up to date so that visitors to the website can find accurate information. Action Items In your IDE, open the _projects/nottoday.md file. Observe the existing syntax of the front matter block 1 in the file. Find the description variable and change the following: From: Not Today - the self-defense against suicidal thoughts app is intended to help people wait out periods of suicidal thinking without acting on their thoughts. To: Not Today is an app designed to help people experiencing suicidal thoughts make one immediate decision: not today. Rather than asking someone to solve everything in the middle of a crisis, the app helps them wait out periods of suicidal thinking without acting on those thoughts. Users can leave messages for their future selves, including voice recordings, photos, text, links, and videos, set wellbeing check-ins, and quickly access suicide-prevention and crisis support by phone or text. Verify the changes by v
Is there a specific app this action is for? Please provide a link to the relevant API docs for the specific service / operation.
Current State of the Meshery.io site On individual design pages in the Meshery Catalog, the design identifier is labeled as UUID and displayed as its full UUID value. There is currently no convenient way to copy the UUID. In addition, when a design page is shared in Slack or another platform, the unfurled link preview displays the UUID instead of the design title. Current design title: vault-0.30.1.tgz Current UUID: 00fadfee-3655-40c7-8a38-6c5cd72ea4da Desired State of the Meshery.io site The UUID field label should be changed to the more concise ID, while retaining the full UUID value. A copy-to-clipboard button should be displayed next to the ID. After the button is activated, it should briefly show feedback such as Copied!. The copy control should be accessible by keyboard and have an appropriate accessible label. The page title and social-preview metadata, including Open Graph and Twitter metadata where applicable, should use the design title instead of the UUID. For the example ab
Description vaadin-message-list renders Markdown with soft line breaks disabled, so a single line break inside a paragraph is dropped: This is inconsistent with how users can enter multi-line messages in vaadin-message-input It's also inconsistent with the plain text mode which preserves line breaks (uses white-space: pre-wrap) Pretty much any chat / message UI uses soft line breaks Comparison between default mode and Markdown mode Proposed change Render <vaadin-markdown> with lineBreaks enabled in vaadin-message-list. This keeps the plain text and Markdown rendering consistent, and matches how other chat applications render messages.
Problem In the "Last 14 days" list, the token-count column (.usg_dayTokens) is flex:none with no fixed width, so the numbers are effectively left-aligned right after the date. Because daily usage varies wildly in magnitude (hundreds of thousands to hundreds of millions), the ragged column makes it hard to compare values at a glance. (Paste screenshot here) Suggested fix Give the column a fixed minimum width and right-align it, matching the alignment style already used by the cache-hit-rate column (.usg_dayHit). A one-line CSS change: - .usg_dayTokens{color:var(--dsw-alias-label-primary);flex:none;font-size:12px;line-height:18px;font-variant-numeric:tabular-nums} + .usg_dayTokens{color:var(--dsw-alias-label-primary);flex:none;min-width:84px;text-align:right;font-size:12px;line-height:18px;font-variant-numeric:tabular-nums}
Time: ~1-2h · Difficulty: Beginner · No-code — reserved for first-time contributors v1.29.0 tiered the Source-of-Truth boundary: cv.md and your profile are ground truth, the story bank supplies narrative, and story-provenance-check.mjs audits that any quantified claim traces back to a primary file. None of that is explained anywhere a user would find it. What the page should cover: the drift problem (a figure invented once gets absorbed as fact and cited by the next prep), the tier rules, how to run the checker, and why "I don't know" is a first-class answer. The exact pattern to mirror: docs/FAQ.md entries for tone; the v1.29.0 release notes have the problem statement. Acceptance: a docs/ page or FAQ section, linked from the README docs list. Comment /assign below to claim this issue.
Time: ~1-2h · Difficulty: Beginner · No-code — reserved for first-time contributors linkedin-join.mjs shipped in v1.29.0 and has no page under docs/: the release notes are currently the only prose about it. What the page should cover: how to export your LinkedIn connections CSV, where to place it, how to run the join, and the privacy properties worth stating plainly (no network, no writes, no model calls; the CSV stays gitignored and disposable; the join's OUTPUT does reach your CLI's context when you ask the agent to run it — DATA_CONTRACT.md's data/Connections.csv row has the exact wording to mirror). The exact pattern to mirror: any short guide in docs/ (e.g. RUNNING_ON_A_BUDGET.md for tone: concrete commands, no marketing). Acceptance: docs/LINKEDIN_JOIN.md (or a better name you argue for), linked from the README docs list. Comment /assign below to claim this issue.
Time: ~1-2h · Difficulty: Beginner (Node, no framework) Every provider under providers/ has a test file in tests/providers/ except local-parser.mjs. It parses locally saved job pages, so its tests need no network: fixtures in, parsed postings out. The exact pattern to mirror: any existing tests/providers/*.test.mjs (e.g. recruitee.test.mjs) — plain Node, pass/fail helpers from tests/helpers.mjs, auto-discovered by test-all.mjs with no registration. docs/local-parser-cookbook.md describes the expected behavior to assert. Acceptance: a tests/providers/local-parser.test.mjs covering the exported entry point with at least one realistic fixture and one negative control, node test-all.mjs green. Comment /assign below to claim this issue.
Time: ~2-4h · Difficulty: Beginner · Requires: native/fluent Polish — reserved for first-time contributors The interview modes (modes/interview/plan.md, practice.md, debrief.md) exist in 9 locales but not yet in Polish (modes/pl/ has the evaluation modes, not interview/). The exact pattern to mirror: PR #3212 (Ukrainian, merged today). Three things it got right that made it merge without a single change requested: Keep [inferred] and [inferred from JD] as English machine-readable tokens, with a Polish gloss alongside if helpful Register modes/pl/interview/ in the SYSTEM_PATHS list of update-system.mjs (one line, mirror the modes/ru/interview/ entry) Translate the anti-fabrication rules faithfully: the prohibition is absolute and admits no qualifier Acceptance: the three files under modes/pl/interview/, the SYSTEM_PATHS line, and node test-all.mjs green. Comment /assign below to claim this issue.
Description When hovering over the copy button on the Meshery CLI page, the “Copy to clipboard” tooltip keeps flickering. Expected Behavior The “Copy to clipboard” tooltip should appear normally and stay stable when hovering over the copy button. Screenshots hover-flicker.mp4 Environment: OS: Mac Linux Windows Browser: Chrome Safari Firefox Version: Device: Desktop Mobile Contributor Guides and Handbook The meshery.io website uses Jekyll and GitHub Pages. Site content is found under the master branch. 📚 See the Contributing to Meshery.io Website section of the readme.md and other contributing instructions, too. 🎨 Wireframes and designs for Meshery UI in Figma (open invite) 🙋🏾🙋🏼 Questions: Discussion Forum and Community Slack 📺 Self-paced Contributor Trainings
Current State of the Meshery.io site When navigating the designs or models pages on small devices, the filter section can be difficult to use and interact with. The current UI/UX is not as intuitive as it could be, making it harder for users to navigate and apply filters efficiently. Desired State of the Meshery.io site Improve the filter section on small devices to make it cleaner, more intuitive, and easier to navigate and interact with. Contributor Guides The meshery.io website uses Jekyll and GitHub Pages. Site content is found under the master branch. 📚 See the Contributing to Meshery.io Website section of the readme.md and other contributing instructions, too. 🎨 Wireframes and designs for Meshery UI in Figma (open invite) 🙋🏾🙋🏼 Questions: Discussion Forum and Community Slack 📺 Self-paced Contributor Trainings
Description https://www.tumblr.com/engineering/825845466763837440/now-in-labs-full-screen-messaging-on-web Full-screen messaging: it's great; I probably would want to use it, at minimum, the vast majority of the time. Completely replacing current messaging with it would probably be a bit of a niche toggle for Tumblr to add (though I did comment suggesting this); I can't deny that there's legitimate utility in being able to use the traditional bubble system sometimes, so making the messaging sidebar item go straight to /messages is kind of a power user thing. That's what XKit tweaks are for, though, right? Note that full screen messages is a labs feature, but that I can tell, the labs toggle just adds the button to actually go to /messages; the route works fine either way. So if this were a tweak, it wouldn't actually have to check if the labs feature is enabled. (If the feature were removed from the site, it would be bad, though, and being a labs feature is presumably intended as a sig
We ship country-focused connectivity lists (Iran, Russia, China, Brazil, India…) and we want more — but only a local knows which sites actually matter. If your country isn't covered yet (and doesn't have its own open issue, like #449 / #450 / #451) and you know its internet well, this issue is yours. Same recipe as #405: pick an id and flag emoji for your country, ≥10 members mixing global services relevant locally with major domestic platforms, names in every full locale pack (en, zh, fr, pt-BR, ru), favicons committed via pnpm fetch-favicons. One country per PR. pnpm check green; comment to claim your country (so two people don't build the same list); PR targets dev.
We ship country-focused connectivity lists (Iran, Russia, China, Brazil, India…) so people can quickly check which services matter for that country. Mexico is Latin America's second-largest internet market and only Brazil is covered so far — if you're familiar with the Mexican internet, you know better than we do which sites matter. Same recipe as #405: id: 'mexico', emoji 🇲🇽, ≥10 members mixing global services relevant locally with major Mexican platforms (e.g. Mercado Libre México, Liverpool, Coppel, El Universal, gob.mx, Rappi…), names in every full locale pack (en, zh, fr, pt-BR, ru), favicons committed via pnpm fetch-favicons. pnpm check green; comment to claim; PR targets dev.
We ship country-focused connectivity lists (Iran, Russia, China, Brazil, India…) so people can quickly check which services matter for that country. Nigeria is Africa's largest internet market and we have nothing for it — if you're familiar with the Nigerian internet, you know better than we do which sites matter. Same recipe as #405: id: 'nigeria', emoji 🇳🇬, ≥10 members mixing global services relevant locally with major Nigerian platforms (e.g. Jumia, Konga, Nairaland, Punch, OPay, Paystack…), names in every full locale pack (en, zh, fr, pt-BR, ru), favicons committed via pnpm fetch-favicons. pnpm check green; comment to claim; PR targets dev.
We ship country-focused connectivity lists (Iran, Russia, China, Brazil, India…) so people can quickly check which services matter for that country. Indonesia is one of the world's largest internet markets and we have nothing for it — if you're familiar with the Indonesian internet, you know better than we do which sites matter. Same recipe as #405: id: 'indonesia', emoji 🇮🇩, ≥10 members mixing global services relevant locally with major Indonesian platforms (e.g. Tokopedia, Gojek, Traveloka, Bukalapak, Kompas…), names in every full locale pack (en, zh, fr, pt-BR, ru), favicons committed via pnpm fetch-favicons. pnpm check green; comment to claim; PR targets dev.
Part 3 of 4 — single-source-of-truth registry refactor Evidence: #251. Parts so far: #253 (completions), #254 (registry merge). This issue fixes the dead doc-generation pipeline. Problem scripts/generate-readme.js was introduced in #188 with a token system ({{AGENT_COUNT}}, {{VERIFIED_COUNT}}, {{PACKAGE_SIZE}}, ...). But the same PR committed the files with tokens already resolved to literals. Today: grep -r '{{' README.md docs/comparison.md benchmark/RESULTS.md → 0 matches The generator reads each file as its own template, finds no tokens, and writes the file back unchanged — a no-op The "sync" tests in src/agents/manifest.test.js (README.md matches generated content from manifest tokens) therefore compare a file against a token-replacement of itself and can never fail Net effect: when the agent count changed 86 → 87 in #251, ~11 documentation files had to be hand-edited, which is exactly what #188 was built to prevent. Suggested approach Re-introduce {{AGENT_COUNT}}, {{VER
Part 2 of 4 — single-source-of-truth registry refactor Evidence for the cost of the current split: #251 (adding one agent touched 18 files). Part 1: #253 (completions). This issue merges the two data sources. Problem Today an agent's data lives in two files that must be kept consistent by hand: File Holds Keyed by src/agents.js (AGENTS_DATA) flag, name, skill dir resolver, label array entry src/agents/manifest.js (MANIFEST_DATA) support level, MCP format/path, instruction format, docUrl, lastVerified, notes, aliasFor agent name manifest.js already imports and iterates AGENTS_DATA, so nothing conceptually separates them — it is purely a historical split. Consequences: Adding/verifying an agent means editing both files with matching keys; a typo in the name key silently falls back to EXPERIMENTAL defaults (there is no cross-validation) MCP_SUPPORTED is a third place listing flags, duplicating what MANIFEST_DATA[*].mcpSupport.supported already expresses The manifest fallb
Part 1 of 4 — single-source-of-truth registry refactor Adding oh-my-pi (omp) support in #251 required touching 18 files for what is conceptually one data row. This issue is the first, lowest-risk step of eliminating that duplication. Companion issues cover the registry merge, the token pipeline, and doc count literals (links added as they are filed). Problem src/commands/completions.js hardcodes every agent flag in three places: SCOPE_FLAGS array (~87 entries) used by the bash completion The zsh script template: one '--flag[Also install to <dir>]' \\ line per agent The fish script template: one complete ... -l flag -d 'Install to <dir>' line per agent Every new agent requires editing all of these by hand. In #251 we added omp and had to touch zsh + fish blocks manually; bash got the flag automatically via SCOPE_FLAGS (also manual). Meanwhile bin/rolecraft.js already derives flags dynamically: agents.map((a) => `--${a.flag}`) // help text so the CLI itself does NOT need edits when a
Problem rolecraft remove <skill> only deletes the skill from ~/.agents/skills/ and ./.agents/skills/, regardless of which agent directories the skill was actually installed to. When a skill is installed with a per-agent flag (--claude, --pi, --omp, --cursor, ...), the lockfile entry is removed but the files stay on disk in that agent's skills directory. Steps to reproduce # 1. Install a skill targeting omp rolecraft install ./my-skill --omp ls ~/.omp/agent/skills/my-skill # exists ✓ # 2. Remove it rolecraft remove my-skill # reports success # 3. Files are still there ls ~/.omp/agent/skills/my-skill # still exists ✗ Same happens with any non-default target: --pi (~/.pi/agent/skills/), --claude (~/.claude/skills/), --tabnine (~/.tabnine/agent/skills/), etc. Expected behavior After remove, every directory recorded for the skill in the lockfile should be cleaned up. The lockfile already stores the target flags per skill: { "my-skill": { "agents": ["omp"], ...
it's a hidden feature of youtube; webbrain already takes care of it but it's gotta be in dev mode so the suggestion action button should take care of it too, switch to dev mode (aka enable js) and perhaps write an adapter for weaker models to run this: { "code": "return (()=>{ const v=document.querySelector('video'); if(!v) return {found:false};\n // ensure loop stays on even if YouTube resets it\n if(!window._ytLoopInterval){\n window._ytLoopInterval = setInterval(()=>{ if(!v.loop) v.loop=true; }, 1000);\n // also handle ended via YouTube player API if available\n v.addEventListener('ended', ()=>{ v.currentTime=0; v.play().catch(()=>{}); });\n // try YouTube player API loop\n try{\n const player = document.querySelector('#movie_player');\n if(player && typeof player.setLoop === 'function') player.setLoop(true);\n }catch(e){}\n }\n return {found:true, loop:v.loop, intervalSet: !!window._ytLoopInterval, paused:v.paused, duration:v.duration};\n})();" } Result {"suc
there is no option to define/render a favicon in the browser tab, is it?
Is there a specific app this action is for? Google Slides
Top JavaScript Repositories with Beginner Issues (20)
Updated Daily via GitHub GraphQLNeo.mjs is a self-evolving software organism: a professional end-to-end AI engineering team whose cross-model swarm inhabits live apps via Neural Link, Active Hybrid GraphRAG, DreamService, and self-healing loops.
Skill that audits and rewrites content to remove AI writing patterns. Use it with your favorite agents including Claude Code, OpenClaw, Codex, and Hermes.
CLI security scanner built for the agentic era. Detects CI/CD misconfigs, agent permission risks, MCP tool injection, hardcoded secrets, and DMCA-flagged AI dependencies.
Open-source, local-first video editor where creators and AI agents edit the same real timeline.
Browser plugin for Linux to SSO on Microsoft Entra ID using a locally running microsoft identity broker (Intune).
Project Sidewalk web page
Meet Coco. A superintelligent agent framework powered by an advisory board of 389 world-class minds. Scale your AI assistant into a complete engineering department with 142 skills, 277 commands, and persistent state. Universal compatibility. Local privacy. Free and open source.
Open-source AI browser agent for Chrome and Firefox (monorepo) 🧠
The official Foundry VTT implementation of the Daggerheart system
Eventra is a comprehensive event management system that empowers organizers to create, manage, and track events seamlessly. Built with a modern tech stack featuring React frontend and Spring Boot backend, Eventra provides everything needed to run successful events from creation to post-event analytics.
Your own personal YiDA AI assistant!
A vanilla JS customisable select box/text input plugin ⚡️
Une extension pour navigateur qui permet de lire les articles de presse en ligne sur le compte de bibliothèques ayant souscrit à europresse
Your day, at a glance
适用于在线评测系统(Online Judge)的Tampermonkey脚本,增强功能与界面。
Open database of 3,400+ CCTV camera specs across 77+ brands — searchable, filterable, CC0
📑 Collabora Online for Nextcloud
🗨️ Nextcloud Talk – chat, video & audio calls for Nextcloud
Cardano.org is the primary online resource for the Cardano community.
The web-based visual programming editor.
How to make your first JavaScript open-source pull request
Finding approachable Good First Issues in JavaScript 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 JavaScript
Free weekly email, scoped to JavaScript. No account needed - confirm once and unsubscribe anytime.