{"id":30907483,"url":"https://github.com/ericschmar/moribito","last_synced_at":"2026-02-19T16:34:19.038Z","repository":{"id":310893145,"uuid":"1041519299","full_name":"ericschmar/moribito","owner":"ericschmar","description":null,"archived":false,"fork":false,"pushed_at":"2026-01-10T20:31:39.000Z","size":12086,"stargazers_count":270,"open_issues_count":7,"forks_count":6,"subscribers_count":1,"default_branch":"develop","last_synced_at":"2026-01-12T01:53:03.654Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://ericschmar.github.io/moribito","language":"Kotlin","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/ericschmar.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"docs/contributing.md","funding":".github/FUNDING.yml","license":"LICENSE.md","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},"funding":{"buy_me_a_coffee":"ericschmar"}},"created_at":"2025-08-20T15:51:51.000Z","updated_at":"2026-01-10T20:31:42.000Z","dependencies_parsed_at":"2025-08-22T20:55:45.014Z","dependency_job_id":null,"html_url":"https://github.com/ericschmar/moribito","commit_stats":null,"previous_names":["ericschmar/ldap-cli","ericschmar/moribito"],"tags_count":9,"template":false,"template_full_name":null,"purl":"pkg:github/ericschmar/moribito","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ericschmar%2Fmoribito","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ericschmar%2Fmoribito/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ericschmar%2Fmoribito/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ericschmar%2Fmoribito/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ericschmar","download_url":"https://codeload.github.com/ericschmar/moribito/tar.gz/refs/heads/develop","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ericschmar%2Fmoribito/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29622022,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-19T13:04:20.082Z","status":"ssl_error","status_checked_at":"2026-02-19T13:03:33.775Z","response_time":117,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: 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":[],"created_at":"2025-09-09T13:02:29.102Z","updated_at":"2026-02-19T16:34:18.981Z","avatar_url":"https://github.com/ericschmar.png","language":"Kotlin","funding_links":["https://buymeacoffee.com/ericschmar"],"categories":["Go","Kotlin","Table of Contents"],"sub_categories":[],"readme":"# 森人 - Mori-bito (forest-person)\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://github.com/user-attachments/assets/4e49f166-1129-4224-ab9a-bc29e13b2791\" alt=\"Mori-bito - Forest Person\" width=\"400\"/\u003e\n\u003c/p\u003e\n\nA terminal-based LDAP server explorer built with Go and BubbleTea, providing an interactive interface for browsing LDAP directory trees, viewing records, and executing custom queries.\n\n## Features\n\n-   🌲 **Interactive Tree Navigation**: Browse LDAP directory structure with keyboard/mouse\n-   📄 **Record Viewer**: View detailed LDAP entry attributes\n-   📋 **Clipboard Integration**: Copy attribute values to system clipboard\n-   🔍 **Custom Query Interface**: Execute custom LDAP queries with real-time results\n-   📖 **Paginated Results**: Efficient pagination for large result sets with automatic loading\n-   ⚙️ **Flexible Configuration**: Support for config files and command-line options\n-   🔐 **Secure Authentication**: Support for SSL/TLS and various authentication methods\n-   🔄 **Auto-Update Notifications**: Optional checking for newer releases from GitHub\n-   🎨 **Modern TUI**: Clean, intuitive interface built with BubbleTea\n-   🔀 **Multiple Connections**: Save and switch between multiple LDAP server configurations\n\n## Screenshots\n\n### Main Interface\n\n![Start Screen](screenshots/start.png)\n_Initial startup screen with connection options_\n\n### Adding Connections\n\n![Add Interface](screenshots/add.png)\n_Interface for adding new LDAP Connections\n\n### Interactive Tree Navigation\n\n![Tree View](screenshots/tree.png)\n_Browse LDAP directory structure with keyboard/mouse navigation_\n\n### Record Viewer\n\n![Record View](screenshots/record.png)\n_View detailed LDAP entry attributes with clipboard integration_\n\n### Custom Query Interface\n\n![Query View](screenshots/query.png)\n_Execute custom LDAP queries with real-time results and formatting_\n\n## Installation\n\n### Homebrew (Recommended for macOS/Linux)\n\n```bash\nbrew install moribito\n```\n\n### Arch Linux (AUR)\n\n#### Last Release\n```bash\nyay -S moribito\n```\n\n#### Development Version\n```bash\nyay -S moribito-git\n```\nPKGBUILDS are available here:\n - https://aur.archlinux.org/packages/moribito\n - https://aur.archlinux.org/packages/moribito-git\n\n### From GitHub Releases\n\nDownload the latest pre-built binary from [GitHub Releases](https://github.com/ericschmar/moribito/releases):\n\n#### Option 1: Quick Install Scripts (Recommended)\n\n**Linux/Unix:**\n\n```bash\ncurl -sSL https://raw.githubusercontent.com/ericschmar/moribito/main/scripts/install.sh | bash\n```\n\n**macOS:**\n\n```bash\ncurl -sSL https://raw.githubusercontent.com/ericschmar/moribito/main/scripts/install-macos.sh | bash\n```\n\n**Windows (PowerShell):**\n\n```powershell\nirm https://raw.githubusercontent.com/ericschmar/moribito/main/scripts/install.ps1 | iex\n```\n\nThe install scripts will:\n\n-   Download the appropriate binary for your platform\n-   Install it to the system PATH\n-   Create OS-specific configuration directories\n-   Generate sample configuration files\n\n#### Option 2: Manual Download\n\n```bash\n# Linux x86_64\ncurl -L https://github.com/ericschmar/moribito/releases/latest/download/moribito-linux-amd64 -o moribito\nchmod +x moribito\nsudo mv moribito /usr/local/bin/\n\n# Linux ARM64\ncurl -L https://github.com/ericschmar/moribito/releases/latest/download/moribito-linux-arm64 -o moribito\nchmod +x moribito\nsudo mv moribito /usr/local/bin/\n\n# macOS Intel\ncurl -L https://github.com/ericschmar/moribito/releases/latest/download/moribito-darwin-amd64 -o moribito\nchmod +x moribito\nsudo mv moribito /usr/local/bin/\n\n# macOS Apple Silicon\ncurl -L https://github.com/ericschmar/moribito/releases/latest/download/moribito-darwin-arm64 -o moribito\nchmod +x moribito\nsudo mv moribito /usr/local/bin/\n```\n\nFor Windows, download `moribito-windows-amd64.exe` from the releases page.\n\n\u003e **Note**: Homebrew is also available for Windows via WSL (Windows Subsystem for Linux). If you have WSL installed, you can use the Homebrew installation method above.\n\n### From Source\n\n```bash\ngit clone https://github.com/ericschmar/moribito\ncd moribito\ngo build -o moribito cmd/moribito/main.go\n```\n\n## Usage\n\n### Command Line Options\n\n```bash\n# Connect with command line options\nmoribito -host ldap.example.com -base-dn \"dc=example,dc=com\" -user \"cn=admin,dc=example,dc=com\"\n\n# Enable automatic update checking\nmoribito -check-updates -host ldap.example.com -base-dn \"dc=example,dc=com\"\n\n# Use a configuration file\nmoribito -config /path/to/config.yaml\n\n# Get help\nmoribito -help\n```\n\n### Configuration File\n\nMoribito will automatically look for configuration files in OS-specific locations:\n\n**Linux/Unix:**\n\n-   `~/.config/moribito/config.yaml` (XDG config directory)\n-   `~/.moribito/config.yaml` (user directory)\n-   `~/.moribito.yaml` (user home file)\n\n**macOS:**\n\n-   `~/.moribito/config.yaml` (user directory)\n-   `~/Library/Application Support/moribito/config.yaml` (macOS standard)\n-   `~/.moribito.yaml` (user home file)\n\n**Windows:**\n\n-   `%APPDATA%\\moribito\\config.yaml` (Windows standard)\n-   `%USERPROFILE%\\.moribito.yaml` (user home file)\n\n**All platforms also check:**\n\n-   `./config.yaml` (current directory)\n\n#### Creating Configuration\n\nUse the built-in command to create a configuration file:\n\n```bash\nmoribito --create-config\n```\n\nOr manually create a configuration file:\n\n```yaml\nldap:\n    host: \"ldap.example.com\"\n    port: 389\n    base_dn: \"dc=example,dc=com\"\n    use_ssl: false\n    use_tls: false\n    bind_user: \"cn=admin,dc=example,dc=com\"\n    bind_pass: \"your-password\"\npagination:\n    page_size: 50 # Number of entries per page\nretry:\n    enabled: true # Connection retries (default: true)\n    max_attempts: 3 # Retry attempts (default: 3)\n    initial_delay_ms: 500 # Initial delay (default: 500)\n    max_delay_ms: 5000 # Max delay cap (default: 5000)\n```\n\n## Navigation\n\n### General Controls\n\n-   **Tab** - Switch between views (Tree → Record → Query → Tree)\n-   **1/2/3** - Jump directly to Tree/Record/Query view\n-   **q** - Quit application\n\n### Tree View\n\n-   **↑/↓** or **k/j** - Navigate up/down\n-   **Page Up/Down** - Navigate by page\n-   **Home/End** - Jump to top/bottom\n-   **→** or **l** - Expand node (load children)\n-   **←** or **h** - Collapse node\n-   **Enter** - View record details\n\n### Record View\n\n-   **↑/↓** or **k/j** - Scroll up/down\n-   **Page Up/Down** - Scroll by page\n-   **Home/End** - Jump to top/bottom\n-   **c** - Copy current attribute value to clipboard\n\n### Query View\n\n-   **/** or **Escape** - Focus query input\n-   **Ctrl+Enter** or **Ctrl+J** - Execute query\n-   **Ctrl+F** - Format query with proper indentation\n-   **Escape** - Clear query\n-   **Ctrl+V** - Paste from clipboard\n-   **↑/↓** - Navigate results (when not in input mode)\n-   **Page Up/Down** - Navigate by page (automatically loads more results)\n-   **Enter** - View selected record\n\n\u003e **Note**: The Query View uses automatic pagination to efficiently handle large result sets. When you scroll near the end of loaded results, the next page is automatically fetched from the LDAP server.\n\n#### Query Formatting\n\nThe **Ctrl+F** key combination formats complex LDAP queries with proper indentation for better readability:\n\n```\n# Before formatting:\n(\u0026(objectClass=person)(|(cn=john*)(sn=smith*))(department=engineering))\n\n# After formatting (Ctrl+F):\n(\u0026\n  (objectClass=person)\n  (|\n    (cn=john*)\n    (sn=smith*)\n  )\n  (department=engineering)\n)\n```\n\n## Authentication Methods\n\nThe tool supports various LDAP authentication methods:\n\n### Simple Bind\n\n```yaml\nbind_user: \"cn=admin,dc=example,dc=com\"\nbind_pass: \"password\"\n```\n\n### OU-based Authentication\n\n```yaml\nbind_user: \"uid=john,ou=users,dc=example,dc=com\"\nbind_pass: \"password\"\n```\n\n### Active Directory Style\n\n```yaml\nbind_user: \"john@example.com\"\nbind_pass: \"password\"\n```\n\n### Anonymous Bind\n\n```yaml\n# Leave bind_user and bind_pass empty or omit them\n```\n\n## Security Options\n\n### SSL/LDAPS (Port 636)\n\n```yaml\nldap:\n    host: \"ldaps.example.com\"\n    port: 636\n    use_ssl: true\n```\n\n### StartTLS (Port 389)\n\n```yaml\nldap:\n    host: \"ldap.example.com\"\n    port: 389\n    use_tls: true\n```\n\n## Query Examples\n\nIn the Query view, you can execute custom LDAP filters:\n\n-   `(objectClass=*)` - All objects\n-   `(objectClass=person)` - All person objects\n-   `(cn=john*)` - Objects with cn starting with \"john\"\n-   `(\u0026(objectClass=person)(mail=*@example.com))` - People with example.com emails\n-   `(|(cn=admin)(uid=admin))` - Objects with cn=admin OR uid=admin\n\n### Complex Query Formatting\n\nFor complex nested queries, use **Ctrl+F** to automatically format them for better readability:\n\n**Simple queries remain unchanged:**\n\n```\n(objectClass=person)\n```\n\n**Complex queries are formatted with proper indentation:**\n\n```\n# Original\n(\u0026(objectClass=person)(|(cn=john*)(sn=smith*))(department=engineering))\n\n# After Ctrl+F\n(\u0026\n  (objectClass=person)\n  (|\n    (cn=john*)\n    (sn=smith*)\n  )\n  (department=engineering)\n)\n```\n\n## Performance \u0026 Pagination\n\nLDAP CLI uses intelligent pagination to provide optimal performance when working with large directories:\n\n### Automatic Pagination\n\n-   **Default Page Size**: 50 entries per page\n-   **Configurable**: Adjust via config file or `--page-size` flag\n-   **On-Demand Loading**: Next pages load automatically as you scroll\n-   **Memory Efficient**: Only loaded entries are kept in memory\n\n### Configuration Examples\n\n```bash\n# Command line override\nmoribito --page-size 100 --host ldap.example.com\n\n# Configuration file\npagination:\n  page_size: 25  # Smaller pages for slower networks\n```\n\n### Performance Tips\n\n-   **Smaller page sizes** (10-25) for slower networks or limited LDAP servers\n-   **Larger page sizes** (100-200) for fast networks and powerful LDAP servers\n-   **Use specific queries** to reduce result sets instead of browsing all entries\n\n## Connection Reliability \u0026 Retries\n\nLDAP CLI includes automatic retry functionality to handle connection failures gracefully:\n\n### Automatic Retries\n\n-   **Default**: Enabled with 3 retry attempts\n-   **Exponential Backoff**: Delay doubles between attempts (500ms → 1s → 2s → ...)\n-   **Connection Recovery**: Automatically re-establishes broken connections\n-   **Smart Detection**: Only retries connection-related errors, not authentication failures\n\n### Configuration Examples\n\n```bash\n# Default retry settings (automatically applied)\n# No configuration needed - retries work out of the box\n```\n\n```yaml\n# Custom retry configuration\nretry:\n    enabled: true\n    max_attempts: 5 # Maximum retry attempts (default: 3)\n    initial_delay_ms: 1000 # Initial delay in milliseconds (default: 500)\n    max_delay_ms: 10000 # Maximum delay cap (default: 5000)\n```\n\n```yaml\n# Disable retries if needed\nretry:\n    enabled: false\n```\n\n### Retryable Conditions\n\nThe system automatically retries for:\n\n-   **Network timeouts** and connection drops\n-   **Connection refused** errors\n-   **Server unavailable** responses\n-   **Connection reset** by peer\n-   **LDAP server down** errors\n\nAuthentication errors, invalid queries, and permission issues are **not** retried.\n\n## Development\n\n### Building\n\n```bash\n# Build for current platform\nmake build\n\n# Build for all platforms\nmake build-all\n\n# Clean build artifacts\nmake clean\n```\n\n### Code Quality\n\n```bash\n# Format code\nmake fmt\n\n# Run linter\nmake lint\n\n# Run tests\nmake test\n\n# Run all CI checks (format, lint, test, build)\nmake ci\n```\n\n### Testing\n\n```bash\ngo test ./...\n```\n\n### Continuous Integration\n\nThis project uses GitHub Actions for CI/CD:\n\n-   **CI Workflow**: Runs on every push and pull request to `main` and `develop` branches\n\n    -   Code formatting verification\n    -   Linting (with warnings)\n    -   Testing\n    -   Building for current platform\n    -   Multi-platform build artifacts (on main branch pushes)\n\n-   **Release Workflow**: Triggered by version tags (e.g., `v1.0.0`)\n    -   Runs full CI checks\n    -   Builds for all platforms (Linux amd64/arm64, macOS amd64/arm64, Windows amd64)\n    -   Creates GitHub releases with binaries and checksums\n    -   Generates installation instructions\n\n### Dependencies\n\n-   [BubbleTea](https://github.com/charmbracelet/bubbletea) - TUI framework\n-   [Lipgloss](https://github.com/charmbracelet/lipgloss) - Styling\n-   [go-ldap](https://github.com/go-ldap/ldap) - LDAP client\n-   [golang.org/x/term](https://golang.org/x/term) - Terminal utilities\n\n### Homebrew Distribution\n\nThis project includes full Homebrew support for easy installation on macOS and Linux. See the [homebrew/](homebrew/) directory for:\n\n-   Ready-to-use Homebrew formula\n-   Formula generation and maintenance scripts\n-   Documentation for creating custom taps\n-   Instructions for submitting to homebrew-core\n\n### Versioning\n\nThis project follows [Semantic Versioning](https://semver.org/). See [docs/versioning.md](docs/versioning.md) for details on the release process.\n\n## Documentation\n\nComprehensive documentation is available using DocPress. To build and view the documentation:\n\n```bash\n# Build static documentation website\nmake docs\n\n# Serve documentation locally with live reload\nmake docs-serve\n```\n\nThe documentation covers:\n\n-   Installation and setup\n-   Usage guide with examples\n-   Interface navigation\n-   Development setup\n-   Contributing guidelines\n-   API reference and advanced features\n\nVisit the generated documentation site for the complete guide.\n\n## Contributing\n\n1. Fork the repository\n2. Create your feature branch (`git checkout -b feature/amazing-feature`)\n3. Commit your changes (`git commit -m 'Add some amazing feature'`)\n4. Push to the branch (`git push origin feature/amazing-feature`)\n5. Open a Pull Request\n\n## License\n\nThis project is licensed under the MIT License - see the LICENSE file for details.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fericschmar%2Fmoribito","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fericschmar%2Fmoribito","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fericschmar%2Fmoribito/lists"}