Nicheloom visits: 58,345 all-time · 7,637 in the last 7 days

The opportunity tracker for new startups.

Today: 1,008 launches · Niche of the day: specialized calculation tools · See what launched today →

Valid8r, Functional validation for Python CLIs using Maybe monads

Get picks like this daily. Today's launch numbers, the top launches, AI and tech news, and a daily opportunity pick, straight to your inbox.

Want to reach these readers? Sponsor an issue.

I built Valid8r because I got tired of writing the same input validation code for every CLI tool. You know the pattern: parse a string, check if it's valid, print an error if not, ask again. Repeat for every argument.The library uses Maybe monads (Success/Failure instead of exceptions) so you can chain parsers and validators: # Try it: pip install valid8r from valid8r.core import parsers, validators # Parse and validate in one pipeline result = ( parsers.parse_int(user_input) .bind(validators.minimum(1)) .bind(validators.maximum(65535)) ) match result: case Success(port): print(f"Using port {port}") case Failure(error): print(f"Invalid: {error}") I built integrations for argparse, Click, and Typer so you can drop valid8r parsers directly into your existing CLIs without refactoring everything.The interesting technical bit: it's 4-300x faster than Pydantic for simple parsing (ints, emails, UUIDs) because it doesn't build schemas or do runtime type checking. It just parses strings and returns Maybe[T]. For complex nested validation, Pydantic is still better. I benchmarked both and documented where each one wins.I'm not trying to replace Pydantic. If you're building a FastAPI service, use Pydantic. But if you're building CLI tools or parsing network configs, Maybe monads compose really nicely and keep your code functional.The docs are at https://valid8r.readthedocs.io/ and the benchmarks are in the repo. It's MIT licensed.Would love feedback on the API design. Is the Maybe monad pattern too weird for Python, or does it make validation code cleaner?---Here are a few more examples showing different syntax options for the same port validation: from valid8r.core import parsers, validators # Option 1: Combine validators with & operator validator = validators.minimum(1) & validators.maximum(65535) result = parsers.parse_int(user_input).bind(validator) # Option 2: Use parse_int_with_validation (built-in) result = parsers.parse_int_with_validation( user_input, validators.minimum(1) & validators.maximum(65535) ) # Option 3: Interactive prompting (keeps asking until valid) from valid8r.prompt import ask port = ask( "Enter port number (1-65535): ", parser=lambda s: parsers.parse_int(s).bind( validators.minimum(1) & validators.maximum(65535) ) ) # port is guaranteed valid here, no match needed # Option 4: Create a reusable parser function def parse_port(text): return parsers.parse_int(text).bind( validators.minimum(1) & validators.maximum(65535) ) result = parse_port(user_input) The & operator is probably the cleanest for combining validators. And the interactive prompt is nice because you don't need to match Success/Failure, it just keeps looping until the user gives you valid input.

HN · launched Nov 9, 2025 · 6 upvotes (top 73%) · 0 views

Niche: data and schema validation tools · 56 launches, 2 in the last 7 days ▼ -75% · Explore this niche →

Category and tags

  • Horizontal
  • Dev tools
  • Developer
  • Not AI
  • Hobby / open-source project

Visit website ↗ Source listing ↗

Could you build this?

Yes This is a small functional Python utility library implementing the Maybe/Result monad pattern for CLI inputs, easily generated by an AI assistant in a few prompts.

Discussion

No comments on this launch.

Competitors

Other products that read as similar to this one : 130 launches clear the similarity bar, closest 8 shown.

Attention rank: #105 of 131 (itself plus its competitors, highest first, normalized so YC and Product Hunt are compared fairly).

Launched 1 day after the earliest competitor.

The niche, labels, vibe code rating and competitor comparison on this page are analysis by Nicheloom. If you use them, please credit nicheloom.com. How you may use our data.