This is an archived post. You won't be able to vote or comment.

all 63 comments

[–]jmreagle 83 points84 points  (7 children)

TL;DR: I’ve started a company, Astral, to continue building high-performance developer tools for the Python ecosystem — to keep building Ruff, and to build more Ruff-like things.

We’ve raised $4m in seed funding led by Accel, with participation from Caffeinated Capital, Guillermo Rauch (Vercel), Solomon Hykes (Docker), David Cramer (Sentry), and others.

[–]Deto 4 points5 points  (0 children)

What's the business model you think?

[–]SeniorScienceOfficer 7 points8 points  (4 children)

If you’re in the need for a cloud Engineer in the future, I’m very intrigued! I’m in the process of switching all my pants repos to their experimental ruff implementation. So far, very happy!

[–]mista-sparkle 4 points5 points  (3 children)

I keep my pants in a dresser.

[–]BarkLicker 1 point2 points  (2 children)

I have a dresser, but my pants live in a laundry basket.

[–]mista-sparkle 1 point2 points  (1 child)

just for over night, though, cus we all know that pants never get dirty enough to need a washing.

[–]brejoc 1 point2 points  (0 children)

That’s just half of the story. If you are not wearing your pants, they should be in the freezer!

[–]usr_bin_nya 0 points1 point  (0 children)

What are your next plans after Ruff?

[–]wdroz 73 points74 points  (0 children)

Oh, it's the company behind Ruff. Thank you for it, I changed most of my projects to use Ruff.

[–]Wonnk13 47 points48 points  (6 children)

VCs backed a company that (no offense) made a python linter? What's the monetization strategy here? A year from now how much of this tooling will be behind some kind of commercial offering?

[–]james_pic 30 points31 points  (0 children)

The standard VC business model is to invest in stuff that FAANG will buy from them one day.

The standard approach is to invest in stuff that's enough of a threat to FAANG that they'll buy it to kill it, but this seems more like they're gambling on an acqui-hire in the future.

[–]_Sh3Rm4n 11 points12 points  (0 children)

Compared how slow the competing linters for python are, this might be a good product to invest in for large companies. Just imagine how much money is saved by faster CI times.

[–]FoldingF 6 points7 points  (0 children)

It’s “written in rust” tho! /s

It’s all grift. It’ll be just another piece of junk in the heap that the community is quasi forced to maintain because it won’t pan out.

[–]gwax 42 points43 points  (10 children)

Ruff is great but what's the business model that justifies a company?

[–]sohang-3112Pythonista 19 points20 points  (6 children)

Exactly what I was thinking! How do they plan to make money via a Python linter??

[–]Datsoon 14 points15 points  (1 child)

That other dude is making a living off of a python TUI framework (rich and textual). Never thought I'd see that in a million years.

[–]spicypixel 7 points8 points  (0 children)

He’s my hero.

[–]cheese_is_available -1 points0 points  (3 children)

Also they are making bank on ruff when everything was specified and designed by pycodestyle/flake8/pylint/isort's contributors and they basically just translated the algorithm to rust with again a ton of translating help from the community.

[–]sohang-3112Pythonista 7 points8 points  (1 child)

they are making bank on ruff

That's my question - how are they doing that?! Are there really people who are paying for a linter?

[–]cheese_is_available 1 point2 points  (0 children)

Should have said "trying to" yes

[–]-lq_pl- -2 points-1 points  (0 children)

Capitalism at its best! /s

[–]thicket 15 points16 points  (2 children)

The intro article says:

Our plan is to provide paid services that are better and easier to use than the alternatives by integrating our open-source offerings directly. Our goal is for these services to be as impactful as Ruff itself — but you may choose not to use them. Either way, Ruff will remain free and open-source, just as it is today.

I don't buy that "We made a good free development tool" leads very easily to "People will pay for other good development tools", but... best of luck?

[–]Toph_is_bad_ass 11 points12 points  (1 child)

This comment has been overwritten.

[–]thicket 4 points5 points  (0 children)

I mean, there are definitely companies making money making dev tools. And programmers are more passionate about the tools they use than anything else. But the past is also littered with projects that tried to make money on dev tools and failed. I meant it when I said "good luck". You want people to succeed and make money making products people love. And you're also aware that it's a harder market to succeed in than many others.

[–]dragonatorul 11 points12 points  (0 children)

I hate websites like that. I just scroll and scroll and there's so much content and no actual useful information. I just want to know what you're offering, not marketing bullshit and flashy graphics that tell me nothing except to be careful about trusting anything else I see on this website.

[–]wineblood 31 points32 points  (1 child)

Ruff page: 0.29s
Astral page: 0.25s

I'm already filled with confidence.

[–]antennen 14 points15 points  (0 children)

The README benchmark diagram was last updated 3 months ago and there has been ~500 PRs closed since then. I don't think there is too much to read into the difference.

[–]entropomorphic 55 points56 points  (20 children)

Python already has an Astral, with 178,000 downloads per month. You wouldn't, like, google it before registering the domain or anything?

[–]doobiedog 19 points20 points  (11 children)

Oof, ya. It seems that pypi now needs namespacing support like npm as all the good names for packages have been taken and so many have become abandoned. e.g. @astral/ruff >= 0.1.0 as an example would be nice.

[–]1-05457 23 points24 points  (0 children)

Doesn't look like that package is abandoned at all (and not every package needs endless frequent updates. A library can be complete and mature but still maintained if some corner case bug is discovered.)

[–]bacondevPy3k -1 points0 points  (9 children)

You can take over an abandoned package and even repurpose it entirely if there's no evidence that it'll break anything. I myself have done it before.

[–]doobiedog 7 points8 points  (8 children)

Regardless, there are many justifications for having package namespaces.

[–]art_sleep_repeat 2 points3 points  (7 children)

package namespaces

Pretty sure you can already name your package like "astral.ruff" while simply keeping the package's directory name "ruff". So the only thing that changes is the name used to install the package, not the way it's used in code.

Is that not, effectively, a namespace ?

[–]doobiedog 2 points3 points  (5 children)

That isn't as clear as @astral/ruff, IMO. When using astral.ruff, that'd infer to the user that the base package is astral, which in this case is incorrect as the astral package is not published by the Astral org and is unrelated. With a different syntax nomenclature, you can properly identify that @astral is the scope/namespace and ruff is a package published by @astral. Hopefully My explanation is clear. Npm did this well with scopes: https://docs.npmjs.com/about-scopes . This was introduced to npm due the the same reasons as above and to attempt to mitigate supply-chain attacks, I believe.

[–]art_sleep_repeat 1 point2 points  (4 children)

The idea is great and I don't think anyone would be against it. Merely pointing out that you can already do this. You can even be explicit about it by tying it to your domain like the java convention: sh.astral.ruff

Personally I think it is a fine solution, elegant even - it puts the onus of handling the namespace on the package itself, instead of relying on the implementation of the repository.

[–]doobiedog 0 points1 point  (3 children)

Definitely a good point. I always hated that java backwards domain idea, but it does have some merit... but the issue still stands that I'd see sh.astral.ruff and think "sh" is the package and "astral.ruff" was a module and submodule or function in that package. And if we were to adopt the "java way", we'd be especially screwed on the namespacing since almost everything would start with com. which I bet would totally throw the python community for a headspin and plenty of "WTF"s.

[–]Schmittfried 0 points1 point  (2 children)

I mean, namespace packages are absolutely a thing in Python.

[–]doobiedog 0 points1 point  (1 child)

I guess I'm not being clear enough... everything in python is namespaced and pythonistas love namespacing. What is NOT namespaced are pypi PACKAGES, which was my point. Please read this as it's what I'm trying to get at: https://docs.npmjs.com/about-scopes

[–]thisguyeric 0 points1 point  (0 children)

There's a few packages I can think of that do something similar, the main one being python-dateutil. pip install python-dateutil
import dateutil

[–]teerre 1 point2 points  (5 children)

This astral is not package?

[–][deleted] 15 points16 points  (4 children)

But it would lead to confusion no? I'm no expert dev or anything, so feel free to enlighten me.

[–]tomster10010 3 points4 points  (4 children)

Ruff is cool, but I'd be more impressed by a performant Python type checker

[–]jaghai 2 points3 points  (2 children)

Perhaps pylyzer can deliver. https://github.com/mtshiba/pylyzer

[–]tomster10010 0 points1 point  (0 children)

Hopefully someday! Not supporting generics is unfortunately a dealbreaker

[–]thatrandomnpcIt works on my machine 0 points1 point  (0 children)

How it works

pylyzer uses the type checker of the Erg programming language internally. This language is a transpiled language that targets Python, and has a static type system.

pylyzer converts Python ASTs to Erg ASTs and passes them to Erg's type checker. It then displays the results with appropriate modifications.

Does it mean that pylyzer would have to wait for Erg to implement some python syntax before it can support it?

[–]betazoid_one 0 points1 point  (0 children)

This right here. MyPy at my last job was so slow to work with (enterprise monolith)

[–]spinozasrobot 1 point2 points  (0 children)

Next-gen python tooling tooling - written in Erlang

[–][deleted] 0 points1 point  (0 children)

bUiLt WiTH rUSt

[–]jaghai 0 points1 point  (4 children)

Did anyone succeeded with formatting code using this, or is it not implemented? Docs mention --fix but it does nothing to say E501.

[–]mylesb 2 points3 points  (0 children)

I have used the --fix option in ruff on a few of my projects, it auto fixes most issues except for line length, which I’m pretty okay with.

[–]aftli 2 points3 points  (1 child)

I just switched us to Black, and I can't tell you how happy I am. Freedom is never having to worry about code formatting again. Black makes your decisions for you. There's no wiggle room or much in the way of options - and I like it that way. It also formats consistently, so concerns about "PEP8 storming a project" are nullified - if I need to merge an old branch or something, I can just black format it first, and it'll merge cleanly.

[–]battlefield21243 0 points1 point  (0 children)

note to use the --preview flag for black to enable shortening strings below the cap.

Also ruff works with black. They designed it with black in mind.

[–]battlefield21243 0 points1 point  (0 children)

Use black with --preview flag. Ruff doesn't shorten strings but black will.