Use docker-compose

June 5, 2026 · View on GitHub

Python 3.9+ MIT License Tests Coverage Languages Stars Forks Issues

 ██████╗ ██████╗ ███╗   ██╗ ██████╗ ███████╗██╗ ██████╗ ██╗  ██╗████████╗
██╔═══██╗██╔══██╗████╗  ██║██╔════╝ ██╔════╝██║██╔════╝ ██║  ██║╚══██╔══╝
██║   ██║██████╔╝██╔██╗ ██║██║  ███╗███████╗██║██║  ███╗███████║   ██║
██║   ██║██╔══██╗██║╚██╗██║██║   ██║╚════██║██║██║   ██║██╔══██║   ██║
╚██████╔╝██║  ██║██║ ╚████║╚██████╔╝███████║██║╚██████╔╝██║  ██║   ██║
 ╚═════╝ ╚═╝  ╚═╝╚═╝  ╚═══╝ ╚═════╝ ╚══════╝╚═╝ ╚═════╝ ╚═╝  ╚═╝   ╚═╝
  

CodeVista — Code Analysis & Security Scanner

Deep analytics for your code — a powerful static analysis tool

Beautiful interactive codebase visualizations — single HTML, zero dependencies.


✨ What is CodeVista?

CodeVista analyzes your codebase and generates a stunning single-page HTML report — no server, no internet, no external dependencies. Just share one file and everyone can explore your code visually.

CodeVista Demo

🚀 Quick Start

pip install codevista
codevista analyze ./my-project/

That's it. Open report.html in any browser. No server needed.

📦 Installation

pip install codevista

Zero external dependencies — pure Python stdlib.

🎯 Commands

CommandDescription
codevista analyze ./project/Full analysis with all features
codevista analyze ./project/ -o report.htmlCustom output path
codevista analyze ./project/ --no-gitSkip git analysis
codevista analyze ./project/ --depth 3Limit directory depth
codevista quick ./project/Fast analysis (~3 seconds)
codevista serve ./project/ --port 8080Serve report on HTTP server
codevista compare ./v1/ ./v2/Compare two codebases
codevista watch ./project/Re-analyze on file changes
codevista smells ./project/Detect code smells and anti-patterns
codevista architecture ./project/Detect architecture patterns
codevista code-age ./project/Analyze file age, churn, and risk
codevista export ./project/ -f sarifExport as SARIF for CI
codevista export ./project/ --allExport to all formats
codevista health ./project/Health score only
codevista security ./project/Security scan only
codevista deps ./project/Dependency analysis
codevista git-stats ./project/Git repository statistics
codevista languages ./project/Language distribution breakdown
codevista complexity ./project/Complexity analysis and top functions
codevista snapshot ./project/Save analysis snapshot for trend tracking
codevista trends ./project/Show project health trends over time
codevista diff-snapshots ./project/ 1 2Compare two snapshots
codevista team ./project/Team productivity & collaboration analysis
codevista ci-output ./project/ -f sarifCI/CD output (SARIF, Checkstyle, etc.)
codevista decay ./project/Architectural decay analysis
codevista dna ./project/Generate CodeDNA fingerprint
codevista lint ./project/Language-specific lint rules

📊 What It Analyzes

🏗️ Architecture Map

  • File dependency graph — who imports whom
  • Interactive directory tree with line counts
  • Module cluster detection

📈 Code Metrics

  • Lines of code per file (interactive bar chart)
  • Cyclomatic complexity (hot spot detection)
  • Code duplication detection (hash-based)
  • Comment coverage tracking
  • File size distribution

🧩 Technology Detection

  • Language detection (65+ languages)
  • Framework detection (React, Django, Flask, Express, etc.)
  • Dependency inventory with versions

🏥 Health Score

  • Overall health: 0-100 (composite score)
  • Per-category: readability, complexity, duplication, coverage, security, dependencies
  • Color-coded indicators (green/yellow/red)
  • Specific improvement recommendations

🔒 Security Scan

  • Hardcoded secrets (AWS, GitHub, Stripe, API keys, passwords, tokens)
  • Dangerous functions (eval, exec, shell=True, pickle)
  • Private key detection
  • Severity scoring (critical/high/medium/low)

👥 Git Insights

  • Contribution heatmap (52-week calendar)
  • Top contributors with commit share
  • Most active files
  • Commit statistics

👃 Code Smell Detection

CodeVista detects 19 categories of code smells that go beyond typical linters:

SmellDescription
God ClassesClasses with too many methods/fields/responsibilities
Long Parameter ListsFunctions with too many params, especially with =None
Feature EnvyMethods using another class's data more than their own
Divergent ChangeClasses modified for multiple unrelated reasons
Shotgun SurgerySingle logical change requiring edits across many files
Parallel InheritanceAdding a subclass of A always requires subclassing B
Speculative GeneralityUnused abstractions, abstract methods never overridden
Temporary FieldsInstance variables set only in certain methods
Message ChainsLong dot chains: a.b.c.d.e.f
Middle ManClasses that only delegate to another class
Comment SmellsComments describing WHAT code does, not WHY
Dead CodeVariables assigned but never read, functions never called
Magic NumbersUnnamed numeric literals scattered in code
Copy-Paste CodeNear-duplicate blocks within and across files
Missing Error HandlingI/O operations without try/catch or error checks
Inconsistent NamingMixing camelCase and snake_case conventions
Boolean ParametersFlags indicating method should be split
isinstance ChainsType checking chains suggesting missing polymorphism

Each smell comes with severity, location, and actionable remediation advice.

codevista smells ./my-project/

🏗️ Architecture Pattern Detection

Automatically identifies architectural patterns from project structure and code:

  • MVC / MVVM / MVP — UI patterns
  • Layered Architecture — presentation, business, data layers
  • Clean Architecture — entities, use cases, controllers, adapters
  • Hexagonal — ports & adapters pattern
  • Repository Pattern — data access mediation
  • Service Layer — application boundary with coordinating operations
  • CQRS — command/query separation
  • Event-Driven — event publishers, subscribers, handlers
  • Microservices — independent service architecture
  • Singleton / Factory / Strategy / Observer / Decorator — design patterns
  • Dependency Injection — DI framework and manual injection

Includes architecture quality scoring (organization, coupling, modularity, balance) and text-based architecture diagrams.

codevista architecture ./my-project/
``$

### 📅 \text{Code} \text{Age} & \text{Risk} \text{Analysis}
\text{Track} \text{file} \text{age}, \text{change} \text{frequency}, \text{and} \text{identify} \text{files} \text{most} \text{likely} \text{to} \text{have} \text{bugs}:

| \text{Category} | \text{Description} |
|----------|-------------|
| 🔥 **\text{Hot}** | \text{Changed} \text{in} \text{the} \text{last} 7 \text{days} |
| 🌤️ **\text{Warm}** | \text{Changed} \text{in} \text{the} \text{last} 30 \text{days} |
| ❄️ **\text{Cold}** | \text{Changed} 30-365 \text{days} \text{ago} |
| 🧊 **\text{Cold} \text{Stable}** | \text{Old} \text{but} \text{few} \text{changes} (\text{stable}) |
| 💀 **\text{Dead}** | \text{Unchanged} \text{for} >1 \text{year} |

**\text{Risk} \text{Analysis}** \text{correlates} \text{age}  \times  \text{complexity}  \times  \text{churn} \text{to} \text{identify} \text{the} \text{files} \text{most} \text{likely} \text{to} \text{contain} \text{bugs}:
- \text{Files} \text{with} \text{high} \text{age}, \text{high} \text{complexity}, \text{and} \text{high} \text{change} \text{frequency} \text{get} \text{the} \text{highest} \text{risk} \text{scores}
- \text{Statistical} \text{correlation} \text{analysis} \text{between} \text{age}, \text{complexity}, \text{and} \text{churn}
- \text{Actionable} \text{recommendations} \text{for} \text{high}-\text{risk} \text{files}

$``bash
codevista code-age ./my-project/

📈 Trend Analysis

Track code quality over time with snapshots and trend visualization.

How It Works

  1. Save snapshots after each analysis run
  2. Compare snapshots to see how your codebase evolves
  3. Get alerted when metrics cross critical thresholds
  4. Track technical debt ratio over time
# Save a snapshot of the current state
codevista snapshot ./my-project/

# Save with a label
codevista snapshot ./my-project/ --label "before-refactor"

# View trends
codevista trends ./my-project/

# Compare two specific snapshots
codevista diff-snapshots ./my-project/ 1 2

ASCII Timeline Example

  📈 Health Score Timeline
  100 ┤████████████████████
      │████████████████████
      │████████████████████
      │████████████████████
      │████████████████████
      │████████████████████
      │████████████████████
      │████████████████████
      │████████████████████
      │████████████████████
      │████████████████████
      │████████████████████
    0 ┤─────────────────────
  Current: 78/100 ↑

Features

  • Trend arrows: ↑ improving, ↓ degrading, → stable
  • Threshold alerts: Get warned when health drops or security issues spike
  • Technical debt tracking: Monitor debt ratio over time
  • Review cadence: Suggests optimal review frequency based on change rate
  • Code age distribution: Track how your codebase ages

👥 Team Metrics

Analyze developer productivity and collaboration patterns.

codevista team ./my-project/

What It Analyzes

MetricDescription
Lines per AuthorAdded/removed/net per developer
Commit FrequencyCommits per day, burst vs steady patterns
Files TouchedUnique files per author
Bus FactorPeople needed to understand 50% of code
Code OwnershipPie chart data showing contribution share
Review CoverageEstimate from commit messages
Pair ProgrammingCo-authored commit detection
Time Zone DistributionWhen the team commits
Onboarding ComplexityHow hard for a new contributor to ramp up

🏚️ Architectural Decay Detector

Track how your codebase degrades over time using git history. Detects growing complexity, increasing coupling, code duplication, and predicts future state.

codevista decay ./my-project/

What it analyzes:

MetricDescription
Complexity GrowthHow cyclomatic complexity changes across commits
Coupling GrowthHow module interdependencies grow over time
Duplication GrowthCode duplication ratio changes
Debt VelocityTechnical debt accumulation rate per week
Decay HotspotsFiles degrading fastest (ranked by decay score)
PredictionsLinear regression forecasts for 12 weeks ahead
Inflection PointsKey commits where quality shifted significantly
InterventionsPrioritized refactoring recommendations

ASCII Report Example:

  ╔═══════════════════════════════════════════════════════════╗
  ║          🏚️  ARCHITECTURAL DECAY ANALYSIS                 ║
  ╠═══════════════════════════════════════════════════════════╣
  ║  Repository: my-project                                    ║
  ║  Is Git:     Yes                                          ║
  ╚═══════════════════════════════════════════════════════════╝

  📈 COMPLEXITY GROWTH
  ────────────────────────────────────────────────────────
    2026-01-15  avg CC:   8.2  [████░░░░░░░░░░░░░░░░░░]
    2026-02-01  avg CC:   9.5  [█████░░░░░░░░░░░░░░░░░]
    2026-02-15  avg CC:  11.3  [██████░░░░░░░░░░░░░░░░]
    2026-03-01  avg CC:  13.8  [████████░░░░░░░░░░░░░░]
    Trend: 📈 GROWING

  🔥 DECAY HOTSPOTS (top 10)
  ────────────────────────────────────────────────────────
    🔴  1.  45.2 [████████████████████░░] src/core/engine.py
    🟠  2.  28.7 [█████████████░░░░░░░░░] src/api/handler.js
    🟡  3.  12.4 [██████░░░░░░░░░░░░░░░░] src/utils/parser.py

  🔮 PREDICTIONS (12 weeks forward)
  ────────────────────────────────────────────────────────
    Avg complexity:   18.5
    Debt lines:       2450
    Confidence:       moderate

  💡 RECOMMENDED INTERVENTIONS
  ────────────────────────────────────────────────────────
    🔴 [CRITICAL] src/core/engine.py
       Action: refactor
       break into smaller functions/modules; stabilize — changes are volatile

🧬 CodeDNA Fingerprinter

Create unique DNA fingerprints for codebases — identify projects, detect forks, spot cloned code.

# Generate fingerprint with ASCII barcode
codevista dna ./my-project/

# Save fingerprint for later comparison
codevista dna ./my-project/ --save fingerprint.json

# Compare two projects
codevista dna ./project-a/ --compare fingerprint.json

# Detect cloned files
codevista dna ./my-project/ --clones

What it captures:

ComponentDescription
Hash PatternsSHA-based profile of code structure patterns
Language DistributionLanguage mix signature
Complexity DistributionComplexity bucket fingerprint
Dependency TopologyImport graph topology hash
Naming ConventionscamelCase/snake_case/PascalCase ratios
Comment DensityDocumentation coverage fingerprint
Function SizeFunction size distribution
File SizeFile size distribution
Clone DetectionExact and near-clone detection via block hashing

Barcode Example:

  ┌─────────────────────────────────────────────────────┐
  │              🧬 CodeDNA Barcode                     │
  ├─────────────────────────────────────────────────────┤
  │  ▓▓▒▒░░████▓▓▒░████░▒▒▓▓████░░▒▒▓▓░░████▒▒░░████│
  │  ██▓▓░░▒▒████░░▓▓██▒▒░░▓▓▒▒████░░▓▓██▒▒░░▓▓▒▒░░░│
  │  ░░▒▒██▓▓░░▒▒████░░▓▓██▒▒████░░▓▓░░▒▒████░░▓▓██▓▓│
  │  ░░████░░▓▓▒▒██▓▓░░▒▒████░░▓▓░░████░░▒▒██▓▓░░▒▒░░│
  ├─────────────────────────────────────────────────────┤
  │  Project: my-project                    files:   42│
  │  Languages: Python 45.2%, JS 30.1%, HTML 15.3%    │
  │  Naming: snake_case                                   │
  │  Hash: a3f7c2b1e9d04586                              │
  └─────────────────────────────────────────────────────┘

  Compact: [█████░░████░░░░████████░░██░░░░████░░████░░]
  a3f7c2b1e9d045867f2a9c3d1e8b4f6a...

📏 Lint Rules

CodeVista includes 36 language-specific lint rules across 5 languages, enforcing popular style guides:

# Lint entire project
codevista lint ./my-project/

# Lint specific file
codevista lint ./src/app.py

# Filter by language
codevista lint ./project/ -l python -l javascript

# Filter by severity
codevista lint ./project/ -s error -s warning

# Include/exclude specific rules
codevista lint ./project/ --include-rule PY001 --exclude-rule PY010

# JSON output for CI
codevista lint ./project/ --json

# List all available rules
codevista lint --rules

Supported Languages & Rules

LanguageStyle GuideRulesSeverity
PythonPEP 8 / BlackPY001–PY011 (11 rules)error/warning/info
JavaScriptAirbnbJS001–JS009 (9 rules)error/warning/info
TypeScriptAirbnb (shared)JS001–JS009 (9 rules)error/warning/info
GogofmtGO001–GO005 (5 rules)error/warning
Rustclippy-liteRS001–RS005 (5 rules)error/warning/info
JavaGoogle StyleJA001–JA006 (6 rules)error/warning/info

Python (PEP 8 / Black)

RuleSeverityDescription
PY001warningMax line length (88 for Black)
PY002errorNo wildcard imports (from x import *)
PY003infoImport order: stdlib → third-party → local, alphabetized
PY004infoTwo blank lines before top-level definitions
PY005infoOne blank line before methods
PY006infoSpaces around operators
PY007infoPrefer f-strings over .format() / %-formatting
PY008infoType hints on public functions
PY009warningNaming conventions (snake_case, PascalCase, UPPER_CASE)
PY010infoNo trailing whitespace
PY011warningNo multiple statements on one line

JavaScript/TypeScript (Airbnb)

RuleSeverityDescription
JS001errorNo var — use const or let
JS002infoPrefer template literals over string concatenation
JS003infoUse arrow functions for callbacks
JS004warningUse === instead of ==
JS005warning2-space indentation (no tabs)
JS006warningNo unused variables
JS007infoPrefer destructuring for repeated property access
JS008infoUse object shorthand syntax
JS009infoTrailing comma conventions

Go (gofmt)

RuleSeverityDescription
GO001errorTab indentation required
GO002errorNo unused imports
GO003warningExported names must have doc comment
GO004errorError handling — do not discard errors
GO005warningNo variable shadowing in inner scopes

Rust (clippy-lite)

RuleSeverityDescription
RS001errorNo .unwrap() in production code
RS002warningUse Option/Result properly (no is_some().unwrap())
RS003errorNo mutable statics
RS004infoLint suppressions should be avoided
RS005errorNaming conventions (snake_case functions/vars)

Java (Google Style)

RuleSeverityDescription
JA001error4-space indentation (no tabs)
JA002warningJavadoc on public methods
JA003errorNo wildcard imports
JA004errorBraces required for control statements
JA005warningCatch specific exceptions
JA006infoUse logger instead of System.out.print

Exit Codes

CodeMeaning
0Clean — no violations
2Errors found

📤 Export Formats

Export analysis results in multiple formats for different use cases:

FormatUse CaseCommand
HTMLInteractive report in browsercodevista export . -f html
JSONProgrammatic access, APIscodevista export . -f json
MarkdownDocumentation, READMEs, wikiscodevista export . -f markdown
SARIFGitHub Code Scanning, CI/CDcodevista export . -f sarif
CSVSpreadsheets, data analysiscodevista export . -f csv
YAMLCODE_METRICS formatcodevista export . -f yaml
PDFPrintable reportscodevista export . -f pdf
All formatsEverything at oncecodevista export . --all
# CI integration with GitHub Code Scanning
codevista export ./project/ -f sarif -o results.sarif.json

# Export everything
codevista export ./project/ -o ./reports/codevista --all

🔌 CI/CD Integration

CodeVista provides dedicated CI output formats with threshold-based pass/fail.

Supported Formats

FormatPlatformCommand
SARIFGitHub Code Scanningcodevista ci-output . -f sarif
GitLab Code QualityGitLabcodevista ci-output . -f gitlab
Checkstyle XMLJenkins, GitHub Actionscodevista ci-output . -f checkstyle
JUnit XMLAny CI with JUnit supportcodevista ci-output . -f junit
MarkdownPR commentscodevista ci-output . -f markdown
TerminalQuick terminal outputcodevista ci-output . -f terminal

Exit Codes

CodeMeaningDescription
0CleanAll thresholds passed
1WarningsMedium-severity threshold violations
2ErrorsHigh-severity violations (health, complexity)
3CriticalCritical security issues or severe degradation

Threshold Configuration

Create .codevista.json in your project root:

{
  "max_security_critical": 0,
  "max_security_high": 0,
  "max_security_medium": 5,
  "max_security_total": 10,
  "max_avg_complexity": 10,
  "max_technical_debt_ratio": 0.25,
  "min_health_score": 60,
  "max_duplicates": 10,
  "max_circular_deps": 0,
  "max_todo_count": 50
}
# Run with exit codes (CI will fail if thresholds violated)
codevista ci-output ./project/ -f sarif -o results.sarif.json
echo "Exit code: $?"  # 0=clean, 1=warnings, 2=errors, 3=critical

🐳 Docker

# Build
docker build -t codevista .

# Analyze a project
docker run --rm -v $(pwd):/workspace codevista analyze /workspace

# Use docker-compose
docker-compose up

The Docker image uses multi-stage builds for minimal size, runs as non-root, and includes wkhtmltopdf for PDF export.

🎨 Report Features

  • Single HTML file — share anywhere, works offline forever
  • Dark/light mode toggle
  • Interactive tables — sort by any column, filter by language, search
  • Inline SVG charts — no external JS libraries
  • Collapsible sections
  • Print-friendly
  • Responsive — works on mobile

🏆 Comparison

FeatureCodeVistaSonarQubeCodeClimatelizard
Setuppip installDocker/ServerSaaS / CLIpip install
DependenciesZeroHeavy (Java + DB)Docker (CLI)None
OutputSingle HTMLWeb UIWeb UICLI text
Offline
Security scan✅ 60+ patterns✅ extensive✅ plugins
Git analysis
Visual charts✅ inline SVG
Code smell detection✅ 19 categories✅ extensive✅ maintainability
Architecture patterns12+ patterns
Code age analysisPartial
SARIF export
CostFreeFree/PaidPaidFree
Server neededNoYesYesNo

Note: SonarQube and CodeClimate are mature enterprise tools with deeper language coverage and IDE integrations. CodeVista differentiates by being zero-setup, offline-capable, and producing shareable single-file HTML reports — ideal for quick audits, CI pipelines, and open-source projects.

💎 What Makes CodeVista Unique

  1. Zero dependencies — pure Python stdlib, no pip install headaches
  2. Single HTML output — share one file, works offline forever, no server
  3. Code smell detection — 19 smell categories with AST-level Python analysis
  4. Architecture pattern detection — identifies 12+ patterns from structure + code
  5. Code age × risk correlation — statistical analysis of age, complexity, and churn
  6. Multi-format export — HTML, JSON, Markdown, SARIF, CSV, YAML, PDF
  7. Docker support — multi-stage build, non-root user, PDF-ready
  8. Beautiful design — dark mode, glassmorphism, inline SVG charts, animations
  9. Works on any codebase — 65+ languages, no configuration needed
  10. CI/CD ready — SARIF export for GitHub Code Scanning integration

🏗️ Architecture

codevista/
├── cli.py            # CLI interface (argparse)
├── analyzer.py       # Core analysis engine
├── report.py         # HTML report generator
├── metrics.py        # Health scores & recommendations
├── smells.py         # Code smell detection (19 categories)
├── architecture.py   # Architecture pattern detector
├── code_age.py       # Code age & risk analysis
├── export.py         # Multi-format export (HTML/JSON/MD/SARIF/CSV/YAML/PDF)
├── security.py       # Secret/vulnerability scanning
├── dependencies.py   # Dependency parsing & analysis
├── git_analysis.py   # Git stats extraction
├── trends.py         # Trend analysis & snapshot tracking
├── team.py           # Team metrics & collaboration analysis
├── integrations.py   # CI/CD output (SARIF, Checkstyle, JUnit, GitLab)
├── decay.py          # Architectural decay detector
├── codedna.py        # CodeDNA fingerprinter
├── lint_rules.py     # Language-specific lint rules (PEP 8, Airbnb, gofmt, clippy, Google)
├── languages.py      # Language definitions & colors
├── config.py         # Configuration & ignore patterns
├── utils.py          # Utilities & color schemes
└── templates/        # HTML templates

🛠️ Tech Stack

  • Python 3.9+ (stdlib only)
  • Inline SVG for all charts
  • CSS custom properties for theming
  • Vanilla JavaScript for interactivity
  • AST parsing for deep code analysis (Python)

🤝 Contributing

  1. Fork it
  2. Create your feature branch (git checkout -b feature/amazing)
  3. Commit your changes (git commit -m 'Add amazing feature')
  4. Push to the branch (git push origin feature/amazing)
  5. Open a Pull Request

⭐ Star History

Star History

📄 License

MIT © 2026 — see LICENSE

💡 Why CodeVista?

  • Zero dependencies — Pure Python, no Node.js, no databases, no external tools
  • 65+ languages — Works with virtually any codebase out of the box
  • Stunning HTML reports — Beautiful, interactive reports you'll actually want to read
  • Security-first — 60+ secret detection patterns including Stripe, AWS, GitHub tokens
  • Unique features — CodeDNA fingerprinting and architectural decay detection (no other tool has this)
  • CI/CD ready — SARIF, Checkstyle, and JUnit XML output formats

👥 Use Cases

Use CaseHow
Individual DevelopersGet a health score for your project, find security issues
Engineering TeamsTrack code quality trends, compare team member metrics
CI/CD PipelinesGenerate SARIF reports for GitHub Code Scanning
Open Source MaintainersAnalyze PR quality, detect code smells automatically
Code ReviewsGet automated feedback on architecture, complexity, and duplication
EducationTeach code quality concepts with visual, interactive reports

🔗 Other Projects

Check out more open-source tools:

ProjectDescriptionStars
🛡️ AI Code Trust ValidatorDetect security flaws, hallucinations & logic errors in AI-generated codeStars
🤖 TermMindAI-powered terminal assistant with 7 providersStars

🌐 Connect

  • GitHub
  • LinkedIn
  • X/Twitter
  • Facebook
  • YouTube
  • Dev.to
  • ResearchGate

Built with ❤️ by rudra496 · LinkedIn
MIT License · Free & Open Source Forever


More Open Source Projects

ProjectStarsDescription
StealthHumanizerStarsFree AI text humanizer — 13 providers, no login
EdgeBrainStarsEdge AI inference — sub-100ms, no cloud
DevRoadmapsStars17 career paths, 1700+ free resources
Nexus AgentStarsSelf-evolving local AI agent framework
MindWellStarsFree mental health support platform
ScienceLab 3DStars40+ virtual STEM experiments
SightlineAIStarsAI smart glasses for the blind

⭐ Star this repo · 🍴 Fork it · 👤 Follow @rudra496

Connect

  • GitHub
  • LinkedIn
  • X/Twitter
  • YouTube
  • Dev.to