{"id":49311229,"url":"https://github.com/benletchford/buup","last_synced_at":"2026-04-26T13:00:59.376Z","repository":{"id":278176199,"uuid":"934071761","full_name":"benletchford/buup","owner":"benletchford","description":"A versatile text transformation toolkit in pure Rust with a dependency-free core. Encoding, decoding, formatting, cryptography, and (de)compression and more through CLI, web UI, or as a library.","archived":false,"fork":false,"pushed_at":"2026-04-26T11:17:45.000Z","size":16297,"stargazers_count":7,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2026-04-26T12:25:15.341Z","etag":null,"topics":["cli","developer-tools","dioxus","pure-rust","reverse-engineering","rust","text-processing","utilities","wasm","zero-dependencies"],"latest_commit_sha":null,"homepage":"https://benletchford.github.io/buup/","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/benletchford.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-02-17T08:21:33.000Z","updated_at":"2026-04-26T11:15:03.000Z","dependencies_parsed_at":"2025-02-18T12:26:30.963Z","dependency_job_id":"da230ba4-3a25-42b4-8fca-24ff8725c4c4","html_url":"https://github.com/benletchford/buup","commit_stats":null,"previous_names":["benletchford/buup"],"tags_count":34,"template":false,"template_full_name":null,"purl":"pkg:github/benletchford/buup","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/benletchford%2Fbuup","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/benletchford%2Fbuup/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/benletchford%2Fbuup/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/benletchford%2Fbuup/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/benletchford","download_url":"https://codeload.github.com/benletchford/buup/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/benletchford%2Fbuup/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32297899,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-26T09:34:17.070Z","status":"ssl_error","status_checked_at":"2026-04-26T09:34:00.993Z","response_time":129,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cli","developer-tools","dioxus","pure-rust","reverse-engineering","rust","text-processing","utilities","wasm","zero-dependencies"],"created_at":"2026-04-26T13:00:58.745Z","updated_at":"2026-04-26T13:00:59.370Z","avatar_url":"https://github.com/benletchford.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Buup - The Text Utility Belt\n\nBuup is a versatile text transformation toolkit that provides a dependency-free core library and CLI for common text manipulations like encoding/decoding, formatting, cryptography, (coming soon compression/decompression), and more written in pure dependency-free Rust.\n\nIt is designed to be a simple, lightweight, **open**, **secure**, **provably fast** and easy to integrate.\n\nDrop-in replacement for all of those dodgy online text transformation tools you've ever used in the past except the batteries are included (and they are all in pure Rust).\n\nIt includes a [web application](https://benletchford.github.io/buup/) which is of course written in pure Rust (WASM via [Dioxus](https://dioxuslabs.com/)) as a separate workspace member.\n\n\u003cdiv align=\"center\"\u003e\n    \u003ca href=\"https://benletchford.github.io/buup/\"\u003e\n        \u003cimg src=\"buup_web/assets/web-screenshot-dark.png\"\u003e\n    \u003c/a\u003e\n\u003c/div\u003e\n\n## Key Features\n\n- **Zero Dependencies**: The core `buup` library and its CLI implement all transformations without external dependencies\n- **Multiple Interfaces**: CLI for terminal workflows and Web UI for interactive use\n- **Extensible Design**: Easy to add new transformers by implementing the `Transform` trait\n- **Strong Typing**: Full type safety with comprehensive error handling\n- **Thread Safety**: All transformers are designed to be safely used concurrently\n- **Performance**: Optimized for speed and memory usage\n\n## Ways to Use Buup\n\nBuup offers three distinct ways to transform your text:\n\n### 1. Web Application\n\nA modern, responsive web application for interactive text transformations proudly built with [Dioxus](https://dioxuslabs.com/).\n\n|                            Dark Mode                            |                            Light Mode                            |\n| :-------------------------------------------------------------: | :--------------------------------------------------------------: |\n| \u003cimg src=\"buup_web/assets/web-screenshot-dark.png\" width=\"400\"\u003e | \u003cimg src=\"buup_web/assets/web-screenshot-light.png\" width=\"400\"\u003e |\n\nFrom source:\n\n```bash\n# Serve the web UI (requires Dioxus CLI)\ncd buup_web\ndx serve\n```\n\nBuild for production:\n\n```bash\ndx build\n```\n\n### 2. Command Line Interface\n\nZero-dependency CLI for quick transformations in your terminal workflows.\n\n```bash\n# Installation\ncargo binstall buup # or cargo install buup\n\n# List available transformers\nbuup list\n\n# Examples\nbuup base64encode \"Hello, world!\"     # Encode text directly\nbuup urldecode -i encoded.txt         # Decode from file\necho \"Hello\" | buup hexencode         # Pipe from stdin\n```\n\n### 3. Rust Library\n\nIntegrate Buup's transformers directly into your Rust applications.\n\n```bash\n# Add to your project\ncargo add buup\n```\n\n```rust\nuse buup::{transformer_from_id, Transform, Base64Encode};\n\n// Option 1: Use a specific transformer struct\nlet encoded = Base64Encode.transform(\"Hello, Library!\").unwrap();\nprintln!(\"{}\", encoded); // SGVsbG8sIExpYnJhcnkh\n\n// Option 2: Look up a transformer by its ID\nlet transformer = transformer_from_id(\"base64decode\").unwrap();\nlet decoded = transformer.transform(\u0026encoded).unwrap();\nprintln!(\"{}\", decoded); // Hello, Library!\n```\n\n## Tiny Binary Size\n\nBuup is incredibly lightweight, with the entire buup library of transformers and the CLI binary compiling down to just **652K** on arm64 (again with no external dependencies).\n\nThis tiny footprint makes Buup perfect for:\n\n- **Including in resource-constrained environments** e.g. embedded systems\n- **Fast startup times** for CLI operations\n- **Minimal dependencies** means fewer security vulnerabilities and simpler maintenance\n\n*Note: Binary size may vary slightly across different platforms.*\n\n## Available Transformers\n\nThe following transformers are currently available in Buup:\n\n```bash\nAvailable transformers:\n\nENCODERS:\n  ascii_to_hex    - Convert ASCII characters to their hexadecimal representation.\n  base64encode    - Encode text to Base64 format\n  bin_to_hex      - Convert binary numbers to hexadecimal.\n  binaryencode    - Encode text into its binary representation (space-separated bytes).\n  dec_to_bin      - Convert decimal numbers to binary.\n  dec_to_hex      - Convert decimal numbers to hexadecimal.\n  hex_to_bin      - Converts hexadecimal input to its binary representation (Base64 encoded).\n  hexencode       - Encode text to hexadecimal representation\n  htmlencode      - Encodes special HTML characters into their entity representation (e.g., \u003c to \u0026lt;).\n  morseencode     - Encode text to Morse code\n  rot13           - Applies the ROT13 substitution cipher to the input text.\n  urlencode       - Encode text for use in URLs\n\nDECODERS:\n  base64decode    - Decode Base64 text to plain text\n  bin_to_dec      - Convert binary numbers to decimal.\n  binarydecode    - Decode space-separated binary representation back to text.\n  hex_to_ascii    - Decodes a hexadecimal string into its ASCII representation.\n  hex_to_dec      - Converts hexadecimal numbers to their decimal representation.\n  hexdecode       - Decodes a hexadecimal string into its original bytes, then interprets as UTF-8.\n  htmldecode      - Decodes HTML entities (e.g., \u0026lt;) back into characters (\u003c).\n  jwtdecode       - Decodes a JSON Web Token (JWT) without verifying the signature.\n  morsedecode     - Decodes Morse code into text.\n  urldecode       - Decode URL-encoded text\n\nFORMATTERS:\n  htmltomarkdown  - Converts HTML to Markdown format\n  jsonformatter   - Formats (pretty-prints) a JSON string.\n  jsonminifier    - Minifies a JSON string, removing unnecessary whitespace.\n  linenumberadder - Adds line numbers to the beginning of each line.\n  linenumberremover - Removes line numbers (and optional delimiters) from the beginning of each line.\n  markdowntohtml  - Converts Markdown text to HTML format\n  sqlformatter    - Formats SQL queries with proper indentation and spacing\n  sqlminifier     - Minifies SQL queries by removing unnecessary whitespace and formatting\n  xmlformatter    - Format XML code with proper indentation\n  xmlminifier     - Compress XML by removing unnecessary whitespace\n\nCRYPTOGRAPHY:\n  md5hash         - Calculates the MD5 hash of the input string.\n  sha1hash        - Computes the SHA-1 hash of the input text (Warning: SHA-1 is cryptographically weak)\n  sha256hash      - Computes the SHA-256 hash of the input text\n  uuid5_generate  - Generates a version 5 UUID based on namespace and name using SHA-1. Input format: \"namespace|name\". Namespace can be a UUID or one of: dns, url, oid, x500.\n\nCOMPRESSION:\n  deflatecompress - Compresses input using the DEFLATE algorithm (RFC 1951) and encodes the output as Base64.\n  deflatedecompress - Decompresses DEFLATE input (RFC 1951). Expects Base64 input.\n  gzipcompress    - Compresses input using Gzip (RFC 1952) and encodes the output as Base64.\n  gzipdecompress  - Decompresses Gzip formatted input (RFC 1952). Expects Base64 input.\n\nCOLORS:\n  hex_to_hsl      - Converts hex color code to HSL format\n  hex_to_rgb      - Converts hex color code to RGB format\n  hsl_to_hex      - Converts HSL color to hex format\n  hsl_to_rgb      - Converts HSL color to RGB format\n  rgb_to_hex      - Converts RGB color to hex format\n  rgb_to_hsl      - Converts RGB color to HSL format\n\nOTHERS:\n  cameltosnake    - Converts camelCase or PascalCase to snake_case\n  color_code_convert - Converts between different color formats (HEX, RGB, HSL, CMYK)\n  csvtojson       - Converts CSV data to JSON format\n  jsontocsv       - Converts a JSON array of objects into CSV format.\n  linesorter      - Sorts lines alphabetically.\n  slugify         - Converts text into a URL-friendly slug (lowercase, dashes, removes special chars)\n  snaketocamel    - Converts snake_case to camelCase\n  text_stats      - Calculates basic text statistics (lines, words, chars, sentences)\n  textreverse     - Reverses the input text\n  uniquelines     - Removes duplicate lines, preserving the order of first occurrence.\n  urlparser       - Parses a URL into its components (scheme, authority, path, query, fragment)\n  uuid_generate   - Generates a version 4 UUID. Input is ignored. WARNING: Uses a non-cryptographically secure PRNG.\n  whitespaceremover - Removes all whitespace (spaces, tabs, newlines) from the input text.\n\nEXAMPLES:\n  buup base64encode \"Hello, world!\"     # Encode text directly\n  buup urldecode -i encoded.txt         # Decode from file\n  echo \"Hello\" | buup hexencode         # Pipe from stdin\n```\n\n### Update README.md with `buup list`\n\n```bash\ncargo run --bin update_artifacts\n```\n\n## Contributing\n\nContributions are welcome! When adding new transformers or modifying code, please ensure:\n\n1. **Zero external dependencies** in the core `buup` library\n2. **Comprehensive tests** covering functionality and edge cases\n3. **Clear error handling** using `TransformError`\n4. Run `cargo test --workspace` and `cargo clippy --workspace -- -D warnings`\n\n### Creating Custom Transformers\n\n**Basic Structure**\n\nTo create a custom transformer:\n\n1. Create a new struct that implements the `Transform` trait\n2. Add the struct to the registry in `lib.rs`\n\n**Step 1: Example Implementation**\n\nHere's a simple example of a custom transformer that reverses text:\n\n```rust\nuse buup::{Transform, TransformError, TransformerCategory};\n\n/// Text Reverse transformer\n#[derive(Debug, Clone, Copy, PartialEq, Eq)]\npub struct TextReverse;\n\nimpl Transform for TextReverse {\n    fn name(\u0026self) -\u003e \u0026'static str {\n        \"Text Reverse\"\n    }\n\n    fn id(\u0026self) -\u003e \u0026'static str {\n        \"textreverse\"\n    }\n\n    fn category(\u0026self) -\u003e TransformerCategory {\n        TransformerCategory::Other\n    }\n\n    fn description(\u0026self) -\u003e \u0026'static str {\n        \"Reverses the input text\"\n    }\n\n    fn transform(\u0026self, input: \u0026str) -\u003e Result\u003cString, TransformError\u003e {\n        Ok(input.chars().rev().collect())\n    }\n\n    fn default_test_input(\u0026self) -\u003e \u0026'static str {\n        \"Example Input\"\n    }\n}\n```\n\n**Step 2: Add to Registry**\n\nIn `lib.rs`, add your transformer to the `register_builtin_transformers` function:\n\n```rust,ignore\nfn register_builtin_transformers() -\u003e Registry {\n    let mut registry = Registry {\n        transformers: HashMap::new(),\n    };\n    // ... existing registrations ...\n\n    // Import your new transformer struct\n    use crate::transformers::my_transformer::MyNewTransformer;\n\n    // Add your new transformer instance\n    registry.transformers.insert(MyNewTransformer.id(), \u0026MyNewTransformer);\n\n    registry\n}\n```\n\n**Step 3: Export Your Transformer (Optional)**\n\nIf your transformer will be used directly, add it to the exports in `transformers/mod.rs`:\n\n```rust,ignore\n// src/transformers/mod.rs\nmod base64_decode;\n// ... other mods ...\nmod my_transformer; // Your new module\n\npub use base64_decode::Base64Decode;\n// ... other uses ...\npub use my_transformer::MyNewTransformer; // Your new transformer\n```\n\n**Step 4: Add Inverse Support (Optional)**\n\nIf your transformer has an inverse operation, update the `inverse_transformer` function in `lib.rs`:\n\n```rust,ignore\npub fn inverse_transformer(t: \u0026dyn Transform) -\u003e Option\u003c\u0026'static dyn Transform\u003e {\n    match t.id() {\n        // ... existing matches ...\n        \"my_encoder\" =\u003e transformer_from_id(\"my_decoder\").ok(), // Your transformer pair\n        \"my_decoder\" =\u003e transformer_from_id(\"my_encoder\").ok(), // Your transformer pair\n        _ =\u003e None,\n    }\n}\n```\n\n**Tips for Creating Good Transformers**\n\n1. Follow the naming convention of existing transformers\n2. Provide clear and concise descriptions\n3. Make sure your transformer is thread-safe (impl Sync+Send)\n4. Consider implementing pairs of transformers for inverse operations\n5. Add comprehensive tests for your transformer\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbenletchford%2Fbuup","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbenletchford%2Fbuup","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbenletchford%2Fbuup/lists"}