Crystal good first issues

30 open Crystal issues currently match the default 10+ star filter. Scored difficulty: 5,943 at 1/5, 8,784 at 2/5, 12,682 at 3/5, 12,097 at 4/5, 857 at 5/5. This hub uses the same feed as the homepage, limited to repositories whose GitHub language is Crystal.

All languages · Browse projects · How to find good first issues · Hacktoberfest 2026

Active projects

Unique repos with open help-wanted issues updated in the last 30 days

Showing 30 of ~30 matching filters (Crystal · 10+ stars)

List

`config init` and first-run config creation fail when `~/.config` does not exist (non-recursive `Dir.mkdir`)

AI summary

The `noir config init` command and other commands that create configuration files fail when the `~/.config` directory does not exist. This is because the `Dir.mkdir` function used is not recursive, preventing the creation of the necessary nested directories. The fix involves using a recursive directory creation method like `Dir.mkdir_p`.

🐞 bug⛱️ configgood first issue
1.3K
Difficulty
2/5

Horizontal tables render with unexpected top borders.

AI summary

This issue reports a bug where horizontal tables in the console component are rendering with unintended top borders for specific styles like 'box', 'double-box', and 'markdown'. Other table styles, such as 'borderless' and 'compact', do not exhibit this problem.

kind:bugcomponent:consolegood first issue
238
Difficulty
2/5

Parser accepts keywords as variable names in `TypeDeclaration`

AI summary

The parser incorrectly allows keywords like 'nil', 'true', 'false', and 'def' to be used as variable names within type declarations. This is a bug because these keywords are invalid identifiers and lead to unexpected behavior and errors when attempting to use these declared variables.

kind:buggood first issuehelp wantedtopic:compiler:semantic
20.3K
Difficulty
2/5

Send minecraft:brand in plugin channel

AI summary

This issue proposes implementing the sending of the `minecraft:brand` payload through plugin channels in the Rosegold project. This involves protocol-level work to ensure correct packet IDs and field layouts for various Minecraft versions, sending the payload at the appropriate game lifecycle point, and verifying its implementation with byte-level serialization and integration tests.

help wantedgood first issue
28
Difficulty
4/5

Add player radar

AI summary

This issue proposes adding a player radar feature, but the CivMC policy prohibits exposing entity data to bot logic. The implementation should focus on using server-provided tab-list information and avoid any features that could be used for bot automation or external program functionality.

help wantedgood first issue
28
Difficulty
3/5

Spark Java detector matches Apache Spark imports like `org.apache.spark.SparkConf`

AI summary

The Spark Java detector incorrectly identifies Apache Spark data processing jobs as the Spark Java web framework due to a simplistic substring match. The issue proposes using a more precise regular expression to distinguish between the two, ensuring accurate detection of the Spark Java web framework.

🐞 bug🔎 detectorhacktoberfestgood first issuejava
1.3K
Difficulty
2/5

Add detector unit specs for Bottle, Quart, Robyn, Javalin, Dropwizard, Micronaut and Quarkus

AI summary

This issue requests the addition of unit test specifications for several Python and Java web framework detectors. The goal is to create spec files that verify the functionality of these detectors, ensuring they correctly identify the presence of Bottle, Quart, Robyn, Javalin, Dropwizard, Micronaut, and Quarkus in codebases. The issue provides examples of the expected file structure and test case format.

🔎 detector💊 spechacktoberfestgood first issuejava
1.3K
Difficulty
2/5

Add detector unit specs for seven Go frameworks (Hertz, Huma, GoFrame, Goyave, go-restful, Connect, PocketBase)

AI summary

This issue requests the addition of unit test specifications for seven Go framework detectors. The goal is to create spec files for Hertz, Huma, GoFrame, Goyave, go-restful, Connect, and PocketBase, mirroring the structure of existing Go detector specs. Each new spec should include at least one positive and one negative test case to ensure the detectors accurately identify the presence of these frameworks.

🔎 detector💊 spechacktoberfestgood first issuego
1.3K
Difficulty
2/5

Remove always-true `size > 0` guards in `nestjs.cr`

AI summary

This issue requests the removal of redundant `size > 0` checks in the `nestjs.cr` file. These checks are always true because `String#scan` with a block always returns a `Regex::MatchData` object, which has a size of at least 1. The task involves simplifying conditional statements and trailing conditions in the specified file.

🔬 analyzerhacktoberfestgood first issuejavascript
1.3K
Difficulty
1/5

Remove always-true `match.size > 0` guards in `tanstack_router.cr`

AI summary

This issue proposes removing redundant `if match.size > 0` checks in the `tanstack_router.cr` file. These checks are always true because `String#scan` with a regex always returns a `Regex::MatchData` object with a size of at least 1. The task involves deleting these unnecessary guards and their corresponding `end` keywords.

🔬 analyzerhacktoberfestgood first issuejavascript
1.3K
Difficulty
1/5

[Enhancement] Replace Reddit/Instagram/Twitter/Wikipedia... links with privacy friendly alternatives (if configured)

AI summary

This enhancement request proposes allowing users to configure Invidious to use privacy-friendly alternatives for external links like Reddit, Instagram, Twitter, and Wikipedia. Currently, Invidious links directly to these services, which can compromise user privacy. The proposed solution is to enable users to choose between the original service, or a privacy-focused instance like Teddit or Libreddit.

enhancementgood first issueblockedbountybounty:30$
20.8K
Difficulty
2/5

[Bug] Multiple users cannot subscribe to the same playlist

AI summary

This bug prevents multiple users from subscribing to the same playlist. When a second user attempts to subscribe, a 'duplicate key value violates unique constraint' error occurs, indicating a database-level issue with how playlist subscriptions are being handled. This suggests a problem with the uniqueness constraint on the playlist subscription mechanism.

buggood first issuestaletype:database
20.8K
Difficulty
3/5
kemalcr/kemal

HTTP/2 Support

AI summary

This issue proposes adding experimental HTTP/2 support to the Kemal web framework. While Crystal's standard HTTP server defaults to HTTP/1.1, HTTP/2 offers significant performance benefits. The issue highlights an existing native HTTP/2 implementation for Crystal and provides a working example, though it notes a current limitation in the `http2` shard.

help wanted
3.9K
Difficulty
3/5

Disallowing expectation matches outside specs

AI summary

This issue proposes to make the detection and handling of expectation matches outside of spec examples a built-in feature of the `Spec` module. Currently, such occurrences can lead to unhandled exceptions that halt spec execution. The goal is to provide a more structured output and prevent these unexpected failures.

kind:featuregood first issuetopic:stdlib:specs
20.3K
Difficulty
3/5

Remove always-true `match.size > 0` guards in `koa.cr`

AI summary

This issue proposes removing redundant `match.size > 0` checks within the `koa.cr` analyzer. These checks are always true because `Regex::MatchData#size` will always be at least 1, as demonstrated by the provided example. The goal is to simplify the code by deleting these unnecessary guards without altering the output of endpoint and parameter extraction.

🔬 analyzergood first issue
1.3K
Difficulty
1/5

Rename `golang_spec.cr` to match the `*_lexer_spec.cr` naming in minilexer/

AI summary

This issue proposes renaming the `golang_spec.cr` file to `golang_lexer_spec.cr` to align with the naming convention of other lexer specification files within the `spec/unit_test/minilexer/` directory. The goal is to maintain consistency and alphabetical ordering with other spec files, without altering the source file or its require paths.

💊 spec🥢 mini-lexergood first issue
1.3K
Difficulty
1/5

Remove always-true `match.size > 0` guards in `express.cr`

AI summary

This issue proposes removing redundant `match.size > 0` checks within the `express.cr` file. These checks are always true because `Regex::MatchData#size` will always be at least 1. The task involves deleting these unnecessary guards and adjusting the code structure accordingly, ensuring no functional changes to endpoint or parameter output.

🔬 analyzergood first issue
1.3K
Difficulty
1/5

Remove always-true `match.size > 0` guards in `restify.cr`

AI summary

This issue proposes removing redundant `match.size > 0` checks in the `restify.cr` file. These checks are always true because `Regex::MatchData#size` will always be at least 1, as it includes the full match. The goal is to simplify the code without changing its functionality or output.

🔬 analyzergood first issue
1.3K
Difficulty
1/5

[Bug] HMooneyPot alias

AI summary

The user wants to add 'HMooneyPot' as an alias for 'Invidious' within the `src/invidious.cr` file. This change is considered potentially difficult due to its impact on a core file and has a bounty attached.

buggood first issuebountybounty:50$
20.8K
Difficulty
3/5

Proper implementation of `sslmode=verify-full`

AI summary

This issue proposes implementing `sslmode=verify-full` for database connections, particularly for users connecting to Azure and CockroachLabs databases using the `cleartext` authentication method. The goal is to enhance security by ensuring full SSL certificate verification for these common use cases.

help wanted
480
Difficulty
3/5

Large (~13.8kb) HTTP gzip responses aren't decompressed

AI summary

A bug report indicates that Crystal's HTTP client fails to automatically decompress gzip responses larger than approximately 13.8kb. The issue occurs when the server sends a gzipped response, and the client expects automatic decompression, but instead receives raw binary data for larger payloads.

help wantedtopic:stdlib:networking
20.3K
Difficulty
3/5

Add a functional tester for the Vercel specification analyzer

AI summary

This issue requests the addition of a functional tester for the Vercel specification analyzer. Currently, Vercel is the only analyzer lacking an end-to-end functional test, which verifies the detector, analyzer, and endpoint list on a real `vercel.json` file. The task involves creating a new fixture file and a corresponding tester file, modeled after existing Netlify tests.

💊 specgood first issue
1.3K
Difficulty
2/5

Use `unless x.nil?` instead of `if !x.nil?` at the six remaining plain sites

AI summary

This issue requests a code refactoring to replace `if !x.nil?` with the more idiomatic `unless x.nil?` in six specific locations within the codebase. This change is a straightforward syntactic improvement and does not alter the program's logic or behavior. The issue explicitly excludes compound conditions and `elsif` statements from this task.

💡 enhancementgood first issue
1.3K
Difficulty
1/5

Add a spec for the shared `PrefixScope.prefix_covers?` tagger helper

AI summary

This issue proposes adding a dedicated unit test for the `prefix_covers?` helper function within the `PrefixScope` module. Currently, this function's behavior is only tested indirectly through its usage in various framework taggers. The goal is to create a standalone spec file to directly verify its logic, particularly its handling of edge cases like partial string matches.

💊 specgood first issue
1.3K
Difficulty
1/5

Add the four missing `--set-pvalue-*` rows to the v1 flag-consolidation table

AI summary

This issue requests the addition of four missing rows to a documentation table that maps v1 CLI flags to their v0 equivalents. The missing rows pertain to the `--pvalue` family of flags, specifically for the `cookie`, `form`, `json`, and `path` types, which are currently not documented in the flag consolidation table.

📑 documentationgood first issue
1.3K
Difficulty
1/5

Document the `--no-spinner` flag in the Running page flag table

AI summary

This issue requests the documentation of the `--no-spinner` flag for the `noir scan` command. The flag is functional but missing from the "Running" page's flag table on the documentation site. The task involves adding a new row for this flag to the English and Korean versions of the "Running" page's flag table.

📑 documentationgood first issue
1.3K
Difficulty
1/5

Use `Hash#has_value?` instead of `.values.includes?` in the JS and Ktor extractors

AI summary

This issue proposes replacing inefficient `Hash#values.includes?` calls with the more performant `Hash#has_value?` method in the JavaScript and Ktor extractors. This change aims to optimize performance by avoiding unnecessary array allocations within loops, as `Hash#has_value?` provides a direct and efficient way to check for value existence. The issue explicitly excludes one instance where `region.values` is an Array, for which `.includes?` is the correct method.

💡 enhancementgood first issue
1.3K
Difficulty
1/5

`Token#to_s` rewrites the token’s own `value` as a side effect

AI summary

The `Token#to_s` method currently modifies the token's internal `@value` by escaping newlines and tabs, which is an unintended side effect for a formatting method. The fix involves computing the display form locally without altering the original `@value` and adopting the idiomatic Crystal `to_s(io)` signature.

🐞 buggood first issue
1.3K
Difficulty
2/5

Move the php / csharp mini-lexer specs into spec/unit_test/minilexer/

AI summary

This issue proposes to correct the location of two spec files for PHP and C# lexers. Currently, `php_lexer_spec.cr` and `csharp_lexer_spec.cr` are located in `spec/unit_test/miniparser/` instead of the correct `spec/unit_test/minilexer/` directory, following the project's structure convention. The fix involves a simple file move using `git mv`, with no changes required to the `require` statements within the files.

💊 specgood first issue
1.3K
Difficulty
1/5

Also browsing: Python , TypeScript , JavaScript