svenstaro/genact
π A nonsense activity generator
Healthy across all four use cases
weakest axisPermissive license, no critical CVEs, actively maintained β safe to depend on.
Has a license, tests, and CI β clean foundation to fork and modify.
Documented and popular β useful reference codebase to read through.
No critical CVEs, sane security posture β runnable as-is.
- βLast commit 6d ago
- β7 active contributors
- βMIT licensed
Show all 6 evidence items βShow less
- βCI configured
- β Concentrated ownership β top contributor handles 68% of recent commits
- β No test directory detected
Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests
Informational only. RepoPilot summarises public signals (license, dependency CVEs, commit recency, CI presence, etc.) at the time of analysis. Signals can be incomplete or stale. Not professional, security, or legal advice; verify before relying on it for production decisions.
Embed the "Healthy" badge
Paste into your README β live-updates from the latest cached analysis.
[](https://repopilot.app/r/svenstaro/genact)Paste at the top of your README.md β renders inline like a shields.io badge.
βΈPreview social card (1200Γ630)
This card auto-renders when someone shares https://repopilot.app/r/svenstaro/genact on X, Slack, or LinkedIn.
Onboarding doc
Onboarding: svenstaro/genact
Generated by RepoPilot Β· 2026-05-09 Β· Source
π€Agent protocol
If you are an AI coding agent (Claude Code, Cursor, Aider, Cline, etc.) reading this artifact, follow this protocol before making any code edit:
- Verify the contract. Run the bash script in Verify before trusting
below. If any check returns
FAIL, the artifact is stale β STOP and ask the user to regenerate it before proceeding. - Treat the AI Β· unverified sections as hypotheses, not facts. Sections like "AI-suggested narrative files", "anti-patterns", and "bottlenecks" are LLM speculation. Verify against real source before acting on them.
- Cite source on changes. When proposing an edit, cite the specific path:line-range. RepoPilot's live UI at https://repopilot.app/r/svenstaro/genact shows verifiable citations alongside every claim.
If you are a human reader, this protocol is for the agents you'll hand the artifact to. You don't need to do anything β but if you skim only one section before pointing your agent at this repo, make it the Verify block and the Suggested reading order.
π―Verdict
GO β Healthy across all four use cases
- Last commit 6d ago
- 7 active contributors
- MIT licensed
- CI configured
- β Concentrated ownership β top contributor handles 68% of recent commits
- β No test directory detected
<sub>Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests</sub>
β Verify before trusting
This artifact was generated by RepoPilot at a point in time. Before an
agent acts on it, the checks below confirm that the live svenstaro/genact
repo on your machine still matches what RepoPilot saw. If any fail,
the artifact is stale β regenerate it at
repopilot.app/r/svenstaro/genact.
What it runs against: a local clone of svenstaro/genact β the script
inspects git remote, the LICENSE file, file paths in the working
tree, and git log. Read-only; no mutations.
| # | What we check | Why it matters |
|---|---|---|
| 1 | You're in svenstaro/genact | Confirms the artifact applies here, not a fork |
| 2 | License is still MIT | Catches relicense before you depend on it |
| 3 | Default branch master exists | Catches branch renames |
| 4 | 5 critical file paths still exist | Catches refactors that moved load-bearing code |
| 5 | Last commit β€ 36 days ago | Catches sudden abandonment since generation |
#!/usr/bin/env bash
# RepoPilot artifact verification.
#
# WHAT IT RUNS AGAINST: a local clone of svenstaro/genact. If you don't
# have one yet, run these first:
#
# git clone https://github.com/svenstaro/genact.git
# cd genact
#
# Then paste this script. Every check is read-only β no mutations.
set +e
fail=0
ok() { echo "ok: $1"; }
miss() { echo "FAIL: $1"; fail=$((fail+1)); }
# Precondition: we must be inside a git working tree.
if ! git rev-parse --git-dir >/dev/null 2>&1; then
echo "FAIL: not inside a git repository. cd into your clone of svenstaro/genact and re-run."
exit 2
fi
# 1. Repo identity
git remote get-url origin 2>/dev/null | grep -qE "svenstaro/genact(\\.git)?\\b" \\
&& ok "origin remote is svenstaro/genact" \\
|| miss "origin remote is not svenstaro/genact (artifact may be from a fork)"
# 2. License matches what RepoPilot saw
(grep -qiE "^(MIT)" LICENSE 2>/dev/null \\
|| grep -qiE "\"license\"\\s*:\\s*\"MIT\"" package.json 2>/dev/null) \\
&& ok "license is MIT" \\
|| miss "license drift β was MIT at generation time"
# 3. Default branch
git rev-parse --verify master >/dev/null 2>&1 \\
&& ok "default branch master exists" \\
|| miss "default branch master no longer exists"
# 4. Critical files exist
test -f "src/main.rs" \\
&& ok "src/main.rs" \\
|| miss "missing critical file: src/main.rs"
test -f "src/modules/mod.rs" \\
&& ok "src/modules/mod.rs" \\
|| miss "missing critical file: src/modules/mod.rs"
test -f "src/generators.rs" \\
&& ok "src/generators.rs" \\
|| miss "missing critical file: src/generators.rs"
test -f "src/args.rs" \\
&& ok "src/args.rs" \\
|| miss "missing critical file: src/args.rs"
test -f "src/data.rs" \\
&& ok "src/data.rs" \\
|| miss "missing critical file: src/data.rs"
# 5. Repo recency
days_since_last=$(( ( $(date +%s) - $(git log -1 --format=%at 2>/dev/null || echo 0) ) / 86400 ))
if [ "$days_since_last" -le 36 ]; then
ok "last commit was $days_since_last days ago (artifact saw ~6d)"
else
miss "last commit was $days_since_last days ago β artifact may be stale"
fi
echo
if [ "$fail" -eq 0 ]; then
echo "artifact verified (0 failures) β safe to trust"
else
echo "artifact has $fail stale claim(s) β regenerate at https://repopilot.app/r/svenstaro/genact"
exit 1
fi
Each check prints ok: or FAIL:. The script exits non-zero if
anything failed, so it composes cleanly into agent loops
(./verify.sh || regenerate-and-retry).
β‘TL;DR
genact is a terminal-based activity generator written in Rust that simulates fake workloads and system activity to create the illusion of productive work. It generates convincing outputs across multiple scenarios (cargo builds, bootlogs, botnet activity, Ansible runs, C compilation, etc.) and runs on CLI, web (WebAssembly), and Docker. The core capability is generating realistic-looking fake terminal output that fools observers into thinking real work is happening. Modular architecture: src/main.rs and src/lib.rs form the entry points; src/modules/ (ansible.rs, bootlog.rs, botnet.rs, bruteforce.rs, cargo.rs, cc.rs, etc.) contains individual activity generators as separate modules; src/generators.rs and src/data.rs handle shared generation logic and data loading; src/args.rs manages CLI argument parsing (clap-derived). Data-driven design: data/ directory contains CSV and text files (ansible_roles.txt, bootlog.txt, packages.txt, terraform resources, etc.) that populate the fake outputs. Dual-target build: conditional compilation for native (clap, terminal_size, ctrlc) vs. WASM (wasm-bindgen, web-sys, js-sys).
π₯Who it's for
Developers and sysadmins who want to prank colleagues, create believable screencasts, or simply entertain themselves by pretending to be busy. Secondary audience: system administrators demoing DevOps tools, and security researchers creating fake activity for honeypots or training scenarios.
π±Maturity & risk
Actively developed and production-ready: version 1.5.1 with complete CI/CD pipelines (GitHub Actions build-release.yml and ci.yml), multi-platform binary releases (Linux, macOS, Windows, FreeBSD), and published on major package managers (Homebrew, Scoop, Crates.io, Docker Hub). The project has significant GitHub stars and download counts indicating stable, popular software with regular maintenance.
Low risk: single-maintainer (svenstaro) with a focused scope, but dependency footprint is moderate (~15 direct dependencies including tokio, chrono, fake, regex, sha2). No breaking changes evident in recent releases. The Rust edition is set to 2024 (latest stable), and WASM support adds cross-platform reach. Main risk is maintainer availabilityβif svenstaro becomes unavailable, the project could stall, though the codebase is straightforward enough for community forks.
Active areas of work
The repository is actively maintained with recent commits (indicated by version 1.5.1). CI pipelines run on every commit (ci.yml) and automate releases (build-release.yml). Dependabot is configured (.github/dependabot.yml) for automated dependency updates. No specific open PRs or issues are visible in the file listing, but the Makefile and Trunk.toml suggest active web build tooling integration, indicating ongoing WASM improvements.
πGet running
Clone and build locally: git clone https://github.com/svenstaro/genact.git && cd genact && cargo build --release. Run the binary: ./target/release/genact. Or install via Cargo: cargo install genact && genact. For web version: trunk serve (requires Trunk.toml setup). For Docker: docker run -it --rm svenstaro/genact.
Daily commands:
Development: cargo run -- -h to see options, or cargo build && ./target/debug/genact. For release build: cargo build --release && ./target/release/genact. Web dev: trunk serve (requires trunk to be installed). Production binaries are pre-built in GitHub releases for each OS.
πΊοΈMap of the codebase
src/main.rsβ Entry point that orchestrates argument parsing, module selection, and async runtimeβevery contributor must understand the execution flow here.src/modules/mod.rsβ Module registry and trait definitions for all activity generators; essential for adding new nonsense scenarios.src/generators.rsβ Core utility functions (timing, output delays, text rendering) shared across all modulesβfoundational for maintaining visual consistency.src/args.rsβ CLI argument parsing; defines the public interface and user-facing options that drive module behavior.src/data.rsβ Data loading and caching from/datadirectory; critical for populating realistic-looking fake content.Cargo.tomlβ Dependency manifest with async/tokio stack; affects all module implementations and runtime behavior.
π§©Components & responsibilities
- args.rs (CLI Parser) (clap derive macros) β Parse command-line options (module, speed, verbosity) and expose them as a structured Args struct.
- Failure mode: Invalid arguments cause panic or help output; graceful error reporting.
- modules/mod.rs (Module Registry) (async-trait, match dispatch) β Route module selection to concrete implementations; provide async trait for standardized execution.
- Failure mode: Unknown module name falls back to default or error; missing module impl causes compile failure.
- generators.rs (Timing & Rendering) (chrono, colorgrad, rand) β Centralized utilities for random delays, progress bars, and text formatting shared across all modules.
- Failure mode: Misconfigured delay ranges may cause output to appear too fast/slow; affects user perception of realism.
- data.rs (Data Loader) (File I/O, CSV parsing, lazy static caching) β Load, parse, and cache external CSV/TXT files for seeding module output (packages, hostnames, etc.).
- Failure mode: Missing or malformed data file causes panic or empty output; impacts module realism.
- Individual Module (e.g., cargo.rs) (async/await, Module trait impl) β Implement async execute() to orchestrate fake activity: parse data, apply delays, render output via generators.
- Failure mode: Panics on data parse errors or infinite loops in delay logic; affects user experience for that scenario.
πData flow
CLI argsβargs.rsβ User input (e.g., --module cargo --speed 2.0) parsed into Args struct.args.rsβmain.rsβ Structured Args passed to main, which selects the appropriate module.main.rsβmodules/mod.rsβ Module name and Args forwarded to registry, which instantiates and executes the module.modules/mod.rsβdata.rsβ undefined
π οΈHow to make changes
Add a new activity module (e.g., a new nonsense scenario)
- Create a new file src/modules/mymodule.rs implementing the Module trait with async fn execute() and fn name() (
src/modules/mymodule.rs) - Register the module in the registry within src/modules/mod.rs by adding a case to the match statement (
src/modules/mod.rs) - Use generators from src/generators.rs (e.g., random_delay, progress_bar, render_text) to produce timed output (
src/generators.rs) - If your module needs seed data, add a CSV or TXT file to data/ and load it via src/data.rs (
data/mydata.txt)
Customize the visual appearance or timing behavior
- Edit timing constants or probability logic in src/generators.rs (random_delay, progress_bar, etc.) (
src/generators.rs) - Adjust color gradients or text styling via colorgrad dependency logic in the relevant module (
src/modules/cargo.rs) - Override CLI defaults for speed/verbosity in src/args.rs to control default behavior (
src/args.rs)
Add a new CLI option or argument
- Define the new field in the Args struct in src/args.rs using clap derive macros (
src/args.rs) - Pass the parsed argument to module execute() calls in src/main.rs (
src/main.rs) - Use the argument within individual modules to alter behavior (e.g., verbosity level, timing multiplier) (
src/modules/mod.rs)
π§Why these technologies
- Tokio (async runtime) β Enables concurrent execution of timed delays and I/O across multiple modules; simplifies non-blocking waits.
- Chrono + Fake crate β Provides realistic fake data generation (names, dates) and time handling for believable output.
- Colorgrad β Renders animated color gradients in progress bars for visual polish and immersion.
- Rust Edition 2024 + LTO β Produces minimal, fast binary suitable for novelty scripting; LTO reduces size by ~40%.
βοΈTrade-offs already made
-
Single-threaded async (tokio single-threaded runtime implied by 'rt' feature)
- Why: Simplicity and predictable timing for sequential fake events; no mutex overhead.
- Consequence: Cannot leverage multi-core for parallelism within a single module, but sufficient for I/O-bound delays.
-
External data files (CSV/TXT) rather than procedural generation
- Why: Ensures variety and authenticity (real package names, kernel logs, etc.).
- Consequence: Adds file I/O overhead and requires data distribution; mitigated by caching in src/data.rs.
-
Module trait as pluggable abstraction rather than a functional pipeline
- Why: Easy to add new scenarios independently; each module is self-contained.
- Consequence: Some duplication of timing/output logic across modules; partly mitigated by src/generators.rs.
π«Non-goals (don't propose these)
- Does not actually compile code, download packages, or perform any real system operationsβpurely visual simulation.
- Not a security or system administration tool; intended as entertainment/prank software.
- Does not support Windows natively (primary target is Linux/POSIX terminals with ANSI support).
- Does not provide a daemon or background service modeβruns as a one-shot CLI utility.
πͺ€Traps & gotchas
No explicit required environment variables or services. Key quirks: (1) Edition is set to 2024 in Cargo.toml (latest Rust, ensure you have a recent rustc: rustc --version). (2) WASM build requires trunk (not cargo alone): trunk serve. (3) Some dependencies are conditional on target architecture (keepawake only for Linux/macOS/Windows, not for WASM), so cross-compiling to WASM on a native platform requires cargo build --target wasm32-unknown-unknown or use trunk. (4) Release binaries are optimized aggressively (lto=true, opt-level='z', codegen-units=1), so release builds are slow but small. (5) No test files visible in the file listing (src/ lacks *_test.rs or tests/ directory), so test coverage is unclearβverify with cargo test.
ποΈArchitecture
π‘Concepts to learn
- Async/await with Tokio β genact runs multiple concurrent activity generators via tokio::spawn tasks (see Cargo.toml dependency on tokio with rt and macros features), making async patterns essential to understanding how multiple fake workloads run in parallel
- Conditional compilation (cfg attributes) β This repo uses conditional compilation extensively (see Cargo.toml with target-specific dependencies and src/main.rs likely containing cfg conditionals) to maintain a single codebase for native CLI and WebAssembly targets
- WebAssembly (WASM) in Rust β genact compiles to WASM via wasm-bindgen and web-sys for browser deployment (see Trunk.toml and wasm32-specific dependencies); understanding WASM FFI is crucial for maintaining the web version
- Fake data generation (crate: fake) β The fake crate (v5.0 in Cargo.toml) generates realistic synthetic data for names, dates, and package versions; core to making fake activity look convincing
- Probabilistic distributions (rand_distr) β rand_distr (v0.6 in Cargo.toml) enables realistic timing and behavior distributions (e.g., network latency curves, task duration variability) so fake activity feels natural rather than uniform
- [Terminal UI and progress visualization](https://docs.rs/progress_string/latest/progress_string/ and https://docs.rs/colorgrad/latest/colorgrad/) β The crate progress_string (v0.2) and colorgrad (v0.8) are used to render progress bars and colored output that mimic real terminal activity; understanding progress bar state machines is key to output realism
- Data-driven architecture (declarative data in CSV/text) β Rather than hardcoding fake activity, genact loads realistic seed data from data/.txt and data/.csv files (ansible_roles.txt, bootlog.txt, terraform resources, etc.) and procedurally generates outputβthis separation makes adding new scenarios trivial
πRelated repos
TrevorBlythe/MachineGunβ Simulates terminal activity and fake workloads similar to genact; provides an alternative implementation approachmooz/percolβ Interactive terminal utility for selecting and filtering output; used by some developers to enhance fake output in pranksasciinema/asciinemaβ Records and plays back terminal sessions; complements genact by capturing and replaying real activity as proof or alternative to generating fake activitywatchexec/cargo-watchβ Real cargo workflow automation that genact parodies; understanding this helps appreciate what genact is fakingstarship/starshipβ Advanced shell prompt customization; genact users often combine it with genact for more convincing fake terminal environments
πͺPR ideas
To work on one of these in Claude Code or Cursor, paste:
Implement the "<title>" PR idea from CLAUDE.md, working through the checklist as the task list.
Add integration tests for all generator modules in src/modules/
The repo has 12+ generator modules (ansible.rs, cargo.rs, docker_build.rs, etc.) but there's no visible test suite validating that each module produces expected output. This is critical for a project where output quality directly affects user experience. Tests would catch regressions when refactoring generators and ensure new modules meet quality standards.
- [ ] Create tests/ directory with test files for each module in src/modules/
- [ ] Add unit tests in each module file validating: output contains expected data patterns, no panics occur, async execution completes
- [ ] Add integration test that runs genact with --list-modules and verifies all modules initialize
- [ ] Update CI workflow (.github/workflows/ci.yml) to run tests with
cargo testand coverage reporting - [ ] Document test patterns in CONTRIBUTING.md for future module contributors
Add GitHub Actions workflow to validate data files and prevent stale content
The data/ directory contains 18 CSV/TXT files (packages.txt, docker_tags.txt, terraform_aws_resources.txt, etc.) that likely need periodic updates but there's no automation checking for outdated content or format issues. A workflow validating file integrity would catch corrupted data before release and could flag which files haven't been updated recently.
- [ ] Create .github/workflows/validate-data.yml workflow file
- [ ] Add validation checks: verify each data file is non-empty, validates UTF-8 encoding, and matches expected format (CSV/TXT)
- [ ] Add a check that reports modification dates of data files to track staleness
- [ ] Optionally integrate with src/data.rs to verify all data files are properly loaded at runtime
- [ ] Add workflow status badge to README.md
Refactor src/modules/mod.rs and add module registry for better maintainability
With 12+ generator modules across different files, the mod.rs likely has large match statements or repetitive registration code. A module registry pattern would make adding new modules require only adding a struct, not editing multiple places. This reduces cognitive load for contributors and prevents accidental omissions.
- [ ] Audit src/modules/mod.rs and src/generators.rs to identify all places where modules are registered/matched
- [ ] Create a ModuleRegistry trait that each module implements (already using async-trait)
- [ ] Implement automatic module discovery/registration using a macro or lazy_static map
- [ ] Refactor each module file (ansible.rs, cargo.rs, etc.) to implement the registry trait
- [ ] Update CONTRIBUTING.md with 'Adding a New Module' guide showing the simplified pattern
- [ ] Verify all existing modules still work and add test confirming new modules register automatically
πΏGood first issues
- Add a new activity generator module for 'docker pull' simulation: create src/modules/docker.rs that parses data/docker_packages.txt and data/docker_tags.txt to generate realistic output of pulling container images. This follows the existing pattern in src/modules/cargo.rs but for Docker commands.
- Write integration tests for existing modules: src/modules/*.rs files lack accompanying test cases. Create tests/integration_tests.rs that run each generator and verify output contains expected keywords (e.g., 'cargo build' output contains 'Compiling', 'Finished'). This improves code confidence without changing core logic.
- Document the module architecture in CONTRIBUTING.md: currently CONTRIBUTING.md exists but the file list doesn't show its contents. Add a section explaining how to add a new generator module step-by-step, with code examples from src/modules/cargo.rs and src/modules/bootlog.rs. This lowers the barrier for contributors.
βTop contributors
Click to expand
Top contributors
- @svenstaro β 68 commits
- @dependabot[bot] β 14 commits
- @RektPunk β 13 commits
- @cyqsimon β 2 commits
- @alimpfard β 1 commits
πRecent commits
Click to expand
Recent commits
c1e51e0β Bump the all-dependencies group with 4 updates (#714) (dependabot[bot])16f96e3β Update README (svenstaro)d92a036β Switch from async-std to tokio (#707) (svenstaro)cf42436β Add CHANGELOG entry for #710 (svenstaro)f629201β Merge pull request #710 from RektPunk/uv-act (svenstaro)edb5d6aβ change signature (RektPunk)c580aecβ replace all \n to newline (RektPunk)6049207β make more realistic download (RektPunk)a25e0f7β remove rewrite_line function (RektPunk)07c4d16β consider wasm (RektPunk)
πSecurity observations
This is a lightweight, novelty command-line tool with a relatively good security posture. No hardcoded credentials, injection vulnerabilities, or exposed sensitive data were detected in the provided file structure. The main concerns are the invalid Rust edition declaration in Cargo.toml (which will prevent compilation) and reliance on some older/unmaintained dependencies. The codebase appears well-structured and uses standard Rust best practices with async/await patterns and proper dependency isolation for different target platforms (native vs WASM). For a project of this nature (a nonsense activity generator), the security profile is acceptable, but the build configuration issue must be resolved.
- Medium Β· Invalid Rust Edition β
Cargo.toml. The Cargo.toml specifies edition = "2024", which does not exist. Valid Rust editions are 2015, 2018, and 2021. This will cause build failures and indicates a configuration error that should be corrected. Fix: Update the edition field to a valid value, such as edition = "2021" - Low Β· Dependency on Unmaintained Crates β
Cargo.toml (progress_string dependency). The crate 'progress_string' (version 0.2) appears to be unmaintained based on its age and low activity. While the project is primarily a fun/novelty tool, relying on unmaintained dependencies can accumulate security risks over time. Fix: Monitor the dependency for security updates or consider replacing with an actively maintained alternative - Low Β· Broad Dependency Ranges β
Cargo.toml (multiple dependencies). Most dependencies use loose version constraints (e.g., '1', '0.1', '2') without upper bounds, which allows pulling in potentially breaking or untested versions during future updates. Fix: Consider using more restrictive version constraints like '^1.5' or specifying exact versions for critical dependencies to ensure reproducible builds - Low Β· WASM-specific Dependencies Without Validation β
Cargo.toml (wasm32 target dependencies). The project targets WebAssembly with wasm-bindgen and js-sys dependencies. While this is a legitimate use case, ensure that WASM builds are tested and validated separately, as they may introduce different security considerations than native builds. Fix: Implement separate CI/CD testing for WASM builds and ensure security auditing includes WASM-specific attack vectors
LLM-derived; treat as a starting point, not a security audit.
πWhere to read next
- Open issues β current backlog
- Recent PRs β what's actively shipping
- Source on GitHub
Generated by RepoPilot. Verdict based on maintenance signals β see the live page for receipts. Re-run on a new commit to refresh.