Good First Issues in Elixir
Explore curated starter issues in high-scoring Elixir 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 Elixir 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)
Support scripts has no way to tell whether it was recently modified and what was modified, making it a little more difficult to debug issues. When a script results in an error, it sometimes leads to an investigation of whether the support script was changed/broken or if a device's firmware changed. But It would be nice to have: A section for "last edited at: " or something similar. A way to see previous versions of the support script, so rollbacks can be easy.
When writing support scripts, I am unsure if the script has errors until I actually try running it. To combat this, I tend to write the code on an IDE with a LSP/linter first, and then paste it in. It would be nice if I can get feedback in the app without having to leave it and open an IDE. This would make support scripts faster to write, and reduce the risk of a bad script reaching the device.
Currently when you reset password, it removes 2FA. That should be changed to requiring to input the 2FA code, if enabled
If a raw type banned phrase contains a 1, 3, 4, 5, 7, 8, 0, - or _ it will never match any text because those characters will be replaced by Teiserver.Helper.StringHelper.leet_replace before the text is passed to message_severity check in Teiserver.Chat.WordLib.blacklisted_phrase?. def blacklisted_phrase?(text) do text = StringHelper.leet_replace(text) # If it's a high severity match then yes it is blacklisted BannedPhrase.message_severity(text, :high) == :high end def leet_replace(title) do title |> String.downcase() |> String.replace("1", "l") |> String.replace("3", "e") |> String.replace("4", "a") |> String.replace("5", "s") |> String.replace("7", "t") |> String.replace("8", "b") |> String.replace("0", "o") |> String.replace("-", "") |> String.replace("_", "") end
Steps to reproduce: Go to any users admin page (teiserver/admin/user/) Click actions dropdown and select reset flood protection Not Found
New data expected for that event: beyond-all-reason/tachyon#150 so that client can know which state they're in wrt matchmaking.
Currently the page has an "Ignore users already banned" checkbox that filters already banned users. A similar checkbox is requested to ignore users that were assigned the "Trusted" role. Default enabled.
The current columns are "Name", "Domain", "Client", "Status", "Winrate", "Recents", "Play time", "games allied", "games vs", "mac", "sysinfo", "client", "hw1", "hw2", "hw3", "hw4", "ip", "Last login", "Registered". This is a request to allow sorting (re-ordering) the returned list by the columns "Name" (alphabetically), "Status", "Play time" (highest first), "games allied" (highest first), "games vs" (highest first), "mac", "sysinfo", "client", "hw1", "hw2", "hw3", "hw4", "Last login" (newest first, default sort), "Registered" (newest first). Sorting "Domain" by email domain (e.g. @gmail.com) would be useful but not necessary depending on the difficulty of implementation.
The current columns are "New user", "Status", "Last login", "Registered", "Duel", "FFA", "Team". This is a request to allow sorting (re-ordering) the returned list by the columns "New user" (alphabetically), "Last login" (newest first, default sorting), "Registered" (newest first)
Currently when reporting a friend, you're getting an message that you can not report a friend and that the report has not been submitted. The desired result should remove that limitation to allow the reporting of friends
Context We have used 3rd party code quality badges e.g. CodeClimate in the past. But haven't applied them to our Elixir projects ... until now! 🤷♂️ Example while reading: https://github.com/cesium/safira discovered via @ruilopesm & @nelsonmestevao 🫶 we see they have the following badge: prominently displayed: The action is: /cesium/safira/.github/workflows/style.yml Note: we are using credo in several projects e.g: mvp just not running the mix task on GitHub Actions or displaying a badge for "Code Quality". Todo ✅ Document the setup steps in a code-style.md file in this (/learn-elixir) repo. 📝 Create PR here in /learn-elixir 🆕 Add it to at least one repo, e.g: fields 🌻 Run the mix credo --all --strict on localhost to ensure it passes; 💻 Make any necessary changes. 🛠️ Add a flat-square badge to the repo. 🏷️ Create PR in the repo where the style.yml task is being added. Submit for review. 👀
There's no such thing as "free" Apps on Heroku anymore ... 🤦♂️ https://phoenix-content-negotiation.herokuapp.com/.json I don't have time to address this right now ... ⏳ But I am going to remove the link from the repo: Just so we aren't sending anyone there. 🚫 Todo Deploy a simple quotes app to Fly.io that displays a quote Curate a few unsplash backgrounds: https://unsplash.com/s/photos/nature-background e.g: https://unsplash.com/photos/green-mountains-and-green-trees-beside-river-under-blue-sky-during-daytime-vK26p2SFX3E https://unsplash.com/photos/green-trees-on-green-grass-field-under-blue-sky-and-white-clouds-during-daytime-OJ02cQHePds Stretch Goal: use tags to display a background image that is relevant to the quote.
Motivation We have the space there and it gives us a way to see everything at one glance as well as a possibility to jump to each one. Current UI Proposed UI
Running: SELECT count(*) AS exact_count FROM hits; We see: With 30M Rows. This query takes 244 seconds. ⏳ Running this query for each hit badge was crashing the server. 💔 But with the hit_count table in place, it's now not a burning issue 🔥 😥 priority-2 because the aggregation isn't crashing the server anymore and we can fix this with time. 🧑💻 🔍 Starting point: https://stackoverflow.com/questions/55018986/postgresql-select-count-query-takes-long-time
Getting the following error: 08:51:46 ** (exit) an exception was raised: 08:51:46 ** (Ecto.MultipleResultsError) expected at most one result but got 2 in query: 08:51:46 from h0 in Hits.HitCount, 08:51:46 (ecto 3.13.6) lib/ecto/repo/queryable.ex:166: Ecto.Repo.Queryable.one/3 08:51:46 (hits 1.7.14) lib/hits_web/controllers/hit_controller.ex:48: HitsWeb.HitController.index/2 08:51:46 (hits 1.7.14) lib/hits_web/controllers/hit_controller.ex:1: HitsWeb.HitController.phoenix_controller_pipeline/2 08:51:46 (hits 1.7.14) lib/hits_web/endpoint.ex:1: HitsWeb.Endpoint.plug_builder_call/2 https://fly.io/apps/hits/monitoring Should be quick to fix in the query. 🔍 BRB. 🧑💻
Part of the Graduations epic. Goal Validate raxol_symphony (pre-alpha) against a real Linear/GitHub repo, then reserve/cut its first Hex release. Context raxol_symphony is an OTP port of OpenAI Symphony: a tracker-driven coding-agent orchestrator (Orchestrator BaseManager polls Memory/Linear/GitHub, claims eligible issues, isolates each in a per-issue workspace, runs a coding agent to terminal state). Two runners (Runners.RaxolAgent, Runners.Codex), six surfaces via PubSub, evidence framework. Full description in CLAUDE.md (Symphony section) + HANDOVER.md. Scope Live validation against a real Linear / GitHub repo (drive real issues through to PRs). Orchestrator integration of the parallel GraphAdapter (workflow_mode: :graph_parallel); per-branch pause + compensate (see TODO.md "Symphony" open items). SSH worker dispatch (worker.ssh_hosts, one-worker-lifetime-per-host). Cache wiring for the Session-backed runner (~30 min, same opt-in pattern). Hex reservation/release once a live r
Part of the Graduations epic. Human-in-the-loop / funds required for the final live step. Goal Take raxol_acp (0.2.0, pre-alpha) to its first live Base-mainnet offering, then cut the first Hex release. Context raxol_acp is code-complete on the v2 hook/event model against the deployed Base contracts (v1 memo model retired). Full state in HANDOVER.md (top ACP entries) and CLAUDE.md. The single mainnet target is xochi_cross_chain_transfer (pure-relay storefront: raxol never touches transfer funds, takes an ACP fee; the buyer signs the Xochi intent, Riddler settles). Scope (an agent prepares; a human executes the funded steps) SCA :live_bundler end-to-end: real EntryPoint, empty-callData deploy sponsorship, installed? getter selector; SolverAgent-vs-Base-staging run (see TODO.md open items). Item-4 A-path live gate Base->Tron (needs funds + Riddler RELAY_GASLESS_PULL_ENABLED; ERC-3009 blocked on Riddler#159); verify checkpoint kill-and-resume. Graduate the offering: live run on Base ma
Part of the Hermes Fast-Follow P1 epic. Tag: Funnel. Small; precondition for the desktop app's attribution. Goal Close out the OpenRouter attribution funnel so Raxol appears on openrouter.ai/rankings and the desktop app can default to it. Design ROADMAP.md P1 "OpenRouter funnel" row + TODO.md (the one remaining #414 task): The :openrouter harness already sends app-attribution headers (HTTP-Referer, X-OpenRouter-Title, X-OpenRouter-Categories) via Backend.Selector / ExecutorConfig auth. Run the #414 live smoke with a real OpenRouter key (human-in-the-loop / key required). Confirm the openrouter.ai/apps?url=https://raxol.io listing appears. Bump raxol.io site copy to v2.6 / 14 packages (the #417 site work already merged as #418). Acceptance criteria :openrouter live smoke passes with a real key (captured as a :live_*-gated test / evidence) the openrouter.ai/apps listing for raxol.io is confirmed live site copy reflects v2.6 / 14 packages Effort: S. Priority: P1. References: Backen
Part of the Hermes Fast-Follow P1 epic. Tag: CATCH-UP. Pairs with the install-funnel PowerShell path. Goal Make native Windows first-class: tune the pure-Elixir driver, add Windows CI, and take the PowerShell installer path out of "preview". Design ROADMAP.md P1 "Windows first-class" row: Tune packages/raxol_terminal/lib/raxol/terminal/io_terminal.ex (the pure-Elixir driver used on Windows in place of the termbox2 NIF). Windows CI: drop the current Windows exclusions where the pure-Elixir path can actually run; keep NIF-only tests tagged. Finish the install.ps1 path from the install-funnel issue (Windows Burrito exe, pure-Elixir driver, %LOCALAPPDATA%\raxol, user PATH, no admin). Known noise to clear Windows undefined variable stdout noise from REPL.Evaluator.base_env/0 during Benchee runs (see TODO.md "Known noise"). Acceptance criteria the pure-Elixir driver renders the playground + a real app correctly on native Windows Windows CI runs the suite (pure-Elixir path) green; NIF-
Part of the Hermes Fast-Follow P1 epic. Tag: CATCH-UP. Small, self-contained. Goal mix raxol.import --from hermes|openclaw: let a user bring an existing agent config into Raxol in one command, lowering the switching cost. Design ROADMAP.md P1 "Migration on-ramp" row: Map SOUL.md -> a Raxol persona/prompt block. Import memories into Memory.Store (the Raxol.Agent.Memory behaviour; reuse Store.Ets / the P0-4 SQLite store). Import skills (the agentskills.io-format bundle from the paid-skills issue). Map allowlists -> PermissionHook (packages/raxol_agent/lib/raxol/agent/ permission hook). Acceptance criteria mix raxol.import --from hermes and --from openclaw parse the respective config layouts memories land in a Memory.Store and are recall-able; skills load; allowlists become PermissionHook rules round-trip tested against fixture configs (real files, no network) Effort: S. Priority: P1. References: packages/raxol_agent/lib/raxol/agent/memory/, permission hook, lib/mix/tasks/. House
Part of the Hermes Fast-Follow P1 epic. Tag: RAILS. Best built on top of the P0-4 raxol_skills extraction. Goal Make SKILL.md skills tradeable: discovered via ACP, escrowed, delivered, settled on Base. agentskills.io distributes; nobody clears -- that is the rails-native category. Design SPECS.md "Memory + skills learning loop" paid-skills note (lines 202-204) + "Commerce-rails wedge" step 2 (line 214): agentskills.io-format serializer for a SKILL.md bundle (the Curator/SelfImprove loop already authors these). Hub pull client to fetch skills from agentskills.io. Tradeable skill = a SKILL.md bundle + an ACP offering (packages/raxol_acp/): buyer discovers via ACP, escrows, receives the bundle, settles on Base via the seller stack + Xochi default. Acceptance criteria serializer round-trips a SKILL.md bundle to/from the agentskills.io format (property test) hub pull client fetches + verifies a published skill (in-memory fake hub in tests) a skill bundle is sold through an ACP offerin
Part of the Hermes Fast-Follow P1 epic. Tag: RAILS (the commerce wedge). This is the core of the "settlement, not subscription" thesis. Goal Replace the Nous Portal model (subscription resale; only Hermes users can spend) with per-call settlement any 402-speaking agent can use. Design SPECS.md "Commerce-rails wedge (P1-2)" (lines 206-218): Metered tool gateway: the four Portal categories (search, image, TTS, browser/transcribe) behind an axol-hosted service that answers HTTP 402 with an x402 challenge. Any agent auto-pays via AutoPay.attach (packages/raxol_payments/lib/raxol/payments/req/auto_pay.ex), settling same-chain via x402 or cross-chain via Xochi. Revenue = per-call markup + Xochi bps (0.10-0.40% tiered). The 402 path is I/O-bound, outside update/2 -> no frame-budget impact. Expose the creative-media actions (image / video / tts / transcribe) as the metered endpoints. Acceptance criteria an axol-hosted metered service answers 402 with a valid x402 challenge for each media a
Part of the Hermes Fast-Follow P1 epic. Tag: SURFACE. Precondition: the OpenRouter funnel smoke (sibling issue). Goal Ship raxol_desktop: a signed desktop app on all three OSes with zero new UI, reusing the entire LiveView surface. Design SPECS.md "Desktop app (P1-1)" (lines 176-184): Tauri shell over the LiveView surface with a Burrito'd BEAM sidecar (~10MB shell; sidecar shared with the P0-1 installer). Reuses the whole LiveView surface -> zero new UI. Rejected (do not revisit): native-webview (Elixir-Desktop; DIY packaging/signing), native BEAM GUI (wx/Scenic; throws away the LiveView surface, anti-moat). Attribution: default the bundled harness to :openrouter with the #414 app-attribution headers so every desktop user accrues to openrouter.ai/apps. Acceptance criteria raxol_desktop: Tauri shell launches the LiveView surface via a Burrito BEAM sidecar signed installers for macOS + Windows + Linux bundled harness defaults to :openrouter with attribution headers no new UI code
As noted in #355 the aggregation query (SELECT COUNT(*) FROM hits WHERE repo_id = 123) 💭 takes 2 MINUTES on a table with 30 Million Rows. ⏳ And is the reason the request/query time-out and crashes the server! 💔 So we're implementing hit_count 🆕 which is just an integer counter 1️⃣ to return millisecond responses again. 🏎️ 🏁 🎉 The problem is that we are temporarily ignoring the historical data in the hits table ... 🙄 But the data is not "lost" it's just in stasis. 💭 So ... Todo Create a batch job to go through the hit_count table and update count to reflect the aggregate from hits. 🧑💻 This must be done gradually to avoid crashing the server again. ⚖️ Once all records are updated, we can sunset this data migration script. 🌆 I expect writing the script to take around T1h and running it to take T1w ⏳ (Running the script once per minute to process a single record. 1440 runs per day. 10,000/week) Will work on this immediately after I h
TL;DR: Some power users find vutuv's web chat GUI cumbersome and would rather read and write direct messages from a native app (phone or desktop). This issue is an open invitation to discuss how we could offer that. We want to collect ideas, and everything is on the table, including changing or replacing the current DM system itself. No decision has been made; this is a request for comments. 🗣️ This is a discussion/RFC, not a finished plan. Please poke holes, add options we missed, argue for replacing things wholesale, or tell us an idea is bad. The goal is to find the approach that makes the most sense. The problem vutuv ("DM" = direct message) has an internal, web-based 1:1 chat. It works, but heavy users don't enjoy living inside a browser tab for messaging. They'd prefer a real native client: a fast mobile/desktop app with push notifications, the way they already use other messengers. The original spark for this issue was: "Could a user be reachable internally as username@v
To avoid race conditions due to config/modules selection based on environment variable manipulation we should add a Config module that will be in charge of loading values from environment IF they haven't been provided when calling it That middleware will then replace all application env calls so they safely be overriden by async tests We should probably phase this migration by starting with code implementation that are covered by async tests
If we update the volumes declaration on the docker container level, the path are being updated and this breaks the document reference. Consequently, the documents and chunks are still in the DB but they are being orphaned and unaccessible. When retrieving data these chunks can popup with broken source links and no way to clean them up. I suggest two things: have a way to review DB entries for documents and chunks (attached to documents whether they are in the filesystem or in an external data source) have an option to edit source fields for documents to fix them in batches
We should find an alternative for crawler ingest functionality and stop maintaining it: Excel to md Powerpoint to md Word to md PDF to md Image to md Web crawling
Both at a user level and instance level, can be useful when wanting to stop using, archive, or shut down a profile or entire instance. related to #1600
TL;DR Ship a complete Spanish (es) interface: Gettext catalogs, both email bodies per mail, and the places that still hardcode en/de. How: docs/architecture/i18n.md has the surfaces, the traps and the step-by-step checklist. Follow it; this issue only names what is specific to Spanish. Scale: 3,933 UI messages plus 69 error messages, 28 mails × 2 bodies, 2 help pages, 253 country names. Spanish-specific Numbers: Spanish groups thousands with . and takes , as the decimal mark, like German. delimited_count/1 currently splits de against everything else. Register: formal usted, matching the German Sie. Endonym for @language_names: Español. Done when choosing Spanish shows the UI, flashes, error pages and every transactional mail in Spanish, with Spanish number and date conventions rather than the English fallback. An AI agent wrote this text in my name. I know that is problematic.
Top Elixir Repositories with Beginner Issues (20)
Updated Daily via GitHub GraphQLvutuv is a social network. Think of it as a fast, secure and less annoying open-source alternative for LinkedIn, Facebook and X.
Middleware server for online gaming
Manage your Nerves device fleet, including firmware updates, health reports, and interactive device consoles.
Connect your people, tools and data with your custom AI agents. ZAQ is an open source collaborative and sovereign agentic operating system
Write one app, render it to a terminal, a browser, or as agent tools. The terminal for your Gundam.
Official Elixir Language Server Protocol implementation
Rendre disponible, valoriser et améliorer les données transports
Structured outputs, vectorization and tool calling for your Ash application
💬 Step-by-step tutorial creates a Chat App using Phoenix LiveView including Presence, Authentication and Style with Tailwind CSS
The Main application that provides the core interface via the glific APIs
:chart_with_upwards_trend: General purpose hits (page views) counter
Lightning ⚡️ is latest version of the OpenFn platform, a DPG and DPI building block that governments use to manage complex service/workflow automation and data integration projects.
Open-Source Network Management, Monitoring, ITOM, and Security Analytics
What if AI agents could form teams as fluidly as humans? Spawn specialists in milliseconds, share discoveries in real-time, review each other's work, and remember everything across sessions. Watch it all unfold in a live mission control UI. Open source.
Bonfire - tend to your digital life in community. Customise and host your own online space and control your experience at the most granular level.
:credit_card: Native elixir client for Braintree
:droplet: Learn the Elixir programming language to build functional, fast, scalable and maintainable web applications!
💬 a curated list of quotes that inspire action + code that returns quotes by tag/author/etc. 💡
:alarm_clock: Parse Cron Expressions, Compose Cron Expression Strings and Caluclate Execution Dates.
:watch: Cron-like job scheduler for Elixir
How to make your first Elixir open-source pull request
Finding approachable Good First Issues in Elixir 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 Elixir
Free weekly email, scoped to Elixir. No account needed - confirm once and unsubscribe anytime.