Changing Crate Categories

Are there any categories or subcategories that should be added on crates.io? Should any categories be split or merged?

You can see the list of categories here and their crates here.

To get some data, here are most popular keywords in each category:

  • algorithms = hash, algorithm, random, mathematics, math, sort, graph, numerics, rng, algorithms
  • api-bindings = api, gstreamer, audio, ffi, multimedia, gnome, database, amqp, video, gmp
  • asynchronous = async, futures, tokio, asynchronous, io, future, non-blocking, networking, http, concurrency
  • authentication = authentication, security, cryptography, password, serialization, web, encryption, jwt, crypto, merkle
  • caching = cache, caching, memoization, lazy, redis, lru
  • command-line-interface = cli, terminal, argument, color, clap, tui, parser, git, console, readline
  • command-line-utilities = cli, git, command-line, cargo, file, terminal, markdown, tool, search, command-line-tool
  • compression = compression, gzip, zlib, deflate, decompression, encoding, compress
  • concurrency = concurrency, parallel, thread, atomic, futures, lock-free, coroutine, mutex, threadpool, actor
  • config = config, configuration, json, yaml, toml, environment, dotenv, settings, env
  • cryptography = cryptography, crypto, hash, security, encryption, digest, block-cipher, password, curve25519, authentication
  • data-structures = data-structures, data-structure, vec, map, array, tree, vector, hashmap, container, graph
  • database = database, sql, nosql, postgres, lmdb, orm, postgresql, migration, client, graph
  • database-implementations = database, blockchain, storage, graph, search, bitcoin
  • date-and-time = time, date, calendar, cron, chrono, duration, schedule, float, periodic
  • development-tools = cargo, git, cargo-subcommand, kailua, cli, build, macro, testing, language, plugin
  • development-tools::build-utils = build, cargo, subcommand, cli
  • development-tools::cargo-plugins = cargo, subcommand, plugin, cargo-subcommand, tests, mobile, build, ios, android, cli
  • development-tools::debugging = logging, log, debug, logger, slog, elf, dwarf, binary, structured, file
  • development-tools::ffi = ffi, c, bindings, compiler, ios, objective-c, gnome, gstreamer, win32
  • development-tools::procedural-macro-helpers = syn, nom, proc-macro, derive, macro, enum, macros, reflection, type
  • development-tools::profiling = tests, benchmark, profiler, mobile, ios, android, cargo, timer
  • development-tools::testing = testing, test, mock, mocking, tdd, bdd, quickcheck, unit-test, property, tests
  • email = email, imap, mime
  • embedded = arm, cortex-m, stm32, embedded, svd2rust, embedded-hal-driver, no-std, hal, embedded-hal, no_std
  • emulators = emulator, interpreter, machine, learning, esolang
  • encoding = serde, serialization, encoding, json, base64, parser, encode, binary, decode, deserialization
  • external-ffi-bindings = ffi, bindings, wayland, dpdk, compositor, audio, networking, ffi-wrapper, cryptography, database
  • filesystem = filesystem, file, directory, fs, io, storage, path, fuse, archive, files
  • game-engines = gamedev, graphics, engine, 2d, sprite, game-engine, ai, ecs, gui, vector
  • games = game, chess, games, gamedev, vector, steam, cards, graphics, sprite, 2d
  • gui = gui, wayland, web, ui, graphics, asmjs, webasm, tui, javascript, window
  • hardware-support = arm, cortex-m, embedded-hal-driver, hal, stm32, serial, svd2rust, embedded-hal, hardware, embedded
  • internationalization = unicode, character-property, internationalization, localization, text, i18n, l10n, version, intl, grapheme
  • localization = localization, internationalization, l10n, i18n, intl, chinese
  • memory-management = allocator, memory, slab, pool, rc, alloc, box, no_std, malloc
  • multimedia = image, audio, gstreamer, multimedia, graphics, video, dsp, gnome, ffi, p2p
  • multimedia::audio = audio, sound, music, mp3, decoder, gamedev, signal, codec, midi, dsp
  • multimedia::encoding = audio, webm
  • multimedia::images = image, color, svg, rgb, bitmap, gif, jpeg, bmp, palette, png
  • multimedia::video = video, youtube, encoder, subtitle, hardware, animation
  • network-programming = networking, network, http, dns, tokio, protocol, dpdk, proxy, async, packet
  • no-std = arm, cortex-m, no_std, stm32, embedded, cryptography, svd2rust, hash, embedded-hal-driver, wasm
  • os = system, command, memory, os, window, linux, process
  • os::macos-apis = system, macos
  • os::unix-apis = system, linux, unix, freebsd, udp, docker, process, memory, ipc, shared
  • os::windows-apis = windows, ffi, win32
  • parser-implementations = parser, parsing, atom, nom, lexer, ssh, csv, json, javascript, bytecode
  • parsing = parser, parsing, nom, peg, text, html, xml, grammar, parse, protocol
  • rendering = graphics, gamedev, rendering, vulkan, gui, sprite, glsl, shadertoy, shaders, character-property
  • rendering::data-formats = graphics, text, image, font, glsl, ttf, opengl, 2d, 3d
  • rendering::engine = game, ffi
  • rendering::graphics-api = graphics, vulkan, opengl, vulkan-api, spir-v, gui, graphics-programming, input, bindings, gpu
  • rust-patterns = macro, error, iterator, derive, string, no_std, static, di, data-structure, async
  • science = math, linear-algebra, mathematics, science, astronomy, machine-learning, units, weather, numerics, physics
  • simulation = simulation
  • template-engine = template, html, templating, web, template-engine, jinja2, handlebars, macro
  • text-editors = cickets
  • text-processing = text, unicode, nlp, string, character-property, markdown, fuzzy, parser, cli, parsing
  • value-formatting = format, numbers, bytes, formatting, string, humanize, float
  • visualization = visualization, plot, gui
  • wasm = wasm, javascript, binding-generator, webassembly, js
  • web-programming = web, http, javascript, rocket, wasm, api, microservices, iron, zipkin, html
  • web-programming::http-client = http, client, hyper, rest, api, request, https, web, jsonrpc, tokio
  • web-programming::http-server = http, web, server, framework, hyper, iron, rocket, file, static, middleware
  • web-programming::websocket = websocket, websockets, web, http, async, rfc6455, io, pubsub, tokio

And here are most popular keywords, except the keywords listed above:

sys google aws implementation core data rusoto winsdk amazon types wrapper imag generator piston matrix utility information simple pim interface codegen utils code stream rpc trait personal management fast line support safe package queue collection distributed geometry slice name python buffer tcp sdk tls binding byte shell number lib set event traits read functional index reader regex bit generic driver protocol- specification concurrent common functions protobuf ip socket util integer utilities mio telegram crates gfx url channel rusty algebra rustc state linear dsl drone hex assert java query service simd diesel helper raw message runtime manager irc to performance reproto tower tools syntax strings backend compile stack bot basic programming metrics persistent jit unic ascii library x11 id statistics ethereum sync table native find llvm write list generate access free extension term builder impl iter gl module lock num kernel struct events geo mac collision filter rand token cell streaming dynamic repl metadata trie application documentation check pretty bioinformatics optimization size project specs easy serialize distributed-systems hashing graphql sgx option convert device chat empty str collections block user ansi try uuid decoding pure intel editor object automation std noise build- dependencies panic info allegro endian range numeric display structure distance around distribution net conversion control heap standard grpc interact vm unsafe ruby sqlite cipher diff cpu tty router blas touch print tiny windowing complete open x86 from ci elastic value domain brainfuck backup cryptocurrency stats port source cross-platform db expression gis keyboard procedural status css checksum generation base i2c virtual content gtk-rs actix fixed key multi gen store loop pi xmpp qt pattern immutable synchronization amethyst proc chain ssl link raspberry hello validation script ring run ref analysis s3 crate r2d2 ucd reserve node local task bittorrent libc match scoped ndarray notify exonum between genetic operations minecraft assembly transport level gtk applications japanese reactive mango bloom scripting split pdf structures stable auth output osx ext idl monitor elasticsearch sdl2 reference create count typed slack extra kubernetes pipe twitter values bindgen uhttp result ast messaging sputnikvm posix go conduit mysql fft systemd cpp update platform servo mongo

I'd split Science:

  • add Math (top crates are math-related)
  • add Geo (it's a very distinct topic)
  • add Machine Learning/AI

I'd even go as far as moving ML/AI to a top-level category, but it could be controversial to imply it's not science :wink:

I'm missing a category for Error Handling (proposed). It would probably have just 5 crates or so, but it's an important topic.

There are tons of crates that perform some form of Derive. Should they get a (sub)category?

There's a ton of auto-generated crates for AWS and Google SDKs. Should they get a category?

2 Likes

Yeah, I have all of the num crates in Science, but I'd rather put them in Math.

  • Compilers and programming languages
  • Cryptocurrencies (now proposed)

Couldn't that just go under rust-patterns?

I've already opened an issue on GitHub about language interpreters, compilers and run-times, but so far nothing happened...

https://github.com/rust-lang/crates.io/issues/1412

2 Likes

Yeah, it'd make a good subcategory.

  • Mobile development
  • Fonts

I've tried:

Cryptocurrencies worked fine.

Math and ML are problematic:

  • things like statistics and fuzzy logic overlap both.
  • GPGPU ends up falling into ML, but it's not exactly it.

I’d like osdev - Rust is really well suited to kernel development and I’d like to see it go from esoteric in the os dev community to more mainstream. Good support in the Rust community would be a good first step :slight_smile:

I've deleted the external-ffi-bindings and api-bindings from crates.rs, and it has been a big improvement!

These two categories were focused on "how" rather than "what", so they were huge and internally disorganized.

Without catch-all bindings categories the bindings are now in topical categories, so you see FFI, bindings and native Rust crates side by side. Perhaps later I could make "FFI: yes/no" a filter inside each category.

I think the category "authentication" should instead be "security". Crates that are CLI utilites for example, that have to do with security have no other category than "command-line-utilities", if they don't provide something in the authentication/cryptography categories.

This will also make it easier to categorize future security tools written in Rust.