{
  "name": "KalkuNet Calc API Catalog",
  "version": "1.0.0",
  "totalTools": 47,
  "canonicalOrigin": "https://kalkunet.com",
  "documentation": "https://kalkunet.com/id/api/",
  "supportEmail": "admin@kalkunet.com",
  "sponsor": {
    "name": "PT Solusi Tekno Digital",
    "url": "https://solusitekno.web.id"
  },
  "tools": [
    {
      "id": "subnet-calculator",
      "slug": "subnet-calculator",
      "category": "network",
      "title": {
        "id": "Kalkulator Subnet IPv4 dan CIDR",
        "en": "IPv4 Subnet and CIDR Calculator"
      },
      "description": {
        "id": "Hitung alamat network, broadcast, rentang host usable, netmask, wildcard, biner mask, dan tipe alamat IPv4 (RFC 1918, RFC 3021 /31, CGNAT).",
        "en": "Calculate IPv4 network address, broadcast, usable host range, netmask, wildcard, binary mask, and RFC address type (RFC 1918, /31, CGNAT)."
      },
      "canonicalId": "https://kalkunet.com/id/tools/subnet-calculator",
      "canonicalEn": "https://kalkunet.com/en/tools/subnet-calculator",
      "inputs": [
        {
          "key": "ip",
          "label": {
            "id": "Alamat IPv4 (atau IP/CIDR, IP + Netmask, IP + Wildcard)",
            "en": "IPv4 Address (or IP/CIDR, IP + Netmask, IP + Wildcard)"
          },
          "type": "text",
          "defaultValue": "192.168.1.10"
        },
        {
          "key": "prefix",
          "label": {
            "id": "Prefix CIDR (/0 – /32)",
            "en": "CIDR Prefix (/0 – /32)"
          },
          "type": "number",
          "defaultValue": 24,
          "min": 0,
          "max": 32,
          "step": 1
        }
      ],
      "formulas": {
        "id": [
          "Network Address = IP Address AND Subnet Mask",
          "Wildcard Mask = NOT (Subnet Mask)",
          "Broadcast Address = Network Address OR Wildcard Mask",
          "Total Alamat = 2^(32 − Prefix)",
          "Usable Hosts = 2^(32 − Prefix) − 2 (untuk /0 s.d. /30), 2 alamat untuk /31 (RFC 3021), dan 1 alamat untuk /32"
        ],
        "en": [
          "Network Address = IP Address AND Subnet Mask",
          "Wildcard Mask = NOT (Subnet Mask)",
          "Broadcast Address = Network Address OR Wildcard Mask",
          "Total Addresses = 2^(32 − Prefix)",
          "Usable Hosts = 2^(32 − Prefix) − 2 (for /0 to /30), 2 addresses for /31 (RFC 3021), and 1 address for /32"
        ]
      }
    },
    {
      "id": "vlsm-calculator",
      "slug": "vlsm-calculator",
      "category": "network",
      "title": {
        "id": "Kalkulator VLSM dan Pemecah Subnet IPv4",
        "en": "IPv4 Subnet Split and VLSM Planner"
      },
      "description": {
        "id": "Pecah blok jaringan IPv4 menjadi N subnet sama besar atau alokasikan subnet VLSM berdasarkan kebutuhan host terbesar dengan ekspor CSV/Markdown.",
        "en": "Split an IPv4 network into N equal subnets or allocate boundary-aligned VLSM blocks by required host count with CSV and Markdown export."
      },
      "canonicalId": "https://kalkunet.com/id/tools/vlsm-calculator",
      "canonicalEn": "https://kalkunet.com/en/tools/vlsm-calculator",
      "inputs": [
        {
          "key": "network",
          "label": {
            "id": "Network Induk (CIDR)",
            "en": "Parent Network (CIDR)"
          },
          "type": "text",
          "defaultValue": "192.168.10.0/24"
        },
        {
          "key": "mode",
          "label": {
            "id": "Mode Perencanaan",
            "en": "Planning Mode"
          },
          "type": "select",
          "defaultValue": "vlsm",
          "options": [
            {
              "value": "vlsm",
              "label": {
                "id": "Mode B — Alokasi VLSM berdasarkan Jumlah Host",
                "en": "Mode B — VLSM Allocation by Host Count"
              }
            },
            {
              "value": "equal",
              "label": {
                "id": "Mode A — Bagi Rata menjadi N Subnet",
                "en": "Mode A — Split into N Equal Subnets"
              }
            }
          ]
        },
        {
          "key": "requirements",
          "label": {
            "id": "Kebutuhan Host per Segmen (Mode B VLSM)",
            "en": "Host Requirements per Segment (Mode B VLSM)"
          },
          "type": "text",
          "defaultValue": "Staff:100, Voice:50, CCTV:25, WAN:2"
        },
        {
          "key": "splitCount",
          "label": {
            "id": "Jumlah Subnet N (Mode A Equal Split)",
            "en": "Number of Equal Subnets N (Mode A)"
          },
          "type": "number",
          "defaultValue": 4,
          "min": 1,
          "max": 1024,
          "step": 1
        }
      ],
      "formulas": {
        "id": [
          "Ukuran Blok (Block Size) = 2^h terkecil di mana (2^h − 2) ≥ Host Dibutuhkan (minimal 4 alamat /30)",
          "Prefix Subnet Anak = 32 − log2(Block Size)",
          "Batas Alamat Awal (Boundary Alignment) = ceil(Cursor / Block Size) × Block Size",
          "Sisa Host Kosong (Unused) = Usable Hosts − Required Hosts",
          "Utilisasi (%) = (Required Hosts ÷ Usable Hosts) × 100%"
        ],
        "en": [
          "Block Size = smallest 2^h where (2^h − 2) ≥ Required Hosts (minimum 4 addresses /30)",
          "Child Prefix Length = 32 − log2(Block Size)",
          "Aligned Start Address = ceil(Cursor / Block Size) × Block Size",
          "Unused Hosts = Usable Hosts − Required Hosts",
          "Utilization (%) = (Required Hosts ÷ Usable Hosts) × 100%"
        ]
      }
    },
    {
      "id": "ipv6-subnet-calculator",
      "slug": "ipv6-subnet-calculator",
      "category": "network",
      "title": {
        "id": "Kalkulator Subnet IPv6 dan Perencana Prefix (/48, /56, /64)",
        "en": "IPv6 Subnet Calculator and Prefix Planner (/48, /56, /64)"
      },
      "description": {
        "id": "Ekspansi dan kompresi alamat IPv6 (RFC 5952), hitung prefix network, rentang alamat, jumlah subnet /64 SLAAC, dan pembagian child prefix.",
        "en": "Expand and compress IPv6 addresses per RFC 5952, calculate network prefix boundaries, /64 SLAAC subnet counts, and child prefix blocks."
      },
      "canonicalId": "https://kalkunet.com/id/tools/ipv6-subnet-calculator",
      "canonicalEn": "https://kalkunet.com/en/tools/ipv6-subnet-calculator",
      "inputs": [
        {
          "key": "address",
          "label": {
            "id": "Alamat IPv6 atau Prefix CIDR",
            "en": "IPv6 Address or CIDR Prefix"
          },
          "type": "text",
          "defaultValue": "2001:db8:abcd:12::1"
        },
        {
          "key": "prefix",
          "label": {
            "id": "Panjang Prefix Induk (0–128)",
            "en": "Parent Prefix Length (0–128)"
          },
          "type": "number",
          "defaultValue": 48,
          "min": 0,
          "max": 128,
          "step": 1
        },
        {
          "key": "childPrefix",
          "label": {
            "id": "Target Child Prefix (Pemecahan Subnet)",
            "en": "Target Child Prefix (Subnet Split)"
          },
          "type": "select",
          "defaultValue": "64",
          "options": [
            {
              "value": "48",
              "label": {
                "id": "/48 — Alokasi Site Enterprise",
                "en": "/48 — Enterprise Site Allocation"
              }
            },
            {
              "value": "52",
              "label": {
                "id": "/52 — Zona Gedung / Kampus (16 × /56)",
                "en": "/52 — Building / Campus Zone (16 × /56)"
              }
            },
            {
              "value": "56",
              "label": {
                "id": "/56 — Cabang / CPE (256 × /64)",
                "en": "/56 — Branch / CPE (256 × /64)"
              }
            },
            {
              "value": "60",
              "label": {
                "id": "/60 — Segmen Kecil (16 × /64)",
                "en": "/60 — Small Segment (16 × /64)"
              }
            },
            {
              "value": "64",
              "label": {
                "id": "/64 — Subnet LAN Standar (SLAAC)",
                "en": "/64 — Standard LAN Subnet (SLAAC)"
              }
            },
            {
              "value": "127",
              "label": {
                "id": "/127 — Link Point-to-Point Router (RFC 6164)",
                "en": "/127 — Router Point-to-Point Link (RFC 6164)"
              }
            },
            {
              "value": "128",
              "label": {
                "id": "/128 — Loopback / Host Tunggal",
                "en": "/128 — Loopback / Single Host"
              }
            }
          ]
        }
      ],
      "formulas": {
        "id": [
          "Bit Host (Host Bits) = 128 − Prefix",
          "Prefix Mask = (2^128 − 1) XOR (2^(128 − Prefix) − 1)",
          "Network Address = IPv6 BigInt AND Prefix Mask",
          "Alamat Terakhir = Network Address OR (NOT Prefix Mask)",
          "Jumlah Subnet /64 = 2^(64 − Prefix) untuk Prefix ≤ 64",
          "Jumlah Child Subnet (/Pc) = 2^(Pc − Prefix) untuk Pc ≥ Prefix"
        ],
        "en": [
          "Host Bits = 128 − Prefix",
          "Prefix Mask = (2^128 − 1) XOR (2^(128 − Prefix) − 1)",
          "Network Address = IPv6 BigInt AND Prefix Mask",
          "Last Address = Network Address OR (NOT Prefix Mask)",
          "Number of /64 Subnets = 2^(64 − Prefix) for Prefix ≤ 64",
          "Child Subnet Count (/Pc) = 2^(Pc − Prefix) for Pc ≥ Prefix"
        ]
      }
    },
    {
      "id": "mikrotik-queue-calculator",
      "slug": "mikrotik-queue-calculator",
      "category": "network",
      "title": {
        "id": "Kalkulator Bandwidth MikroTik (Simple Queue, Burst, PCQ, FQ-CoDel)",
        "en": "MikroTik Bandwidth Calculator (Simple Queue, Burst, PCQ, FQ-CoDel)"
      },
      "description": {
        "id": "Hitung Limit-At (CIR), Max-Limit (MIR), Burst, PCQ, dan FQ-CoDel RouterOS v7 lengkap dengan generator script konfigurasi otomatis.",
        "en": "Calculate Limit-At (CIR), Max-Limit (MIR), Burst, PCQ, and FQ-CoDel for RouterOS v7 with automated configuration script generation."
      },
      "canonicalId": "https://kalkunet.com/id/tools/mikrotik-queue-calculator",
      "canonicalEn": "https://kalkunet.com/en/tools/mikrotik-queue-calculator",
      "inputs": [
        {
          "key": "target",
          "label": {
            "id": "Target Jaringan (CIDR) atau Interface",
            "en": "Target Network (CIDR) or Interface"
          },
          "type": "text",
          "defaultValue": "192.168.88.0/24"
        },
        {
          "key": "down",
          "label": {
            "id": "Bandwidth Download ISP (Mbps)",
            "en": "ISP Download Bandwidth (Mbps)"
          },
          "type": "number",
          "defaultValue": 100,
          "min": 1,
          "max": 100000,
          "unit": "Mbps"
        },
        {
          "key": "up",
          "label": {
            "id": "Bandwidth Upload ISP (Mbps)",
            "en": "ISP Upload Bandwidth (Mbps)"
          },
          "type": "number",
          "defaultValue": 40,
          "min": 1,
          "max": 100000,
          "unit": "Mbps"
        },
        {
          "key": "users",
          "label": {
            "id": "Jumlah Total Klien / Perangkat",
            "en": "Total Number of Clients / Devices"
          },
          "type": "number",
          "defaultValue": 30,
          "min": 1,
          "max": 10000,
          "step": 1
        },
        {
          "key": "concurrency",
          "label": {
            "id": "Rasio Konkurensi Klien Aktif (%)",
            "en": "Active Client Concurrency Ratio (%)"
          },
          "type": "number",
          "defaultValue": 50,
          "min": 1,
          "max": 100,
          "unit": "%"
        },
        {
          "key": "mode",
          "label": {
            "id": "Mode Antrean (Queue Strategy)",
            "en": "Queue Mode (Strategy)"
          },
          "type": "select",
          "defaultValue": "simple",
          "options": [
            {
              "value": "simple",
              "label": {
                "id": "Simple Queue + Burst (Per Klien)",
                "en": "Simple Queue + Burst (Per Client)"
              }
            },
            {
              "value": "pcq",
              "label": {
                "id": "PCQ — Per Connection Queue (Otomatis & Merata)",
                "en": "PCQ — Per Connection Queue (Dynamic Fair-Share)"
              }
            },
            {
              "value": "fqcodel",
              "label": {
                "id": "FQ-CoDel — Anti-Bufferbloat (RouterOS v7)",
                "en": "FQ-CoDel — Low-Latency Bufferbloat Mitigation (v7)"
              }
            }
          ]
        },
        {
          "key": "burstPct",
          "label": {
            "id": "Burst Multiplier (% dari Max-Limit)",
            "en": "Burst Multiplier (% of Max-Limit)"
          },
          "type": "number",
          "defaultValue": 150,
          "min": 100,
          "max": 500,
          "unit": "%"
        },
        {
          "key": "thresholdPct",
          "label": {
            "id": "Burst Threshold (% dari Max-Limit)",
            "en": "Burst Threshold (% of Max-Limit)"
          },
          "type": "number",
          "defaultValue": 75,
          "min": 1,
          "max": 100,
          "unit": "%"
        },
        {
          "key": "burstTime",
          "label": {
            "id": "Jendela Burst-Time (Detik)",
            "en": "Burst-Time Window (Seconds)"
          },
          "type": "number",
          "defaultValue": 8,
          "min": 1,
          "max": 300,
          "unit": "s"
        },
        {
          "key": "headroom",
          "label": {
            "id": "Headroom Shaping ISP (%)",
            "en": "ISP Shaping Headroom (%)"
          },
          "type": "number",
          "defaultValue": 95,
          "min": 50,
          "max": 100,
          "unit": "%"
        },
        {
          "key": "startHost",
          "label": {
            "id": "Host Pertama untuk Queue Klien",
            "en": "Start Host Offset for Client Queues"
          },
          "type": "number",
          "defaultValue": 2,
          "min": 1,
          "max": 254
        },
        {
          "key": "parentName",
          "label": {
            "id": "Nama Parent Queue",
            "en": "Parent Queue Name"
          },
          "type": "text",
          "defaultValue": "ST-TOTAL"
        }
      ],
      "formulas": {
        "id": [
          "Shaped Parent Bandwidth = Bandwidth ISP × (Headroom ÷ 100)",
          "Klien Aktif Bersamaan = ceil(Jumlah Klien × (Konkurensi ÷ 100))",
          "Limit-At (CIR) = Shaped Bandwidth ÷ Jumlah Klien",
          "Max-Limit (MIR) = min(Shaped Bandwidth, Shaped Bandwidth ÷ Klien Aktif)",
          "Burst-Limit = Max-Limit × (Burst Multiplier ÷ 100)",
          "Burst-Threshold = Max-Limit × (Threshold % ÷ 100)",
          "Durasi Burst Efektif = (Burst-Time × Burst-Threshold) ÷ Burst-Limit"
        ],
        "en": [
          "Shaped Parent Bandwidth = ISP Bandwidth × (Headroom ÷ 100)",
          "Active Concurrent Clients = ceil(Total Clients × (Concurrency ÷ 100))",
          "Limit-At (CIR) = Shaped Bandwidth ÷ Total Clients",
          "Max-Limit (MIR) = min(Shaped Bandwidth, Shaped Bandwidth ÷ Active Clients)",
          "Burst-Limit = Max-Limit × (Burst Multiplier ÷ 100)",
          "Burst-Threshold = Max-Limit × (Threshold % ÷ 100)",
          "Effective Burst Duration = (Burst-Time × Burst-Threshold) ÷ Burst-Limit"
        ]
      }
    },
    {
      "id": "mikrotik-pcc-calculator",
      "slug": "mikrotik-pcc-calculator",
      "category": "network",
      "title": {
        "id": "Kalkulator Load Balance PCC Multi-WAN MikroTik",
        "en": "MikroTik Multi-WAN PCC Load Balance Calculator"
      },
      "description": {
        "id": "Generator script penyeimbang beban Multi-WAN (2–5 ISP) PCC proporsional dan failover bertingkat rekursif di RouterOS v7.",
        "en": "Multi-WAN (2–5 ISP) proportional PCC load balancing and recursive failover configuration script generator for RouterOS v7."
      },
      "canonicalId": "https://kalkunet.com/id/tools/mikrotik-pcc-calculator",
      "canonicalEn": "https://kalkunet.com/en/tools/mikrotik-pcc-calculator",
      "inputs": [
        {
          "key": "ispCount",
          "label": {
            "id": "Jumlah ISP Provider",
            "en": "Number of ISP Providers"
          },
          "type": "select",
          "defaultValue": "2",
          "options": [
            {
              "value": "2",
              "label": {
                "id": "2 ISP Provider",
                "en": "2 ISP Providers"
              }
            },
            {
              "value": "3",
              "label": {
                "id": "3 ISP Provider",
                "en": "3 ISP Providers"
              }
            },
            {
              "value": "4",
              "label": {
                "id": "4 ISP Provider",
                "en": "4 ISP Providers"
              }
            },
            {
              "value": "5",
              "label": {
                "id": "5 ISP Provider",
                "en": "5 ISP Providers"
              }
            }
          ]
        },
        {
          "key": "mode",
          "label": {
            "id": "Mode Operasi",
            "en": "Operation Mode"
          },
          "type": "select",
          "defaultValue": "pcc",
          "options": [
            {
              "value": "pcc",
              "label": {
                "id": "PCC Load Balance + Recursive Failover",
                "en": "PCC Load Balance + Recursive Failover"
              }
            },
            {
              "value": "failover",
              "label": {
                "id": "Failover Murni (Active-Backup Priority)",
                "en": "Pure Failover (Active-Backup Priority)"
              }
            }
          ]
        },
        {
          "key": "classifier",
          "label": {
            "id": "PCC Classifier",
            "en": "PCC Classifier"
          },
          "type": "select",
          "defaultValue": "both-addresses-and-ports",
          "options": [
            {
              "value": "both-addresses-and-ports",
              "label": {
                "id": "both-addresses-and-ports (Rekomendasi)",
                "en": "both-addresses-and-ports (Recommended)"
              }
            },
            {
              "value": "src-address",
              "label": {
                "id": "src-address (Per IP Klien)",
                "en": "src-address (Per Client IP)"
              }
            },
            {
              "value": "dst-address",
              "label": {
                "id": "dst-address (Per IP Tujuan)",
                "en": "dst-address (Per Destination IP)"
              }
            },
            {
              "value": "both-addresses",
              "label": {
                "id": "both-addresses (Kombinasi Sumber & Tujuan)",
                "en": "both-addresses (Src & Dst Address)"
              }
            },
            {
              "value": "src-address-and-port",
              "label": {
                "id": "src-address-and-port",
                "en": "src-address-and-port"
              }
            }
          ]
        },
        {
          "key": "lanIface",
          "label": {
            "id": "Interface LAN Bridge",
            "en": "LAN Bridge Interface"
          },
          "type": "text",
          "defaultValue": "bridge-lan"
        },
        {
          "key": "lanCidr",
          "label": {
            "id": "Subnet LAN (CIDR)",
            "en": "LAN Subnet (CIDR)"
          },
          "type": "text",
          "defaultValue": "192.168.88.0/24"
        },
        {
          "key": "isp1Bw",
          "label": {
            "id": "Bandwidth ISP 1 (Mbps)",
            "en": "ISP 1 Bandwidth (Mbps)"
          },
          "type": "number",
          "defaultValue": 100,
          "min": 1,
          "unit": "Mbps"
        },
        {
          "key": "isp1Gw",
          "label": {
            "id": "Gateway IP ISP 1",
            "en": "ISP 1 Gateway IP"
          },
          "type": "text",
          "defaultValue": "192.168.1.1"
        },
        {
          "key": "isp1Iface",
          "label": {
            "id": "Interface ISP 1",
            "en": "ISP 1 Interface"
          },
          "type": "text",
          "defaultValue": "ether1-ISP1"
        },
        {
          "key": "isp2Bw",
          "label": {
            "id": "Bandwidth ISP 2 (Mbps)",
            "en": "ISP 2 Bandwidth (Mbps)"
          },
          "type": "number",
          "defaultValue": 50,
          "min": 1,
          "unit": "Mbps"
        },
        {
          "key": "isp2Gw",
          "label": {
            "id": "Gateway IP ISP 2",
            "en": "ISP 2 Gateway IP"
          },
          "type": "text",
          "defaultValue": "192.168.2.1"
        },
        {
          "key": "isp2Iface",
          "label": {
            "id": "Interface ISP 2",
            "en": "ISP 2 Interface"
          },
          "type": "text",
          "defaultValue": "ether2-ISP2"
        },
        {
          "key": "isp3Bw",
          "label": {
            "id": "Bandwidth ISP 3 (Mbps)",
            "en": "ISP 3 Bandwidth (Mbps)"
          },
          "type": "number",
          "defaultValue": 50,
          "min": 1,
          "unit": "Mbps"
        },
        {
          "key": "isp3Gw",
          "label": {
            "id": "Gateway IP ISP 3",
            "en": "ISP 3 Gateway IP"
          },
          "type": "text",
          "defaultValue": "192.168.3.1"
        },
        {
          "key": "isp3Iface",
          "label": {
            "id": "Interface ISP 3",
            "en": "ISP 3 Interface"
          },
          "type": "text",
          "defaultValue": "ether3-ISP3"
        },
        {
          "key": "isp4Bw",
          "label": {
            "id": "Bandwidth ISP 4 (Mbps)",
            "en": "ISP 4 Bandwidth (Mbps)"
          },
          "type": "number",
          "defaultValue": 30,
          "min": 1,
          "unit": "Mbps"
        },
        {
          "key": "isp4Gw",
          "label": {
            "id": "Gateway IP ISP 4",
            "en": "ISP 4 Gateway IP"
          },
          "type": "text",
          "defaultValue": "192.168.4.1"
        },
        {
          "key": "isp4Iface",
          "label": {
            "id": "Interface ISP 4",
            "en": "ISP 4 Interface"
          },
          "type": "text",
          "defaultValue": "ether4-ISP4"
        },
        {
          "key": "isp5Bw",
          "label": {
            "id": "Bandwidth ISP 5 (Mbps)",
            "en": "ISP 5 Bandwidth (Mbps)"
          },
          "type": "number",
          "defaultValue": 20,
          "min": 1,
          "unit": "Mbps"
        },
        {
          "key": "isp5Gw",
          "label": {
            "id": "Gateway IP ISP 5",
            "en": "ISP 5 Gateway IP"
          },
          "type": "text",
          "defaultValue": "192.168.5.1"
        },
        {
          "key": "isp5Iface",
          "label": {
            "id": "Interface ISP 5",
            "en": "ISP 5 Interface"
          },
          "type": "text",
          "defaultValue": "ether5-ISP5"
        }
      ],
      "formulas": {
        "id": [
          "Bobot Awal ISP = max(1, round(Bandwidth ÷ 10))",
          "FPB (GCD) = gcd(Bobot ISP1, Bobot ISP2, ..., Bobot ISPN)",
          "Rasio Sederhana = Bobot Awal ÷ FPB",
          "Total Stream PCC = Σ(Rasio Sederhana) (diskala jika > 15 untuk efisiensi CPU)",
          "Recursive Route: Gateway host check via modem gateway dengan scope=10 dan target-scope=11"
        ],
        "en": [
          "Initial ISP Weight = max(1, round(Bandwidth ÷ 10))",
          "GCD = gcd(Weight ISP1, Weight ISP2, ..., Weight ISPN)",
          "Reduced Ratio = Initial Weight ÷ GCD",
          "Total PCC Streams = Σ(Reduced Ratio) (scaled if > 15 for CPU efficiency)",
          "Recursive Route: Gateway host check via modem gateway with scope=10 and target-scope=11"
        ]
      }
    },
    {
      "id": "mikrotik-nat-calculator",
      "slug": "mikrotik-nat-calculator",
      "category": "network",
      "title": {
        "id": "Generator Port Forwarding (DST-NAT) dan Hairpin NAT MikroTik",
        "en": "MikroTik Port Forwarding (DST-NAT) and Hairpin NAT Generator"
      },
      "description": {
        "id": "Buka port server/NVR ke internet publik (DST-NAT) dan cegah koneksi loopback timeout dari dalam jaringan kantor menggunakan Hairpin NAT.",
        "en": "Expose internal server/NVR ports to the public internet (DST-NAT) and eliminate local loopback timeouts using Hairpin NAT."
      },
      "canonicalId": "https://kalkunet.com/id/tools/mikrotik-nat-calculator",
      "canonicalEn": "https://kalkunet.com/en/tools/mikrotik-nat-calculator",
      "inputs": [
        {
          "key": "desc",
          "label": {
            "id": "Nama Layanan / Server",
            "en": "Service / Server Description"
          },
          "type": "text",
          "defaultValue": "NVR-CCTV-Server"
        },
        {
          "key": "pubIp",
          "label": {
            "id": "IP Publik WAN / Hostname DDNS",
            "en": "Public WAN IP / DDNS Hostname"
          },
          "type": "text",
          "defaultValue": "203.142.77.10"
        },
        {
          "key": "extPort",
          "label": {
            "id": "Port Eksternal (Publik)",
            "en": "External Port (Public)"
          },
          "type": "text",
          "defaultValue": "8000"
        },
        {
          "key": "intIp",
          "label": {
            "id": "IP Server Lokal (LAN)",
            "en": "Internal Server IP (LAN)"
          },
          "type": "text",
          "defaultValue": "192.168.88.250"
        },
        {
          "key": "intPort",
          "label": {
            "id": "Port Server Lokal (Internal)",
            "en": "Internal Server Port"
          },
          "type": "text",
          "defaultValue": "8000"
        },
        {
          "key": "proto",
          "label": {
            "id": "Protokol Transport",
            "en": "Transport Protocol"
          },
          "type": "select",
          "defaultValue": "tcp",
          "options": [
            {
              "value": "tcp",
              "label": {
                "id": "TCP (Web, HTTP/HTTPS, SSH, RDP)",
                "en": "TCP (Web, HTTP/HTTPS, SSH, RDP)"
              }
            },
            {
              "value": "udp",
              "label": {
                "id": "UDP (DNS, WireGuard, Game Server)",
                "en": "UDP (DNS, WireGuard, Game Server)"
              }
            },
            {
              "value": "both",
              "label": {
                "id": "TCP & UDP (Kedua Protokol)",
                "en": "TCP & UDP (Both Protocols)"
              }
            }
          ]
        },
        {
          "key": "lanCidr",
          "label": {
            "id": "Subnet LAN (Hairpin NAT Loopback)",
            "en": "LAN Subnet (Hairpin NAT Loopback)"
          },
          "type": "text",
          "defaultValue": "192.168.88.0/24"
        },
        {
          "key": "wanIface",
          "label": {
            "id": "Interface WAN (ISP)",
            "en": "WAN Interface (ISP)"
          },
          "type": "text",
          "defaultValue": "ether1-ISP"
        }
      ],
      "formulas": {
        "id": [
          "DST-NAT: chain=dstnat dst-address=IP_Publik dst-port=Port_Eksternal action=dst-nat to-addresses=IP_Lokal to-ports=Port_Internal",
          "Hairpin NAT: chain=srcnat src-address=Subnet_LAN dst-address=IP_Lokal dst-port=Port_Internal action=masquerade",
          "Filter Forward Accept: chain=forward connection-nat-state=dstnat dst-address=IP_Lokal dst-port=Port_Internal action=accept"
        ],
        "en": [
          "DST-NAT: chain=dstnat dst-address=Public_IP dst-port=External_Port action=dst-nat to-addresses=Internal_IP to-ports=Internal_Port",
          "Hairpin NAT: chain=srcnat src-address=LAN_Subnet dst-address=Internal_IP dst-port=Internal_Port action=masquerade",
          "Filter Forward Accept: chain=forward connection-nat-state=dstnat dst-address=Internal_IP dst-port=Internal_Port action=accept"
        ]
      }
    },
    {
      "id": "mikrotik-qos-calculator",
      "slug": "mikrotik-qos-calculator",
      "category": "network",
      "title": {
        "id": "Kalkulator QoS Priority dan Anti-Lag Hotspot MikroTik",
        "en": "MikroTik QoS Priority and Anti-Lag Calculator"
      },
      "description": {
        "id": "Prioritaskan panggilan suara WhatsApp, meeting Zoom/Teams, dan game online di atas unduhan bulk menggunakan Queue Tree FQ-CoDel RouterOS v7.",
        "en": "Prioritize WhatsApp calls, Zoom/Teams conferences, and gaming latency above bulk downloads using RouterOS v7 FQ-CoDel Queue Trees."
      },
      "canonicalId": "https://kalkunet.com/id/tools/mikrotik-qos-calculator",
      "canonicalEn": "https://kalkunet.com/en/tools/mikrotik-qos-calculator",
      "inputs": [
        {
          "key": "downMbps",
          "label": {
            "id": "Bandwidth Download Aktual ISP (Mbps)",
            "en": "Measured ISP Download Bandwidth (Mbps)"
          },
          "type": "number",
          "defaultValue": 100,
          "min": 5,
          "max": 100000,
          "unit": "Mbps"
        },
        {
          "key": "upMbps",
          "label": {
            "id": "Bandwidth Upload Aktual ISP (Mbps)",
            "en": "Measured ISP Upload Bandwidth (Mbps)"
          },
          "type": "number",
          "defaultValue": 40,
          "min": 2,
          "max": 100000,
          "unit": "Mbps"
        },
        {
          "key": "headroomPct",
          "label": {
            "id": "Headroom Shaping ISP (%)",
            "en": "ISP Shaping Headroom (%)"
          },
          "type": "number",
          "defaultValue": 95,
          "min": 50,
          "max": 100,
          "unit": "%"
        },
        {
          "key": "prioDownPct",
          "label": {
            "id": "Alokasi Download Prioritas 1 Real-Time (%)",
            "en": "Priority 1 Real-Time Download Allocation (%)"
          },
          "type": "number",
          "defaultValue": 30,
          "min": 10,
          "max": 80,
          "unit": "%"
        },
        {
          "key": "prioUpPct",
          "label": {
            "id": "Alokasi Upload Prioritas 1 Real-Time (%)",
            "en": "Priority 1 Real-Time Upload Allocation (%)"
          },
          "type": "number",
          "defaultValue": 35,
          "min": 10,
          "max": 80,
          "unit": "%"
        },
        {
          "key": "wanIface",
          "label": {
            "id": "Interface WAN (ISP)",
            "en": "WAN Interface (ISP)"
          },
          "type": "text",
          "defaultValue": "ether1-ISP"
        },
        {
          "key": "lanCidr",
          "label": {
            "id": "Subnet LAN (CIDR)",
            "en": "LAN Subnet (CIDR)"
          },
          "type": "text",
          "defaultValue": "192.168.88.0/24"
        }
      ],
      "formulas": {
        "id": [
          "Total Shaped Download = floor(Bandwidth Download × Headroom %)",
          "Total Shaped Upload = floor(Bandwidth Upload × Headroom %)",
          "Limit-At Prioritas 1 Download = max(2, floor(Total Download × Prio Down %))",
          "Limit-At Prioritas 1 Upload = max(1, floor(Total Upload × Prio Up %))",
          "Limit-At Prioritas 8 (Reguler) = Total Shaped − Limit-At Prioritas 1",
          "Queue Type FQ-CoDel: fq-codel-target=5ms fq-codel-interval=100ms"
        ],
        "en": [
          "Total Shaped Download = floor(Download Bandwidth × Headroom %)",
          "Total Shaped Upload = floor(Upload Bandwidth × Headroom %)",
          "Priority 1 Limit-At Download = max(2, floor(Total Download × Prio Down %))",
          "Priority 1 Limit-At Upload = max(1, floor(Total Upload × Prio Up %))",
          "Priority 8 (Regular) Limit-At = Total Shaped − Priority 1 Limit-At",
          "FQ-CoDel Queue Type: fq-codel-target=5ms fq-codel-interval=100ms"
        ]
      }
    },
    {
      "id": "mtu-calculator",
      "slug": "mtu-calculator",
      "category": "network",
      "title": {
        "id": "Kalkulator MTU dan TCP MSS Clamping",
        "en": "MTU and TCP MSS Clamping Calculator"
      },
      "description": {
        "id": "Hitung ukuran MTU optimal, TCP MSS clamping (IPv4/IPv6), dan payload uji ping Don't Fragment untuk mengatasi website loading macet di PPPoE dan VPN.",
        "en": "Calculate optimal MTU sizes, TCP MSS clamping (IPv4/IPv6), and Don't Fragment ping payloads to resolve web page freezes over PPPoE and VPN tunnels."
      },
      "canonicalId": "https://kalkunet.com/id/tools/mtu-calculator",
      "canonicalEn": "https://kalkunet.com/en/tools/mtu-calculator",
      "inputs": [
        {
          "key": "linkType",
          "label": {
            "id": "Tipe Koneksi / Enkapsulasi Tunnel",
            "en": "Connection Type / Tunnel Encapsulation"
          },
          "type": "select",
          "defaultValue": "pppoe",
          "options": [
            {
              "value": "ethernet",
              "label": {
                "id": "Standard Ethernet (MTU 1500)",
                "en": "Standard Ethernet (MTU 1500)"
              }
            },
            {
              "value": "pppoe",
              "label": {
                "id": "PPPoE Fiber / DSL ISP (MTU 1480)",
                "en": "PPPoE Fiber / DSL ISP (MTU 1480)"
              }
            },
            {
              "value": "wireguard",
              "label": {
                "id": "WireGuard Tunnel VPN (MTU 1420)",
                "en": "WireGuard Tunnel VPN (MTU 1420)"
              }
            },
            {
              "value": "lte",
              "label": {
                "id": "4G/5G LTE / Starlink CGNAT (MTU 1428)",
                "en": "4G/5G LTE / Starlink CGNAT (MTU 1428)"
              }
            },
            {
              "value": "l2tp-ipsec",
              "label": {
                "id": "L2TP / IPSec ESP Tunnel (MTU 1400)",
                "en": "L2TP / IPSec ESP Tunnel (MTU 1400)"
              }
            },
            {
              "value": "vxlan",
              "label": {
                "id": "VXLAN Data Center Overlay (MTU 1450)",
                "en": "VXLAN Data Center Overlay (MTU 1450)"
              }
            },
            {
              "value": "gre",
              "label": {
                "id": "GRE Tunnel Point-to-Point (MTU 1476)",
                "en": "GRE Tunnel Point-to-Point (MTU 1476)"
              }
            },
            {
              "value": "custom",
              "label": {
                "id": "Kustom / Jumbo Frame Manual",
                "en": "Custom / Jumbo Frame Manual"
              }
            }
          ]
        },
        {
          "key": "ipVersion",
          "label": {
            "id": "Versi Protokol IP",
            "en": "IP Protocol Version"
          },
          "type": "select",
          "defaultValue": "ipv4",
          "options": [
            {
              "value": "ipv4",
              "label": {
                "id": "IPv4 (Header IP 20 Byte + TCP 20 Byte = 40B)",
                "en": "IPv4 (20B IP + 20B TCP Header = 40B)"
              }
            },
            {
              "value": "ipv6",
              "label": {
                "id": "IPv6 (Header IP 40 Byte + TCP 20 Byte = 60B)",
                "en": "IPv6 (40B IP + 20B TCP Header = 60B)"
              }
            }
          ]
        },
        {
          "key": "customMtu",
          "label": {
            "id": "Nilai MTU Kustom (Byte)",
            "en": "Custom MTU Value (Bytes)"
          },
          "type": "number",
          "defaultValue": 1500,
          "min": 576,
          "max": 9216,
          "unit": "Byte"
        }
      ],
      "formulas": {
        "id": [
          "TCP MSS (IPv4) = MTU − (20 Byte IP Header + 20 Byte TCP Header) = MTU − 40",
          "TCP MSS (IPv6) = MTU − (40 Byte IP Header + 20 Byte TCP Header) = MTU − 60",
          "Ping Don't Fragment Payload (IPv4) = MTU − (20 Byte IP + 8 Byte ICMP) = MTU − 28",
          "Ping Don't Fragment Payload (IPv6) = MTU − (40 Byte IP + 8 Byte ICMP) = MTU − 48",
          "Uji Windows: ping 1.1.1.1 -f -l <Payload>"
        ],
        "en": [
          "TCP MSS (IPv4) = MTU − (20B IP Header + 20B TCP Header) = MTU − 40",
          "TCP MSS (IPv6) = MTU − (40B IP Header + 20B TCP Header) = MTU − 60",
          "Ping Don't Fragment Payload (IPv4) = MTU − (20B IP + 8B ICMP) = MTU − 28",
          "Ping Don't Fragment Payload (IPv6) = MTU − (40B IP + 8B ICMP) = MTU − 48",
          "Windows Test: ping 1.1.1.1 -f -l <Payload>"
        ]
      }
    },
    {
      "id": "mikrotik-wireguard-mtu-calculator",
      "slug": "mikrotik-wireguard-mtu-calculator",
      "category": "network",
      "title": {
        "id": "Kalkulator MTU & TCP MSS WireGuard VPN MikroTik",
        "en": "MikroTik WireGuard VPN MTU & MSS Calculator"
      },
      "description": {
        "id": "Setup WireGuard VPN Site-to-Site RouterOS v7 lengkap dengan pencegahan browsing macet melalui TCP MSS Clamping otomatis.",
        "en": "Deploy site-to-site WireGuard VPN on RouterOS v7 with automatic TCP MSS Clamping to prevent tunnel web page freezes and PMTUD black holes."
      },
      "canonicalId": "https://kalkunet.com/id/tools/mikrotik-wireguard-mtu-calculator",
      "canonicalEn": "https://kalkunet.com/en/tools/mikrotik-wireguard-mtu-calculator",
      "inputs": [
        {
          "key": "linkType",
          "label": {
            "id": "Tipe Koneksi WAN Router",
            "en": "Router WAN Connection Type"
          },
          "type": "select",
          "defaultValue": "pppoe",
          "options": [
            {
              "value": "pppoe",
              "label": {
                "id": "PPPoE Fiber ISP (MTU 1480 -> MSS 1440)",
                "en": "PPPoE Fiber ISP (MTU 1480 -> MSS 1440)"
              }
            },
            {
              "value": "ethernet",
              "label": {
                "id": "Dedicated Ethernet (MTU 1500 -> MSS 1460)",
                "en": "Dedicated Ethernet (MTU 1500 -> MSS 1460)"
              }
            },
            {
              "value": "lte",
              "label": {
                "id": "Modem 4G/5G LTE (MTU 1428 -> MSS 1388)",
                "en": "4G/5G LTE Modem (MTU 1428 -> MSS 1388)"
              }
            }
          ]
        },
        {
          "key": "wanIface",
          "label": {
            "id": "Nama Interface WAN Router",
            "en": "Router WAN Interface Name"
          },
          "type": "text",
          "defaultValue": "pppoe-out1"
        },
        {
          "key": "wgPort",
          "label": {
            "id": "Listen Port UDP WireGuard",
            "en": "WireGuard UDP Listen Port"
          },
          "type": "number",
          "defaultValue": 13231,
          "min": 1,
          "max": 65535
        },
        {
          "key": "wgNet",
          "label": {
            "id": "IP Gateway Tunnel WireGuard",
            "en": "WireGuard Tunnel Gateway IP"
          },
          "type": "text",
          "defaultValue": "10.200.200.1/24"
        },
        {
          "key": "peerIp",
          "label": {
            "id": "IP Tunnel Peer Cabang",
            "en": "Branch Peer Tunnel IP"
          },
          "type": "text",
          "defaultValue": "10.200.200.2/32"
        },
        {
          "key": "remoteLan",
          "label": {
            "id": "Subnet LAN Cabang (Remote LAN)",
            "en": "Remote Branch LAN Subnet"
          },
          "type": "text",
          "defaultValue": "192.168.90.0/24"
        }
      ],
      "formulas": {
        "id": [
          "WireGuard Interface MTU = 1420 byte (1500 − 80 byte overhead)",
          "TCP MSS WAN = MTU_WAN − 40 byte (mis. 1480 − 40 = 1440 byte)",
          "Mangle Clamp MSS: /ip firewall mangle add action=change-mss chain=forward new-mss=tcpMss protocol=tcp tcp-flags=syn",
          "WireGuard Peer Handshake: /ip firewall filter add action=accept chain=input dst-port=wgPort protocol=udp"
        ],
        "en": [
          "WireGuard Interface MTU = 1420 bytes (1500 − 80 bytes overhead)",
          "WAN TCP MSS = MTU_WAN − 40 bytes (e.g. 1480 − 40 = 1440 bytes)",
          "Mangle Clamp MSS: /ip firewall mangle add action=change-mss chain=forward new-mss=tcpMss protocol=tcp tcp-flags=syn",
          "WireGuard Peer Handshake: /ip firewall filter add action=accept chain=input dst-port=wgPort protocol=udp"
        ]
      }
    },
    {
      "id": "zfs-raid-calculator",
      "slug": "zfs-raid-calculator",
      "category": "server",
      "title": {
        "id": "Kalkulator Kapasitas Proxmox ZFS & Hardware RAID",
        "en": "Proxmox ZFS & Hardware RAID Capacity Calculator"
      },
      "description": {
        "id": "Hitung kapasitas bersih ZFS Proxmox VE, sector padding loss, slop space, batas aman 80%, RAM ARC, dan generator CLI zpool create.",
        "en": "Calculate net usable Proxmox VE ZFS capacity, padding loss, slop space, 80% safe ceiling, ARC RAM, and zpool create CLI script."
      },
      "canonicalId": "https://kalkunet.com/id/tools/zfs-raid-calculator",
      "canonicalEn": "https://kalkunet.com/en/tools/zfs-raid-calculator",
      "inputs": [
        {
          "key": "drives",
          "label": {
            "id": "Jumlah Drive Fisik",
            "en": "Total Physical Drives"
          },
          "type": "number",
          "defaultValue": 6,
          "min": 1,
          "max": 128,
          "step": 1
        },
        {
          "key": "driveSize",
          "label": {
            "id": "Kapasitas per Drive",
            "en": "Capacity per Drive"
          },
          "type": "number",
          "defaultValue": 4,
          "min": 0.1,
          "step": 0.1
        },
        {
          "key": "unit",
          "label": {
            "id": "Satuan Kapasitas",
            "en": "Capacity Unit"
          },
          "type": "select",
          "defaultValue": "TB",
          "options": [
            {
              "value": "TB",
              "label": {
                "id": "TB (Terabyte Desimal 10^12)",
                "en": "TB (Decimal Terabyte 10^12)"
              }
            },
            {
              "value": "GB",
              "label": {
                "id": "GB (Gigabyte Desimal 10^9)",
                "en": "GB (Decimal Gigabyte 10^9)"
              }
            }
          ]
        },
        {
          "key": "topology",
          "label": {
            "id": "Topologi Redundansi ZFS",
            "en": "ZFS Redundancy Topology"
          },
          "type": "select",
          "defaultValue": "raidz2",
          "options": [
            {
              "value": "raidz2",
              "label": {
                "id": "RAIDZ2 (Dual Parity — Rekomendasi Production)",
                "en": "RAIDZ2 (Dual Parity — Production Recommended)"
              }
            },
            {
              "value": "raidz1",
              "label": {
                "id": "RAIDZ1 (Single Parity — Mirip RAID 5)",
                "en": "RAIDZ1 (Single Parity — RAID 5 equivalent)"
              }
            },
            {
              "value": "raidz3",
              "label": {
                "id": "RAIDZ3 (Triple Parity — High Redundancy)",
                "en": "RAIDZ3 (Triple Parity — High Redundancy)"
              }
            },
            {
              "value": "raid10",
              "label": {
                "id": "RAID 10 (Striped Mirrors — Max IOPS)",
                "en": "RAID 10 (Striped Mirrors — Max IOPS)"
              }
            },
            {
              "value": "raid1",
              "label": {
                "id": "Mirror / RAID 1 (2-Way Mirror)",
                "en": "Mirror / RAID 1 (2-Way Mirror)"
              }
            },
            {
              "value": "stripe",
              "label": {
                "id": "Stripe / RAID 0 (Tanpa Redundansi)",
                "en": "Stripe / RAID 0 (Zero Redundancy)"
              }
            }
          ]
        },
        {
          "key": "ashift",
          "label": {
            "id": "Sektor Disk ashift (Pool Alignment)",
            "en": "Pool ashift (Sector Alignment)"
          },
          "type": "select",
          "defaultValue": "12",
          "options": [
            {
              "value": "12",
              "label": {
                "id": "ashift 12 (4 KiB — Standar NVMe/SSD/HDD 4Kn/512e)",
                "en": "ashift 12 (4 KiB — Modern NVMe/SSD/HDD standard)"
              }
            },
            {
              "value": "13",
              "label": {
                "id": "ashift 13 (8 KiB — Enterprise SSD & Flash)",
                "en": "ashift 13 (8 KiB — Enterprise SSD & Flash)"
              }
            },
            {
              "value": "9",
              "label": {
                "id": "ashift 9 (512 Byte — Legacy HDD lama)",
                "en": "ashift 9 (512 Byte — Legacy 512-byte HDD)"
              }
            }
          ]
        },
        {
          "key": "recordsize",
          "label": {
            "id": "Dataset recordsize",
            "en": "Dataset recordsize"
          },
          "type": "select",
          "defaultValue": "128",
          "options": [
            {
              "value": "128",
              "label": {
                "id": "128 KiB (Default ZFS & Proxmox General)",
                "en": "128 KiB (Default ZFS & Proxmox General)"
              }
            },
            {
              "value": "16",
              "label": {
                "id": "16 KiB (Database OLTP / MySQL / PostgreSQL)",
                "en": "16 KiB (Database OLTP / MySQL / PostgreSQL)"
              }
            },
            {
              "value": "64",
              "label": {
                "id": "64 KiB (VM OS Disks & Web Server)",
                "en": "64 KiB (VM OS Disks & Web Server)"
              }
            },
            {
              "value": "1024",
              "label": {
                "id": "1024 KiB / 1 MiB (Media Streaming & Backup)",
                "en": "1024 KiB / 1 MiB (Media Streaming & Backup)"
              }
            }
          ]
        },
        {
          "key": "mediaType",
          "label": {
            "id": "Tipe Media Penyimpanan",
            "en": "Storage Media Type"
          },
          "type": "select",
          "defaultValue": "ssd",
          "options": [
            {
              "value": "ssd",
              "label": {
                "id": "Enterprise SATA/SAS SSD (~8.000 IOPS)",
                "en": "Enterprise SATA/SAS SSD (~8,000 IOPS)"
              }
            },
            {
              "value": "nvme",
              "label": {
                "id": "NVMe PCIe Gen4/Gen5 (~45.000 IOPS)",
                "en": "NVMe PCIe Gen4/Gen5 (~45,000 IOPS)"
              }
            },
            {
              "value": "hdd",
              "label": {
                "id": "Enterprise HDD 7.2K RPM (~120 IOPS)",
                "en": "Enterprise HDD 7.2K RPM (~120 IOPS)"
              }
            }
          ]
        },
        {
          "key": "poolName",
          "label": {
            "id": "Nama ZFS Pool Proxmox",
            "en": "Proxmox ZFS Pool Name"
          },
          "type": "text",
          "defaultValue": "rpool-data"
        }
      ],
      "formulas": {
        "id": [
          "Kapasitas Bruto Raw (TB) = Jumlah Drive × Kapasitas per Drive",
          "Kapasitas Biner (TiB) = Kapasitas TB × 0,9094947 (konversi 10^12 ke 2^40)",
          "Standard Usable = Drive Data Efektif × Kapasitas per Drive",
          "Padding Loss = Standard Usable × Rasio Padding (0,028 untuk 128k recordsize)",
          "Slop Space = min((Standard Usable − Padding Loss) × 1/32, 0,1374 TB / 128 GiB)",
          "Kapasitas Bersih ZFS = Standard Usable − Padding Loss − Slop Space",
          "Batas Aman 80% = Kapasitas Bersih ZFS × 0,80 (mencegah degradasi performa Copy-on-Write)",
          "Rekomendasi RAM ARC = Base 2 GB + 1 GB per TB Kapasitas Raw"
        ],
        "en": [
          "Gross Raw Capacity (TB) = Drive Count × Capacity per Drive",
          "Binary Capacity (TiB) = Decimal TB × 0.9094947 (10^12 to 2^40)",
          "Standard Usable = Effective Data Drives × Capacity per Drive",
          "Padding Loss = Standard Usable × Padding Ratio (0.028 for 128k recordsize)",
          "Slop Space = min((Standard Usable − Padding Loss) × 1/32, 0.1374 TB / 128 GiB)",
          "Net ZFS Usable = Standard Usable − Padding Loss − Slop Space",
          "80% Safe Capacity = Net ZFS Usable × 0.80 (prevents Copy-on-Write performance collapse)",
          "ARC RAM Recommendation = Base 2 GB + 1 GB per 1 TB Raw Capacity"
        ]
      }
    },
    {
      "id": "raid-calculator",
      "slug": "raid-calculator",
      "category": "server",
      "title": {
        "id": "Kalkulator Kapasitas RAID 0/1/5/6/10",
        "en": "RAID 0/1/5/6/10 Capacity Calculator"
      },
      "description": {
        "id": "Hitung kapasitas usable, ruang parity hilang, efisiensi penyimpanan, dan toleransi kerusakan drive untuk RAID 0, 1, 5, 6, 10, 50, dan 60.",
        "en": "Calculate usable storage, parity loss, disk efficiency, and fault tolerance across RAID 0, 1, 5, 6, 10, 50, and 60 configurations."
      },
      "canonicalId": "https://kalkunet.com/id/tools/raid-calculator",
      "canonicalEn": "https://kalkunet.com/en/tools/raid-calculator",
      "inputs": [
        {
          "key": "drives",
          "label": {
            "id": "Jumlah Drive Fisik",
            "en": "Total Physical Drives"
          },
          "type": "number",
          "defaultValue": 4,
          "min": 1,
          "max": 128,
          "step": 1
        },
        {
          "key": "driveSize",
          "label": {
            "id": "Kapasitas per Drive",
            "en": "Capacity per Drive"
          },
          "type": "number",
          "defaultValue": 2,
          "min": 0.1,
          "step": 0.1
        },
        {
          "key": "unit",
          "label": {
            "id": "Satuan Kapasitas",
            "en": "Capacity Unit"
          },
          "type": "select",
          "defaultValue": "TB",
          "options": [
            {
              "value": "TB",
              "label": {
                "id": "TB (Terabyte Desimal 10^12)",
                "en": "TB (Decimal Terabyte 10^12)"
              }
            },
            {
              "value": "GB",
              "label": {
                "id": "GB (Gigabyte Desimal 10^9)",
                "en": "GB (Decimal Gigabyte 10^9)"
              }
            }
          ]
        },
        {
          "key": "raidType",
          "label": {
            "id": "Tipe / Level RAID",
            "en": "RAID Level"
          },
          "type": "select",
          "defaultValue": "raid5",
          "options": [
            {
              "value": "raid5",
              "label": {
                "id": "RAID 5 (Single Distributed Parity)",
                "en": "RAID 5 (Single Distributed Parity)"
              }
            },
            {
              "value": "raid6",
              "label": {
                "id": "RAID 6 (Dual Distributed Parity)",
                "en": "RAID 6 (Dual Distributed Parity)"
              }
            },
            {
              "value": "raid10",
              "label": {
                "id": "RAID 10 (1+0 Striped Mirrors)",
                "en": "RAID 10 (1+0 Striped Mirrors)"
              }
            },
            {
              "value": "raid1",
              "label": {
                "id": "RAID 1 (Mirroring 2 Drive)",
                "en": "RAID 1 (Mirroring 2 Drives)"
              }
            },
            {
              "value": "raid0",
              "label": {
                "id": "RAID 0 (Striping — Tanpa Redundansi)",
                "en": "RAID 0 (Striping — Zero Redundancy)"
              }
            },
            {
              "value": "raid50",
              "label": {
                "id": "RAID 50 (Striped RAID 5 Sets)",
                "en": "RAID 50 (Striped RAID 5 Sets)"
              }
            },
            {
              "value": "raid60",
              "label": {
                "id": "RAID 60 (Striped RAID 6 Sets)",
                "en": "RAID 60 (Striped RAID 6 Sets)"
              }
            }
          ]
        },
        {
          "key": "hotSpares",
          "label": {
            "id": "Jumlah Drive Hot Spare",
            "en": "Dedicated Hot Spare Drives"
          },
          "type": "number",
          "defaultValue": 0,
          "min": 0,
          "max": 8,
          "step": 1
        }
      ],
      "formulas": {
        "id": [
          "RAID 0 Usable = N × Size (Efisiensi 100%)",
          "RAID 1 Usable = 1 × Size (Efisiensi 50% untuk 2 drive)",
          "RAID 5 Usable = (N − 1 − HotSpare) × Size",
          "RAID 6 Usable = (N − 2 − HotSpare) × Size",
          "RAID 10 Usable = floor((N − HotSpare) ÷ 2) × Size",
          "RAID 50 Usable = (N − 2 − HotSpare) × Size (2 sub-array)",
          "RAID 60 Usable = (N − 4 − HotSpare) × Size (2 sub-array)",
          "Kapasitas TiB = Kapasitas TB × 0,9094947"
        ],
        "en": [
          "RAID 0 Usable = N × Size (100% Efficiency)",
          "RAID 1 Usable = 1 × Size (50% Efficiency for 2 drives)",
          "RAID 5 Usable = (N − 1 − HotSpare) × Size",
          "RAID 6 Usable = (N − 2 − HotSpare) × Size",
          "RAID 10 Usable = floor((N − HotSpare) ÷ 2) × Size",
          "RAID 50 Usable = (N − 2 − HotSpare) × Size (2 sub-arrays)",
          "RAID 60 Usable = (N − 4 − HotSpare) × Size (2 sub-arrays)",
          "Binary TiB = Decimal TB × 0.9094947"
        ]
      }
    },
    {
      "id": "server-ups-calculator",
      "slug": "server-ups-calculator",
      "category": "server",
      "title": {
        "id": "Kalkulator Kapasitas UPS Server (VA/kVA) & Baterai (Ah)",
        "en": "Server UPS VA/kVA & Battery Runtime Calculator"
      },
      "description": {
        "id": "Hitung kapasitas daya UPS server (kVA/VA), waktu backup baterai VRLA (Ah), dan estimasi tagihan listrik PLN bulanan dengan margin aman 25%.",
        "en": "Calculate server UPS capacity (kVA/VA), VRLA battery runtime (Ah), and 24/7 monthly electricity cost with 25% safety margin and power factor."
      },
      "canonicalId": "https://kalkunet.com/id/tools/server-ups-calculator",
      "canonicalEn": "https://kalkunet.com/en/tools/server-ups-calculator",
      "inputs": [
        {
          "key": "loadWatts",
          "label": {
            "id": "Beban Daya Server Aktif",
            "en": "Active Server IT Load"
          },
          "type": "number",
          "defaultValue": 850,
          "min": 50,
          "max": 500000,
          "step": 10,
          "unit": "W"
        },
        {
          "key": "powerFactor",
          "label": {
            "id": "Power Factor (PF)",
            "en": "Power Factor (PF)"
          },
          "type": "select",
          "defaultValue": 0.9,
          "options": [
            {
              "value": 0.8,
              "label": {
                "id": "0.80 (UPS Tradisional / Server Lama)",
                "en": "0.80 (Legacy / Traditional UPS)"
              }
            },
            {
              "value": 0.9,
              "label": {
                "id": "0.90 (Online Double-Conversion Standar)",
                "en": "0.90 (Standard Online Double-Conversion)"
              }
            },
            {
              "value": 1,
              "label": {
                "id": "1.00 (Unity PF / Modular Modern)",
                "en": "1.00 (Unity PF / Modern Modular)"
              }
            }
          ]
        },
        {
          "key": "targetMins",
          "label": {
            "id": "Target Runtime Cadangan",
            "en": "Target Backup Runtime"
          },
          "type": "number",
          "defaultValue": 30,
          "min": 5,
          "max": 1440,
          "step": 5,
          "unit": "menit"
        },
        {
          "key": "busVoltage",
          "label": {
            "id": "Tegangan Bus DC Baterai",
            "en": "DC Battery Bus Voltage"
          },
          "type": "select",
          "defaultValue": 48,
          "options": [
            {
              "value": 12,
              "label": {
                "id": "12 VDC (1× aki 12V / UPS desktop kecil)",
                "en": "12 VDC (1× 12V battery / small desktop UPS)"
              }
            },
            {
              "value": 24,
              "label": {
                "id": "24 VDC (2× aki 12V seri / 1–1.5 kVA)",
                "en": "24 VDC (2× 12V series / 1–1.5 kVA)"
              }
            },
            {
              "value": 48,
              "label": {
                "id": "48 VDC (4× aki 12V seri / 2–3 kVA tower)",
                "en": "48 VDC (4× 12V series / 2–3 kVA tower)"
              }
            },
            {
              "value": 72,
              "label": {
                "id": "72 VDC (6× aki 12V seri / 3–5 kVA rack)",
                "en": "72 VDC (6× 12V series / 3–5 kVA rack)"
              }
            },
            {
              "value": 96,
              "label": {
                "id": "96 VDC (8× aki 12V seri / 6 kVA)",
                "en": "96 VDC (8× 12V series / 6 kVA)"
              }
            },
            {
              "value": 192,
              "label": {
                "id": "192 VDC (16× aki 12V seri / 10–20 kVA)",
                "en": "192 VDC (16× 12V series / 10–20 kVA)"
              }
            },
            {
              "value": 240,
              "label": {
                "id": "240 VDC (20× aki 12V seri / 20–40 kVA)",
                "en": "240 VDC (20× 12V series / 20–40 kVA)"
              }
            },
            {
              "value": 384,
              "label": {
                "id": "384 VDC (32× aki 12V seri / 60–100 kVA)",
                "en": "384 VDC (32× 12V series / 60–100 kVA)"
              }
            }
          ]
        },
        {
          "key": "plnTariffRp",
          "label": {
            "id": "Tarif Listrik PLN",
            "en": "Electricity Tariff"
          },
          "type": "number",
          "defaultValue": 1444.7,
          "min": 500,
          "max": 10000,
          "step": 10,
          "unit": "Rp/kWh"
        }
      ],
      "formulas": {
        "id": [
          "Daya Aktif dengan Margin = ceil(Beban Watt × 1,25)",
          "Daya Semu Minimal (VA) = ceil(Daya Aktif / Power Factor)",
          "Rekomendasi Kapasitas UPS = Ukuran kVA standar terdekat ≥ Daya Semu / 1000",
          "Kapasitas Baterai (Ah) = ceil((Beban Watt × (Target Menit / 60)) / (Tegangan Bus DC × 0,88 × 0,80))",
          "Jumlah Baterai 12V Seri = Tegangan Bus DC / 12",
          "Konsumsi Energi = (Beban Watt × 24 jam) / 1000; Biaya Bulanan = kWh/bulan × Tarif Listrik"
        ],
        "en": [
          "Active Power with Margin = ceil(Load Watts × 1.25)",
          "Minimum Apparent Power (VA) = ceil(Active Power / Power Factor)",
          "Recommended UPS Rating = Next standard commercial rating ≥ Apparent Power / 1000",
          "Battery Capacity (Ah) = ceil((Load Watts × (Target Minutes / 60)) / (DC Bus Voltage × 0.88 × 0.80))",
          "Series 12V Battery Count = DC Bus Voltage / 12",
          "Energy Consumption = (Load Watts × 24h) / 1000; Monthly Cost = Monthly kWh × Tariff"
        ]
      }
    },
    {
      "id": "server-cooling-calculator",
      "slug": "server-cooling-calculator",
      "category": "server",
      "title": {
        "id": "Kalkulator AC Ruang Server (BTU/hr & PK) & Rack Unit",
        "en": "Server Room Cooling (BTU/hr & PK) & Rack Unit Calculator"
      },
      "description": {
        "id": "Hitung beban panas ruang server dalam BTU/hr, konversi ke PK AC dengan redundansi 24/7, serta ukuran rack unit (U) dengan buffer sirkulasi udara.",
        "en": "Calculate server room heat dissipation in BTU/hr, convert to air conditioning PK ratings with 24/7 redundancy, and size server racks with airflow buffer."
      },
      "canonicalId": "https://kalkunet.com/id/tools/server-cooling-calculator",
      "canonicalEn": "https://kalkunet.com/en/tools/server-cooling-calculator",
      "inputs": [
        {
          "key": "itEquipmentWatt",
          "label": {
            "id": "Daya Perangkat IT Aktif",
            "en": "Active IT Equipment Power"
          },
          "type": "number",
          "defaultValue": 1200,
          "min": 100,
          "max": 200000,
          "step": 50,
          "unit": "W"
        },
        {
          "key": "upsRatingWatt",
          "label": {
            "id": "Rating Kapasitas UPS",
            "en": "UPS Capacity Rating"
          },
          "type": "number",
          "defaultValue": 1500,
          "min": 100,
          "max": 200000,
          "step": 50,
          "unit": "W"
        },
        {
          "key": "roomAreaSqm",
          "label": {
            "id": "Luas Lantai Ruangan",
            "en": "Floor Area"
          },
          "type": "number",
          "defaultValue": 12,
          "min": 4,
          "max": 1000,
          "step": 1,
          "unit": "m²"
        },
        {
          "key": "staffCount",
          "label": {
            "id": "Rata-rata Personel di Ruangan",
            "en": "Average Personnel Inside"
          },
          "type": "number",
          "defaultValue": 1,
          "min": 0,
          "max": 50,
          "step": 1,
          "unit": "orang"
        },
        {
          "key": "usedRackUnits",
          "label": {
            "id": "Total Rack Unit (U) Terpakai",
            "en": "Occupied Rack Units (U)"
          },
          "type": "number",
          "defaultValue": 14,
          "min": 1,
          "max": 84,
          "step": 1,
          "unit": "U"
        }
      ],
      "formulas": {
        "id": [
          "Panas Perangkat IT = Beban Watt IT × 3,412 BTU/hr",
          "Panas Disipasi UPS = (Beban IT × 12% + Kapasitas UPS × 4%) × 3,412 BTU/hr",
          "Panas Ruang & Personel = (Luas m² × 350 BTU) + (Jumlah Orang × 400 BTU)",
          "Total Beban Panas Aman = ceil(Total Panas Mentah × 1,20) BTU/hr",
          "Kapasitas PK AC = Total Beban Panas / 9.000 BTU per PK",
          "Rekomendasi Rack Unit = ceil(U Terpakai × 1,35) untuk sirkulasi pendinginan dan kabel"
        ],
        "en": [
          "IT Equipment Heat = Active IT Watts × 3.412 BTU/hr",
          "UPS Dissipation Heat = (IT Watts × 12% + UPS Capacity × 4%) × 3.412 BTU/hr",
          "Room & Staff Heat = (Area m² × 350 BTU) + (Staff Count × 400 BTU)",
          "Total Safe Heat Load = ceil(Raw Total Heat × 1.20) BTU/hr",
          "AC PK Rating = Total Safe Heat Load / 9,000 BTU per PK",
          "Recommended Rack Units = ceil(Occupied U × 1.35) for front-to-rear airflow buffer"
        ]
      }
    },
    {
      "id": "vm-sizing-calculator",
      "slug": "vm-sizing-calculator",
      "category": "server",
      "title": {
        "id": "Kalkulator Sizing Host VM (vCPU/RAM) & Durasi Backup",
        "en": "VM Host Sizing (vCPU/RAM) & Backup Time Calculator"
      },
      "description": {
        "id": "Hitung kebutuhan core CPU, RAM host hypervisor Proxmox/VMware dengan buffer ZFS ARC, serta estimasi waktu backup transfer data jaringan.",
        "en": "Calculate physical CPU cores, host RAM sizing with ZFS ARC cache buffer for Proxmox/ESXi, and network backup data transfer duration (RTO)."
      },
      "canonicalId": "https://kalkunet.com/id/tools/vm-sizing-calculator",
      "canonicalEn": "https://kalkunet.com/en/tools/vm-sizing-calculator",
      "inputs": [
        {
          "key": "vmLightCount",
          "label": {
            "id": "Jumlah VM Beban Ringan (2 vCPU, 2 GB)",
            "en": "Light VM Count (2 vCPU, 2 GB)"
          },
          "type": "number",
          "defaultValue": 6,
          "min": 0,
          "max": 500,
          "step": 1,
          "unit": "VM"
        },
        {
          "key": "vmMedCount",
          "label": {
            "id": "Jumlah VM Beban Sedang (4 vCPU, 8 GB)",
            "en": "Medium VM Count (4 vCPU, 8 GB)"
          },
          "type": "number",
          "defaultValue": 4,
          "min": 0,
          "max": 500,
          "step": 1,
          "unit": "VM"
        },
        {
          "key": "vmHeavyCount",
          "label": {
            "id": "Jumlah VM Beban Berat / DB (8 vCPU, 16 GB)",
            "en": "Heavy VM Count (8 vCPU, 16 GB)"
          },
          "type": "number",
          "defaultValue": 2,
          "min": 0,
          "max": 500,
          "step": 1,
          "unit": "VM"
        },
        {
          "key": "overcommit",
          "label": {
            "id": "Rasio Overcommit vCPU",
            "en": "vCPU Overcommit Ratio"
          },
          "type": "number",
          "defaultValue": 3,
          "min": 1,
          "max": 8,
          "step": 0.5
        },
        {
          "key": "backupDataTb",
          "label": {
            "id": "Volume Data Backup",
            "en": "Backup Data Volume"
          },
          "type": "number",
          "defaultValue": 2,
          "min": 0.1,
          "max": 500,
          "step": 0.5,
          "unit": "TB"
        },
        {
          "key": "linkSpeedMbps",
          "label": {
            "id": "Kecepatan Link Jaringan Backup",
            "en": "Backup Network Link Speed"
          },
          "type": "select",
          "defaultValue": 1000,
          "options": [
            {
              "value": 100,
              "label": {
                "id": "100 Mbps (Fast Ethernet)",
                "en": "100 Mbps (Fast Ethernet)"
              }
            },
            {
              "value": 1000,
              "label": {
                "id": "1 Gbps (Gigabit Ethernet)",
                "en": "1 Gbps (Gigabit Ethernet)"
              }
            },
            {
              "value": 2500,
              "label": {
                "id": "2.5 Gbps (Multi-Gigabit)",
                "en": "2.5 Gbps (Multi-Gigabit)"
              }
            },
            {
              "value": 10000,
              "label": {
                "id": "10 Gbps (10G SFP+ / DAC)",
                "en": "10 Gbps (10G SFP+ / DAC)"
              }
            },
            {
              "value": 25000,
              "label": {
                "id": "25 Gbps (25G SFP28)",
                "en": "25 Gbps (25G SFP28)"
              }
            }
          ]
        }
      ],
      "formulas": {
        "id": [
          "Total vCPU = (VM Ringan × 2) + (VM Sedang × 4) + (VM Berat × 8)",
          "Kebutuhan Thread Fisik = ceil((Total vCPU / Overcommit) × 1,15) (+15% Headroom Hypervisor)",
          "Kebutuhan Core Fisik = ceil(Thread Fisik / 2)",
          "Total RAM Guest = (VM Ringan × 2 GB) + (VM Sedang × 8 GB) + (VM Berat × 16 GB)",
          "Kebutuhan RAM Host = ceil(RAM Guest × 1,25) + 4 GB (OS Hypervisor & Cache ZFS ARC)",
          "Kecepatan Efektif = Link Mbps × 82% / 8; Waktu = Ukuran MB / Kecepatan MB/s"
        ],
        "en": [
          "Total vCPU = (Light VMs × 2) + (Medium VMs × 4) + (Heavy VMs × 8)",
          "Physical Threads = ceil((Total vCPU / Overcommit) × 1.15) (+15% Hypervisor Headroom)",
          "Physical Cores = ceil(Physical Threads / 2)",
          "Total Guest RAM = (Light VMs × 2 GB) + (Medium VMs × 8 GB) + (Heavy VMs × 16 GB)",
          "Host RAM = ceil(Guest RAM × 1.25) + 4 GB (Hypervisor OS & ZFS ARC Cache)",
          "Effective Speed = Link Mbps × 82% / 8; Transfer Time = MB / Speed MB/s"
        ]
      }
    },
    {
      "id": "wifi-ap-calculator",
      "slug": "wifi-ap-calculator",
      "category": "network",
      "title": {
        "id": "Kalkulator Jumlah Access Point Wi-Fi & Switch PoE",
        "en": "Wi-Fi Access Point & PoE Switch Capacity Calculator"
      },
      "description": {
        "id": "Hitung kebutuhan jumlah AP Wi-Fi berdasarkan luas ruangan dan kapasitas klien aktif, budget daya switch PoE, serta bandwidth internet ISP.",
        "en": "Calculate Wi-Fi access point counts by coverage area and client capacity, PoE switch power budget, and minimum ISP internet line bandwidth."
      },
      "canonicalId": "https://kalkunet.com/id/tools/wifi-ap-calculator",
      "canonicalEn": "https://kalkunet.com/en/tools/wifi-ap-calculator",
      "inputs": [
        {
          "key": "areaSqm",
          "label": {
            "id": "Luas Area Bangunan",
            "en": "Building Area"
          },
          "type": "number",
          "defaultValue": 300,
          "min": 20,
          "max": 50000,
          "step": 10,
          "unit": "m²"
        },
        {
          "key": "floors",
          "label": {
            "id": "Jumlah Lantai Gedung",
            "en": "Number of Floors"
          },
          "type": "number",
          "defaultValue": 1,
          "min": 1,
          "max": 50,
          "step": 1,
          "unit": "lantai"
        },
        {
          "key": "envType",
          "label": {
            "id": "Karakteristik Sekat & Redaman Ruangan",
            "en": "Environment & Wall Partition Type"
          },
          "type": "select",
          "defaultValue": "office",
          "options": [
            {
              "value": "open",
              "label": {
                "id": "Open Space / Gudang / Aula (Redaman Rendah ~200 m²/AP)",
                "en": "Open Space / Warehouse / Hall (Low Attenuation ~200 m²/AP)"
              }
            },
            {
              "value": "office",
              "label": {
                "id": "Kantor / Sekat Partisi Gipsum & Kaca (~120 m²/AP)",
                "en": "Office / Drywall & Glass Partitions (~120 m²/AP)"
              }
            },
            {
              "value": "hotel",
              "label": {
                "id": "Kamar Hotel / Rumah Sakit / Dinding Beton Tebal (~65 m²/AP)",
                "en": "Hotel Rooms / Hospital / Dense Concrete (~65 m²/AP)"
              }
            }
          ]
        },
        {
          "key": "totalUsers",
          "label": {
            "id": "Total Pengguna Aktif Bersamaan (Concurrent Clients)",
            "en": "Total Concurrent Active Users"
          },
          "type": "number",
          "defaultValue": 80,
          "min": 5,
          "max": 10000,
          "step": 5,
          "unit": "klien"
        },
        {
          "key": "wifiGen",
          "label": {
            "id": "Standar Generasi Wi-Fi",
            "en": "Wi-Fi Generation Standard"
          },
          "type": "select",
          "defaultValue": "wifi6",
          "options": [
            {
              "value": "wifi5",
              "label": {
                "id": "Wi-Fi 5 / 802.11ac (Maks ~35 klien aktif/AP, PoE 12W)",
                "en": "Wi-Fi 5 / 802.11ac (Max ~35 active clients/AP, PoE 12W)"
              }
            },
            {
              "value": "wifi6",
              "label": {
                "id": "Wi-Fi 6 / 802.11ax (Maks ~65 klien aktif/AP OFDMA, PoE 15.4W)",
                "en": "Wi-Fi 6 / 802.11ax (Max ~65 active clients/AP OFDMA, PoE 15.4W)"
              }
            },
            {
              "value": "wifi7",
              "label": {
                "id": "Wi-Fi 7 / 802.11be (Maks ~65 klien aktif/AP MLO, PoE 15.4W)",
                "en": "Wi-Fi 7 / 802.11be (Max ~65 active clients/AP MLO, PoE 15.4W)"
              }
            }
          ]
        }
      ],
      "formulas": {
        "id": [
          "Kebutuhan AP Coverage = ceil(Luas Area / Jangkauan per AP sesuai Tipe Sekat)",
          "Kebutuhan AP Kapasitas = ceil(Total Pengguna / Batas Klien per AP sesuai Wi-Fi Gen)",
          "Faktor Penentu = Nilai Maksimum(AP Coverage, AP Kapasitas)",
          "Total AP Gedung = ceil(Faktor Penentu / Jumlah Lantai) × Jumlah Lantai",
          "Budget Switch PoE = ceil(Total AP × Daya AP × 1,25) Watt (Headroom Kabel UTP)",
          "Bandwidth ISP = max(50, ceil((Total Pengguna × 2,5 Mbps) / 10) × 10) Mbps Dedicated"
        ],
        "en": [
          "Coverage APs = ceil(Floor Area / Coverage per AP by Partition Type)",
          "Capacity APs = ceil(Total Users / Max Active Clients per AP by Wi-Fi Standard)",
          "Governing Factor = max(Coverage APs, Capacity APs)",
          "Total Building APs = ceil(Governing APs / Floors) × Floors",
          "PoE Switch Budget = ceil(Total APs × AP Wattage × 1.25) Watts (Cable Headroom)",
          "ISP Bandwidth = max(50, ceil((Total Users × 2.5 Mbps) / 10) × 10) Dedicated Mbps"
        ]
      }
    },
    {
      "id": "fiber-loss-budget-calculator",
      "slug": "fiber-loss-budget-calculator",
      "category": "network",
      "title": {
        "id": "Kalkulator Redaman Fiber Optik (dBm) & Box Kabel UTP",
        "en": "Fiber Optic Loss Budget (dBm) & UTP Cable Box Calculator"
      },
      "description": {
        "id": "Hitung redaman link optik GPON/EPON (dBm), splitter ratio, konektor, fusi kabel FO, serta estimasi kebutuhan box kabel UTP LAN dan RJ45.",
        "en": "Calculate GPON/EPON optical link loss budget (dBm), passive splitter loss, splicing, and estimate bulk UTP Ethernet cable boxes and RJ45s."
      },
      "canonicalId": "https://kalkunet.com/id/tools/fiber-loss-budget-calculator",
      "canonicalEn": "https://kalkunet.com/en/tools/fiber-loss-budget-calculator",
      "inputs": [
        {
          "key": "txPowerDbm",
          "label": {
            "id": "Daya Pancar TX Optik (SFP OLT)",
            "en": "Optical TX Launch Power (SFP OLT)"
          },
          "type": "number",
          "defaultValue": 3.5,
          "min": -15,
          "max": 30,
          "step": 0.5,
          "unit": "dBm"
        },
        {
          "key": "fiberLengthKm",
          "label": {
            "id": "Panjang Rute Kabel Serat Optik",
            "en": "Fiber Route Length"
          },
          "type": "number",
          "defaultValue": 2.5,
          "min": 0.05,
          "max": 100,
          "step": 0.5,
          "unit": "km"
        },
        {
          "key": "wavelengthNm",
          "label": {
            "id": "Panjang Gelombang Optik (Wavelength)",
            "en": "Optical Wavelength"
          },
          "type": "select",
          "defaultValue": 1310,
          "options": [
            {
              "value": 1310,
              "label": {
                "id": "1310 nm (0.35 dB/km - Upstream Standar)",
                "en": "1310 nm (0.35 dB/km - Standard Upstream)"
              }
            },
            {
              "value": 1490,
              "label": {
                "id": "1490 nm (0.22 dB/km - Downstream PON)",
                "en": "1490 nm (0.22 dB/km - PON Downstream)"
              }
            },
            {
              "value": 1550,
              "label": {
                "id": "1550 nm (0.22 dB/km - Long-haul / RF Video)",
                "en": "1550 nm (0.22 dB/km - Long-haul / RF Video)"
              }
            }
          ]
        },
        {
          "key": "spliceCount",
          "label": {
            "id": "Jumlah Titik Sambungan Fusi (Splice)",
            "en": "Fusion Splice Joints"
          },
          "type": "number",
          "defaultValue": 4,
          "min": 0,
          "max": 100,
          "step": 1
        },
        {
          "key": "connectorCount",
          "label": {
            "id": "Jumlah Pasang Konektor SC/LC",
            "en": "Mated Connector Pairs"
          },
          "type": "number",
          "defaultValue": 4,
          "min": 0,
          "max": 100,
          "step": 1
        },
        {
          "key": "splitterRatio",
          "label": {
            "id": "Rasio Passive Splitter PLC",
            "en": "Passive PLC Splitter Ratio"
          },
          "type": "select",
          "defaultValue": "1:8",
          "options": [
            {
              "value": "none",
              "label": {
                "id": "Tanpa Splitter / Point-to-Point (0 dB)",
                "en": "None / Point-to-Point (0 dB)"
              }
            },
            {
              "value": "1:2",
              "label": {
                "id": "Splitter 1:2 (~3.7 dB)",
                "en": "1:2 Splitter (~3.7 dB)"
              }
            },
            {
              "value": "1:4",
              "label": {
                "id": "Splitter 1:4 (~7.2 dB)",
                "en": "1:4 Splitter (~7.2 dB)"
              }
            },
            {
              "value": "1:8",
              "label": {
                "id": "Splitter 1:8 (~10.5 dB)",
                "en": "1:8 Splitter (~10.5 dB)"
              }
            },
            {
              "value": "1:16",
              "label": {
                "id": "Splitter 1:16 (~13.8 dB)",
                "en": "1:16 Splitter (~13.8 dB)"
              }
            },
            {
              "value": "1:32",
              "label": {
                "id": "Splitter 1:32 (~17.2 dB)",
                "en": "1:32 Splitter (~17.2 dB)"
              }
            },
            {
              "value": "1:64",
              "label": {
                "id": "Splitter 1:64 (~20.5 dB)",
                "en": "1:64 Splitter (~20.5 dB)"
              }
            }
          ]
        },
        {
          "key": "lanDropPoints",
          "label": {
            "id": "Titik Tarikan Kabel LAN UTP",
            "en": "Planned LAN Copper Drops"
          },
          "type": "number",
          "defaultValue": 24,
          "min": 1,
          "max": 1000,
          "step": 1
        },
        {
          "key": "avgDropLengthM",
          "label": {
            "id": "Rata-rata Panjang Tarikan LAN",
            "en": "Average LAN Drop Length"
          },
          "type": "number",
          "defaultValue": 35,
          "min": 5,
          "max": 150,
          "step": 5,
          "unit": "m"
        }
      ],
      "formulas": {
        "id": [
          "Redaman Kabel = Panjang FO km × Atenuasi per km (0,35 dB/km @ 1310nm; 0,22 dB/km @ 1550nm)",
          "Redaman Sambungan = Titik Fusi × 0,10 dB; Redaman Konektor = Pasang SC/LC × 0,35 dB",
          "Total Redaman = Redaman Kabel + Redaman Fusi + Redaman Konektor + Redaman Splitter",
          "Sinyal Terima RX = Daya Pancar TX (dBm) - Total Redaman (dB)",
          "Total Meter UTP = ceil(Titik LAN × Rata-rata Meter × 1,15) (+15% Slack Tray/Konduit)",
          "Box Kabel UTP = ceil(Total Meter UTP / 305); RJ45 = ceil(Titik LAN × 2 × 1,20)"
        ],
        "en": [
          "Fiber Cable Loss = Length km × Attenuation rate (0.35 dB/km @ 1310nm; 0.22 dB/km @ 1550nm)",
          "Splice Loss = Splices × 0.10 dB; Connector Loss = Mated SC/LC Pairs × 0.35 dB",
          "Total Path Loss = Cable Loss + Splice Loss + Connector Loss + Splitter Loss",
          "Received Power RX = TX Power (dBm) - Total Path Loss (dB)",
          "Total UTP Meters = ceil(LAN Drops × Avg Drop Length × 1.15) (+15% Routing Slack)",
          "UTP Pull Boxes = ceil(Total UTP Meters / 305); RJ45 Plugs = ceil(LAN Drops × 2 × 1.20)"
        ]
      }
    },
    {
      "id": "dbm-converter",
      "slug": "dbm-converter",
      "category": "network",
      "title": {
        "id": "Konverter dBm ke mW & Kalkulator Free Space Path Loss (FSPL)",
        "en": "dBm to mW Converter & Free Space Path Loss (FSPL) Calculator"
      },
      "description": {
        "id": "Konversi daya RF antara dBm, milliwatt (mW), Watt, dan dBW, serta hitung redaman propagasi ruang bebas (Free Space Path Loss / FSPL) gelombang radio.",
        "en": "Convert RF power between dBm, milliwatts (mW), Watts, and dBW, and calculate Free Space Path Loss (FSPL) attenuation for wireless radio links."
      },
      "canonicalId": "https://kalkunet.com/id/tools/dbm-converter",
      "canonicalEn": "https://kalkunet.com/en/tools/dbm-converter",
      "inputs": [
        {
          "key": "mode",
          "label": {
            "id": "Mode Kalkulasi",
            "en": "Calculation Mode"
          },
          "type": "select",
          "defaultValue": "dbm-to-mw",
          "options": [
            {
              "value": "dbm-to-mw",
              "label": {
                "id": "Konversi Daya: dBm ke mW / Watt / dBW",
                "en": "Power Conversion: dBm to mW / Watts / dBW"
              }
            },
            {
              "value": "mw-to-dbm",
              "label": {
                "id": "Konversi Daya: mW ke dBm / Watt / dBW",
                "en": "Power Conversion: mW to dBm / Watts / dBW"
              }
            },
            {
              "value": "fspl",
              "label": {
                "id": "Redaman Ruang Bebas: FSPL (Jarak & Frekuensi)",
                "en": "Free Space Path Loss: FSPL (Distance & Frequency)"
              }
            }
          ]
        },
        {
          "key": "powerDbm",
          "label": {
            "id": "Daya Sinyal (dBm)",
            "en": "Power Level (dBm)"
          },
          "type": "number",
          "defaultValue": 20,
          "min": -120,
          "max": 100,
          "step": 1,
          "unit": "dBm"
        },
        {
          "key": "powerMw",
          "label": {
            "id": "Daya Sinyal (mW)",
            "en": "Power Level (mW)"
          },
          "type": "number",
          "defaultValue": 100,
          "min": 0.0001,
          "max": 1000000,
          "step": 10,
          "unit": "mW"
        },
        {
          "key": "distanceKm",
          "label": {
            "id": "Jarak Propagasi Link",
            "en": "Link Propagation Distance"
          },
          "type": "number",
          "defaultValue": 5,
          "min": 0.01,
          "max": 500,
          "step": 0.5,
          "unit": "km"
        },
        {
          "key": "frequencyGhz",
          "label": {
            "id": "Frekuensi Radio",
            "en": "Radio Carrier Frequency"
          },
          "type": "number",
          "defaultValue": 5.8,
          "min": 0.1,
          "max": 100,
          "step": 0.1,
          "unit": "GHz"
        }
      ],
      "formulas": {
        "id": [
          "mW ke dBm = 10 × log10(Daya mW)",
          "dBm ke mW = 10^(Daya dBm / 10)",
          "Watt = mW / 1000; dBW = dBm - 30",
          "FSPL (dB) = 20 × log10(Jarak km) + 20 × log10(Frekuensi GHz) + 92,45"
        ],
        "en": [
          "mW to dBm = 10 × log10(Power mW)",
          "dBm to mW = 10^(Power dBm / 10)",
          "Watts = mW / 1000; dBW = dBm - 30",
          "FSPL (dB) = 20 × log10(Distance km) + 20 × log10(Frequency GHz) + 92.45"
        ]
      }
    },
    {
      "id": "wireless-ptp-calculator",
      "slug": "wireless-ptp-calculator",
      "category": "network",
      "title": {
        "id": "Kalkulator Link Budget Wireless PtP & Zona Fresnel",
        "en": "Wireless PtP Link Budget & Fresnel Zone Calculator"
      },
      "description": {
        "id": "Hitung sinyal terima RX (dBm), redaman ruang bebas FSPL, radius zona Fresnel 60%, kelengkungan bumi, dan tinggi tower triangle link wireless PtP.",
        "en": "Calculate received RX signal (dBm), free-space path loss FSPL, 60% Fresnel clearance, earth curvature bulge, and minimum triangle tower heights."
      },
      "canonicalId": "https://kalkunet.com/id/tools/wireless-ptp-calculator",
      "canonicalEn": "https://kalkunet.com/en/tools/wireless-ptp-calculator",
      "inputs": [
        {
          "key": "distKm",
          "label": {
            "id": "Jarak Link Wireless",
            "en": "Wireless Link Distance"
          },
          "type": "number",
          "defaultValue": 5,
          "min": 0.2,
          "max": 150,
          "step": 0.5,
          "unit": "km"
        },
        {
          "key": "freqGhz",
          "label": {
            "id": "Frekuensi Radio Pembawa",
            "en": "Carrier Radio Frequency"
          },
          "type": "number",
          "defaultValue": 5.8,
          "min": 0.8,
          "max": 80,
          "step": 0.1,
          "unit": "GHz"
        },
        {
          "key": "txDbm",
          "label": {
            "id": "Daya Pancar Radio TX",
            "en": "Radio TX Power"
          },
          "type": "number",
          "defaultValue": 24,
          "min": -10,
          "max": 35,
          "step": 1,
          "unit": "dBm"
        },
        {
          "key": "antGainDbi",
          "label": {
            "id": "Gain Antena Dish (Per Sisi)",
            "en": "Dish Antenna Gain (Per Side)"
          },
          "type": "number",
          "defaultValue": 23,
          "min": 0,
          "max": 45,
          "step": 1,
          "unit": "dBi"
        },
        {
          "key": "obstacleM",
          "label": {
            "id": "Tinggi Halangan Tengah (Pohon/Gedung)",
            "en": "Midpoint Obstacle Height"
          },
          "type": "number",
          "defaultValue": 12,
          "min": 0,
          "max": 100,
          "step": 1,
          "unit": "m"
        }
      ],
      "formulas": {
        "id": [
          "FSPL (dB) = 20 × log10(Jarak km) + 20 × log10(Frekuensi GHz) + 92,45",
          "Sinyal Terima RX (dBm) = TX + Gain TX + Gain RX - FSPL - Rugi Kabel (2 dB)",
          "Radius Fresnel ke-1 (m) = 8,656 × sqrt(Jarak km / Frekuensi GHz)",
          "Clearance 60% Fresnel = Radius Fresnel × 0,60",
          "Kelengkungan Bumi (m) = (Jarak km²) / 68 di titik tengah lintasan",
          "Tinggi Tower Minimal = ceil(Tinggi Halangan + Kelengkungan Bumi + Clearance 60% Fresnel)"
        ],
        "en": [
          "FSPL (dB) = 20 × log10(Dist km) + 20 × log10(Freq GHz) + 92.45",
          "Received RX (dBm) = TX + Gain TX + Gain RX - FSPL - Cable Losses (2 dB)",
          "1st Fresnel Radius (m) = 8.656 × sqrt(Dist km / Freq GHz)",
          "60% Fresnel Clearance = Fresnel Radius × 0.60",
          "Earth Curvature Bulge (m) = (Dist km²) / 68 at trajectory midpoint",
          "Minimum Tower Height = ceil(Obstacle Height + Earth Bulge + 60% Fresnel Clearance)"
        ]
      }
    },
    {
      "id": "cctv-lens-calculator",
      "slug": "cctv-lens-calculator",
      "category": "cctv",
      "title": {
        "id": "Kalkulator Rekomendasi Lensa CCTV & Sudut FoV",
        "en": "CCTV Lens Selection & Field of View Calculator"
      },
      "description": {
        "id": "Hitung rekomendasi focal length lensa CCTV (2.8mm, 4mm, 6mm, 12mm), lebar cakupan area FoV, dan kerapatan piksel DORI sesuai jarak target objek.",
        "en": "Calculate CCTV lens focal length recommendations (2.8mm, 4mm, 6mm, 12mm), field of view coverage width, and DORI pixel density per target distance."
      },
      "canonicalId": "https://kalkunet.com/id/tools/cctv-lens-calculator",
      "canonicalEn": "https://kalkunet.com/en/tools/cctv-lens-calculator",
      "inputs": [
        {
          "key": "targetDistM",
          "label": {
            "id": "Jarak Target Objek",
            "en": "Target Object Distance"
          },
          "type": "number",
          "defaultValue": 8,
          "min": 1,
          "max": 200,
          "step": 0.5,
          "unit": "m"
        },
        {
          "key": "resolution",
          "label": {
            "id": "Resolusi Sensor Kamera",
            "en": "Camera Sensor Resolution"
          },
          "type": "select",
          "defaultValue": "1080p",
          "options": [
            {
              "value": "1080p",
              "label": {
                "id": "2 MP (1080p Full HD - 1920×1080)",
                "en": "2 MP (1080p Full HD - 1920×1080)"
              }
            },
            {
              "value": "4mp",
              "label": {
                "id": "4 MP (2K QHD - 2560×1440)",
                "en": "4 MP (2K QHD - 2560×1440)"
              }
            },
            {
              "value": "4k",
              "label": {
                "id": "8 MP (4K Ultra HD - 3840×2160)",
                "en": "8 MP (4K Ultra HD - 3840×2160)"
              }
            }
          ]
        }
      ],
      "formulas": {
        "id": [
          "Jarak Objek <= 6 m: Rekomendasi Lensa 2.8 mm (Ultra Wide ~103°, Lebar Area = Jarak × 2,4)",
          "Jarak Objek 6–12 m: Rekomendasi Lensa 4.0 mm (Standard Angle ~80°, Lebar Area = Jarak × 1,65)",
          "Jarak Objek 12–20 m: Rekomendasi Lensa 6.0 mm (Narrow Focus ~50°, Lebar Area = Jarak × 0,90)",
          "Jarak Objek > 20 m: Rekomendasi Lensa 12 mm / Varifocal (~25°, Lebar Area = Jarak × 0,45)",
          "Kerapatan Piksel (PPM) = Piksel Horizontal Sensor / Lebar Bidang Pandang (m)",
          "Batas Jangkauan DORI (m) = Piksel Horizontal / (Threshold PPM × Faktor Lebar Lensa)"
        ],
        "en": [
          "Object Distance <= 6 m: Recommended Lens 2.8 mm (Ultra Wide ~103°, Scene Width = Dist × 2.4)",
          "Object Distance 6–12 m: Recommended Lens 4.0 mm (Standard Angle ~80°, Scene Width = Dist × 1.65)",
          "Object Distance 12–20 m: Recommended Lens 6.0 mm (Narrow Focus ~50°, Scene Width = Dist × 0.90)",
          "Object Distance > 20 m: Recommended Lens 12 mm / Varifocal (~25°, Scene Width = Dist × 0.45)",
          "Pixel Density (PPM) = Sensor Horizontal Pixels / Scene Coverage Width (m)",
          "DORI Distance Reach (m) = Sensor Pixels / (Threshold PPM × Lens Width Factor)"
        ]
      }
    },
    {
      "id": "dori-calculator",
      "slug": "dori-calculator",
      "category": "cctv",
      "title": {
        "id": "Kalkulator Jarak DORI CCTV (EN 62676-4)",
        "en": "CCTV DORI Distance Calculator (EN 62676-4)"
      },
      "description": {
        "id": "Hitung jangkauan jarak DORI CCTV standar EN 62676-4 untuk Deteksi, Observasi, Pengenalan, dan Identifikasi wajah berdasarkan resolusi sensor dan lensa.",
        "en": "Calculate EN 62676-4 CCTV DORI detection, observation, recognition, and facial identification reach distances based on sensor resolution and lens optics."
      },
      "canonicalId": "https://kalkunet.com/id/tools/dori-calculator",
      "canonicalEn": "https://kalkunet.com/en/tools/dori-calculator",
      "inputs": [
        {
          "key": "targetDistM",
          "label": {
            "id": "Jarak Target Sasaran",
            "en": "Target Distance"
          },
          "type": "number",
          "defaultValue": 10,
          "min": 1,
          "max": 200,
          "step": 0.5,
          "unit": "m"
        },
        {
          "key": "resolution",
          "label": {
            "id": "Resolusi Sensor Kamera",
            "en": "Camera Sensor Resolution"
          },
          "type": "select",
          "defaultValue": "1080p",
          "options": [
            {
              "value": "1080p",
              "label": {
                "id": "2 MP (1080p Full HD - 1920×1080)",
                "en": "2 MP (1080p Full HD - 1920×1080)"
              }
            },
            {
              "value": "4mp",
              "label": {
                "id": "4 MP (2K QHD - 2560×1440)",
                "en": "4 MP (2K QHD - 2560×1440)"
              }
            },
            {
              "value": "4k",
              "label": {
                "id": "8 MP (4K Ultra HD - 3840×2160)",
                "en": "8 MP (4K Ultra HD - 3840×2160)"
              }
            }
          ]
        },
        {
          "key": "focalMm",
          "label": {
            "id": "Panjang Fokus Lensa (Focal Length)",
            "en": "Lens Focal Length"
          },
          "type": "select",
          "defaultValue": 4,
          "options": [
            {
              "value": 2.8,
              "label": {
                "id": "2.8 mm (Ultra Wide ~103°)",
                "en": "2.8 mm (Ultra Wide ~103°)"
              }
            },
            {
              "value": 4,
              "label": {
                "id": "4 mm (Standard ~80°)",
                "en": "4 mm (Standard ~80°)"
              }
            },
            {
              "value": 6,
              "label": {
                "id": "6 mm (Narrow Focus ~50°)",
                "en": "6 mm (Narrow Focus ~50°)"
              }
            },
            {
              "value": 12,
              "label": {
                "id": "12 mm (Telephoto ~25°)",
                "en": "12 mm (Telephoto ~25°)"
              }
            }
          ]
        }
      ],
      "formulas": {
        "id": [
          "Deteksi (Detection): 25 PPM (Operator melihat keberadaan manusia)",
          "Observasi (Observation): 62,5 PPM (Melihat aktivitas dan pakaian)",
          "Pengenalan (Recognition): 125 PPM (Mengenali orang yang sudah dikenal)",
          "Identifikasi (Identification): 250 PPM (Standar forensik identifikasi wajah tanpa keraguan)",
          "Kerapatan Piksel (PPM) = Piksel Horizontal Sensor / Lebar Bidang Pandang (m)",
          "Jarak Maksimal (m) = Piksel Horizontal / (PPM × Pengali Lebar FoV Lensa)"
        ],
        "en": [
          "Detection: 25 PPM (Operator confirms presence of a human subject)",
          "Observation: 62.5 PPM (Observer distinguishes clothing and activities)",
          "Recognition: 125 PPM (Observer verifies whether individual is previously known)",
          "Identification: 250 PPM (Forensic legal standard for facial identification beyond doubt)",
          "Pixel Density (PPM) = Sensor Horizontal Pixels / Scene Coverage Width (m)",
          "Max Reach Distance (m) = Sensor Horizontal Pixels / (PPM × Lens Width Multiplier)"
        ]
      }
    },
    {
      "id": "poe-voltage-drop-calculator",
      "slug": "poe-voltage-drop-calculator",
      "category": "cctv",
      "title": {
        "id": "Kalkulator Jatuh Tegangan (Voltage Drop) Kabel PoE",
        "en": "PoE Cable Voltage Drop Calculator"
      },
      "description": {
        "id": "Hitung jatuh tegangan (voltage drop) kabel UTP PoE Cat6, Cat5e, dan CCA, sisa voltase ujung kamera, batas jarak aman, dan risiko restart malam hari.",
        "en": "Calculate PoE Cat6, Cat5e, and CCA cable voltage drop, delivered terminal voltage, safe run distances, and night-time infrared reboot risks."
      },
      "canonicalId": "https://kalkunet.com/id/tools/poe-voltage-drop-calculator",
      "canonicalEn": "https://kalkunet.com/en/tools/poe-voltage-drop-calculator",
      "inputs": [
        {
          "key": "cableLenM",
          "label": {
            "id": "Panjang Tarikan Kabel",
            "en": "Cable Run Length"
          },
          "type": "number",
          "defaultValue": 65,
          "min": 1,
          "max": 500,
          "step": 1,
          "unit": "m"
        },
        {
          "key": "cableType",
          "label": {
            "id": "Jenis & Konduktor Kabel",
            "en": "Cable Conductor Type"
          },
          "type": "select",
          "defaultValue": "cat6",
          "options": [
            {
              "value": "cat6",
              "label": {
                "id": "Cat6 Tembaga Murni (Pure Copper ~14.0 Ω/100m)",
                "en": "Cat6 Pure Bare Copper (~14.0 Ω/100m)"
              }
            },
            {
              "value": "cat5e",
              "label": {
                "id": "Cat5e Tembaga Murni (Pure Copper ~18.8 Ω/100m)",
                "en": "Cat5e Pure Bare Copper (~18.8 Ω/100m)"
              }
            },
            {
              "value": "cca",
              "label": {
                "id": "Kabel CCA Campuran Aluminium (~32.0 Ω/100m - Murah)",
                "en": "Copper-Clad Aluminum CCA (~32.0 Ω/100m - Budget)"
              }
            }
          ]
        },
        {
          "key": "camPowerWatt",
          "label": {
            "id": "Daya Beban Perangkat (Watt)",
            "en": "Device Load Power (Watts)"
          },
          "type": "number",
          "defaultValue": 8,
          "min": 0.5,
          "max": 90,
          "step": 0.5,
          "unit": "W"
        },
        {
          "key": "sourceVoltage",
          "label": {
            "id": "Tegangan Sumber Switch PoE",
            "en": "PoE Switch Source Voltage"
          },
          "type": "select",
          "defaultValue": 48,
          "options": [
            {
              "value": 48,
              "label": {
                "id": "48V DC (Standar Nominal IEEE 802.3af/at)",
                "en": "48V DC (Standard IEEE 802.3af/at Nominal)"
              }
            },
            {
              "value": 52,
              "label": {
                "id": "52V DC (Switch PoE Industri / Long Range)",
                "en": "52V DC (Industrial / Long Range PoE Switch)"
              }
            },
            {
              "value": 54,
              "label": {
                "id": "54V DC (Standar IEEE 802.3bt Ultra PoE)",
                "en": "54V DC (IEEE 802.3bt Ultra PoE PSE)"
              }
            },
            {
              "value": 24,
              "label": {
                "id": "24V DC (Passive PoE MikroTik / Ubiquiti)",
                "en": "24V DC (Passive PoE MikroTik / Ubiquiti)"
              }
            }
          ]
        }
      ],
      "formulas": {
        "id": [
          "Hambatan Total Loop (Ω) = (Hambatan per 100m × Panjang Kabel m) ÷ 100",
          "Arus Listrik (A) = Daya Beban Watt ÷ Tegangan Sumber DC",
          "Jatuh Tegangan (V) = Arus Listrik A × Hambatan Total Ω",
          "Tegangan Akhir Ujung (V) = Tegangan Sumber - Jatuh Tegangan",
          "Persentase Drop (%) = (Jatuh Tegangan ÷ Tegangan Sumber) × 100",
          "Daya Hilang Jadi Panas (W) = Jatuh Tegangan × Arus Listrik"
        ],
        "en": [
          "Total Loop Resistance (Ω) = (Resistance per 100m × Run Length m) ÷ 100",
          "Electrical Current (A) = Load Power Watts ÷ Source Voltage DC",
          "Voltage Drop (V) = Current A × Total Resistance Ω",
          "Terminal Endpoint Voltage (V) = Source Voltage - Voltage Drop",
          "Percentage Drop (%) = (Voltage Drop ÷ Source Voltage) × 100",
          "Thermal Power Dissipation (W) = Voltage Drop × Current A"
        ]
      }
    },
    {
      "id": "cctv-storage-calculator",
      "slug": "cctv-storage-calculator",
      "category": "cctv",
      "title": {
        "id": "Kalkulator Kapasitas Hardisk NVR CCTV & Bandwidth",
        "en": "CCTV NVR Storage Capacity & Bandwidth Calculator"
      },
      "description": {
        "id": "Hitung kapasitas hardisk NVR CCTV (TB), bandwidth jaringan Mbps, durasi rekaman harian, switch PoE, dan rekomendasi HDD surveillance.",
        "en": "Calculate CCTV NVR storage capacity (TB), network ingress bandwidth Mbps, recording retention days, PoE budgets, and surveillance HDD recommendations."
      },
      "canonicalId": "https://kalkunet.com/id/tools/cctv-storage-calculator",
      "canonicalEn": "https://kalkunet.com/en/tools/cctv-storage-calculator",
      "inputs": [
        {
          "key": "camCount",
          "label": {
            "id": "Jumlah Titik Kamera IP",
            "en": "IP Camera Count"
          },
          "type": "number",
          "defaultValue": 16,
          "min": 1,
          "max": 256,
          "step": 1
        },
        {
          "key": "days",
          "label": {
            "id": "Target Durasi Retensi",
            "en": "Target Retention Days"
          },
          "type": "number",
          "defaultValue": 30,
          "min": 1,
          "max": 365,
          "step": 1,
          "unit": "hari"
        },
        {
          "key": "hours",
          "label": {
            "id": "Jam Rekam per Hari",
            "en": "Daily Recording Hours"
          },
          "type": "number",
          "defaultValue": 24,
          "min": 1,
          "max": 24,
          "step": 1,
          "unit": "jam"
        },
        {
          "key": "mode",
          "label": {
            "id": "Metode Pemicu Rekam",
            "en": "Recording Trigger Mode"
          },
          "type": "select",
          "defaultValue": "motion",
          "options": [
            {
              "value": "motion",
              "label": {
                "id": "Motion Detection (Merekam Hanya Saat Ada Gerakan)",
                "en": "Motion Detection (Records Only On Movement)"
              }
            },
            {
              "value": "continuous",
              "label": {
                "id": "Continuous 24/7 (Merekam Terus Menerus Tanpa Henti)",
                "en": "Continuous 24/7 (Non-stop Recording)"
              }
            }
          ]
        },
        {
          "key": "motionPct",
          "label": {
            "id": "Persentase Aktivitas Gerakan (Motion %)",
            "en": "Motion Activity Ratio (%)"
          },
          "type": "number",
          "defaultValue": 40,
          "min": 1,
          "max": 100,
          "step": 5,
          "unit": "%"
        },
        {
          "key": "resolution",
          "label": {
            "id": "Resolusi Sensor Kamera",
            "en": "Camera Sensor Resolution"
          },
          "type": "select",
          "defaultValue": "2mp",
          "options": [
            {
              "value": "1mp",
              "label": {
                "id": "1.3 MP (720p HD - 1280×720)",
                "en": "1.3 MP (720p HD - 1280×720)"
              }
            },
            {
              "value": "2mp",
              "label": {
                "id": "2 MP (1080p Full HD - 1920×1080)",
                "en": "2 MP (1080p Full HD - 1920×1080)"
              }
            },
            {
              "value": "4mp",
              "label": {
                "id": "4 MP (2K QHD - 2560×1440)",
                "en": "4 MP (2K QHD - 2560×1440)"
              }
            },
            {
              "value": "5mp",
              "label": {
                "id": "5 MP (Super HD - 2592×1944)",
                "en": "5 MP (Super HD - 2592×1944)"
              }
            },
            {
              "value": "8mp",
              "label": {
                "id": "8 MP (4K Ultra HD - 3840×2160)",
                "en": "8 MP (4K Ultra HD - 3840×2160)"
              }
            }
          ]
        },
        {
          "key": "codec",
          "label": {
            "id": "Kompresi Video Codec",
            "en": "Video Codec Compression"
          },
          "type": "select",
          "defaultValue": "h265+",
          "options": [
            {
              "value": "h265+",
              "label": {
                "id": "H.265+ / Smart Codec (Paling Efisien, Hemat ~65%)",
                "en": "H.265+ / Smart Codec (Most Efficient, Saves ~65%)"
              }
            },
            {
              "value": "h265",
              "label": {
                "id": "H.265 HEVC (Standar Efisien, Hemat ~50%)",
                "en": "H.265 HEVC (Standard Efficient, Saves ~50%)"
              }
            },
            {
              "value": "h264",
              "label": {
                "id": "H.264 AVC (Codec Tradisional Legacy)",
                "en": "H.264 AVC (Legacy Codec)"
              }
            }
          ]
        },
        {
          "key": "fps",
          "label": {
            "id": "Kecepatan Bingkai (Frame Rate FPS)",
            "en": "Frame Rate (FPS)"
          },
          "type": "number",
          "defaultValue": 25,
          "min": 5,
          "max": 60,
          "step": 1,
          "unit": "fps"
        },
        {
          "key": "quality",
          "label": {
            "id": "Profil Kualitas Gambar",
            "en": "Video Quality Profile"
          },
          "type": "select",
          "defaultValue": "high",
          "options": [
            {
              "value": "high",
              "label": {
                "id": "High (Ketajaman Tinggi - Standar)",
                "en": "High (Optimal Acuity - Standard)"
              }
            },
            {
              "value": "medium",
              "label": {
                "id": "Medium (Kualitas Sedang)",
                "en": "Medium (Balanced Quality)"
              }
            },
            {
              "value": "low",
              "label": {
                "id": "Low (Kualitas Rendah / Hemat Bandwidth)",
                "en": "Low (Bandwidth Saving)"
              }
            }
          ]
        }
      ],
      "formulas": {
        "id": [
          "Bitrate per Kamera (kbps) = Base Bitrate Resolusi × Faktor Codec × (FPS ÷ 25) × Faktor Kualitas",
          "Bandwidth Total (Mbps) = (Bitrate kbps ÷ 1000) × Jumlah Kamera × 1,10 (Overhead RTSP/TCP)",
          "Jam Rekam Efektif = Mode Motion ? (Jam Harian × % Motion ÷ 100) : Jam Harian",
          "Storage GB/Hari = (Bitrate kbps × 3600 detik × Jam Efektif × Kamera) ÷ (8 × 1024 × 1024)",
          "Kapasitas NVR Total (TB) = (Storage GB/Hari × Hari) ÷ 1024 × 1,10 Headroom [× 1,25 jika RAID 5]",
          "Budget Daya PoE Switch (W) = ceil(Jumlah Kamera × Daya Watt/Kamera × 1,25 Margin)"
        ],
        "en": [
          "Bitrate per Camera (kbps) = Base Resolution Bitrate × Codec Factor × (FPS ÷ 25) × Quality Factor",
          "Total Bandwidth (Mbps) = (Bitrate kbps ÷ 1000) × Camera Count × 1.10 (RTSP/TCP Overhead)",
          "Effective Daily Hours = Motion Mode ? (Daily Hours × Motion % ÷ 100) : Daily Hours",
          "Daily Ingestion (GB) = (Bitrate kbps × 3600s × Effective Hours × Cameras) ÷ (8 × 1024 × 1024)",
          "Total NVR Storage (TB) = (Daily Ingestion GB × Days) ÷ 1024 × 1.10 Headroom [× 1.25 if RAID 5]",
          "PoE Switch Power Budget (W) = ceil(Camera Count × Wattage/Cam × 1.25 Margin)"
        ]
      }
    },
    {
      "id": "cctv-bom-estimator",
      "slug": "cctv-bom-estimator",
      "category": "cctv",
      "title": {
        "id": "Estimator Kebutuhan Material Instalasi CCTV (BOM)",
        "en": "CCTV Installation Material BOM Estimator"
      },
      "description": {
        "id": "Hitung estimasi kebutuhan material instalasi CCTV (BOM): box kabel UTP Cat6, konektor RJ45, duradus junction box, pipa conduit, dan kabel ties.",
        "en": "Estimate CCTV installation material Bill of Materials (BOM): Cat6 UTP cable boxes, RJ45 modular plugs, junction boxes, conduit pipes, and cable ties."
      },
      "canonicalId": "https://kalkunet.com/id/tools/cctv-bom-estimator",
      "canonicalEn": "https://kalkunet.com/en/tools/cctv-bom-estimator",
      "inputs": [
        {
          "key": "indoorCams",
          "label": {
            "id": "Jumlah Kamera Indoor (Dome)",
            "en": "Indoor Dome Cameras"
          },
          "type": "number",
          "defaultValue": 10,
          "min": 0,
          "max": 128,
          "step": 1
        },
        {
          "key": "outdoorCams",
          "label": {
            "id": "Jumlah Kamera Outdoor (Bullet/PTZ)",
            "en": "Outdoor Bullet/PTZ Cameras"
          },
          "type": "number",
          "defaultValue": 6,
          "min": 0,
          "max": 128,
          "step": 1
        },
        {
          "key": "avgCableM",
          "label": {
            "id": "Rata-rata Tarikan Kabel per Titik",
            "en": "Average Cable Length per Camera"
          },
          "type": "number",
          "defaultValue": 35,
          "min": 5,
          "max": 200,
          "step": 1,
          "unit": "m"
        },
        {
          "key": "useConduit",
          "label": {
            "id": "Penggunaan Pipa Pelindung Conduit",
            "en": "PVC Conduit Piping Protection"
          },
          "type": "select",
          "defaultValue": true,
          "options": [
            {
              "value": true,
              "label": {
                "id": "Gunakan Pipa Conduit PVC 20mm (75% Jalur Terproteksi)",
                "en": "Deploy 20mm PVC Conduit (75% Path Shielded)"
              }
            },
            {
              "value": false,
              "label": {
                "id": "Tanpa Pipa Conduit (Jalur Klem Kabel / Tray)",
                "en": "No Conduit (Surface Clips / Dedicated Tray)"
              }
            }
          ]
        }
      ],
      "formulas": {
        "id": [
          "Total Panjang Kabel (m) = ceil(Total Kamera × Jarak Rata-rata × 1,15 Slack Plafon & Rak)",
          "Jumlah Box Kabel (@ 305m) = ceil(Total Panjang Kabel ÷ 305)",
          "Konektor RJ45 (Pcs) = ceil(Total Kamera × 2 Ujung × 1,25 Cadangan Lapangan)",
          "Junction Box Waterproof = 1 Unit per Titik Kamera (Duradus 10×10 cm)",
          "Pipa Conduit 20mm (Batang @ 2,9m) = ceil((Total Kabel × 0,75 Jalur Proteksi) ÷ 2,9)",
          "Pipa Fleksibel (Roll @ 25m) = ceil(Total Kamera × 1,2m ÷ 25)",
          "Kabel Ties Nylon (Pack @ 100 pcs) = max(2, ceil(Total Kamera ÷ 4))"
        ],
        "en": [
          "Total Cable Length (m) = ceil(Total Cameras × Average Span × 1.15 Slack Allowance)",
          "Cable Pull Boxes (@ 305m) = ceil(Total Cable Length ÷ 305)",
          "Modular RJ45 Plugs (Pcs) = ceil(Total Cameras × 2 Ends × 1.25 Field Allowance)",
          "Waterproof Junction Box = 1 Enclosure per Camera Point (Duradus 10×10 cm)",
          "PVC Conduit 20mm (Sticks @ 2.9m) = ceil((Total Cable × 0.75 Protected) ÷ 2.9)",
          "Corrugated Flexible Hose (Rolls @ 25m) = ceil(Total Cameras × 1.2m ÷ 25)",
          "Nylon Cable Ties (Packs @ 100 pcs) = max(2, ceil(Total Cameras ÷ 4))"
        ]
      }
    },
    {
      "id": "cctv-ups-calculator",
      "slug": "cctv-ups-calculator",
      "category": "cctv",
      "title": {
        "id": "Kalkulator UPS & Baterai Cadangan CCTV",
        "en": "CCTV UPS & Battery Backup Calculator"
      },
      "description": {
        "id": "Hitung kebutuhan kapasitas UPS (VA) dan baterai aki (Ah) sistem kamera CCTV, NVR, dan switch PoE saat pemadaman listrik PLN berlangsung.",
        "en": "Calculate CCTV camera, NVR, and PoE switch UPS apparent power (VA) and deep-cycle VRLA battery capacity (Ah) for power outage runtime."
      },
      "canonicalId": "https://kalkunet.com/id/tools/cctv-ups-calculator",
      "canonicalEn": "https://kalkunet.com/en/tools/cctv-ups-calculator",
      "inputs": [
        {
          "key": "camCount",
          "label": {
            "id": "Jumlah Titik Kamera IP",
            "en": "Active IP Camera Count"
          },
          "type": "number",
          "defaultValue": 16,
          "min": 1,
          "max": 256,
          "step": 1
        },
        {
          "key": "camWatt",
          "label": {
            "id": "Daya per Kamera Saat Malam Hari",
            "en": "Night-Time Power per Camera"
          },
          "type": "number",
          "defaultValue": 7.5,
          "min": 1,
          "max": 60,
          "step": 0.5,
          "unit": "W"
        },
        {
          "key": "nvrHddCount",
          "label": {
            "id": "Jumlah Harddisk di NVR",
            "en": "NVR Hard Drive Count"
          },
          "type": "number",
          "defaultValue": 2,
          "min": 1,
          "max": 16,
          "step": 1
        },
        {
          "key": "poeSwitches",
          "label": {
            "id": "Jumlah Unit Switch PoE",
            "en": "PoE Switch Appliance Count"
          },
          "type": "number",
          "defaultValue": 1,
          "min": 1,
          "max": 16,
          "step": 1
        },
        {
          "key": "backupHours",
          "label": {
            "id": "Target Waktu Cadangan (Jam)",
            "en": "Target Backup Runtime"
          },
          "type": "number",
          "defaultValue": 4,
          "min": 0.5,
          "max": 24,
          "step": 0.5,
          "unit": "jam"
        },
        {
          "key": "battVoltage",
          "label": {
            "id": "Tegangan Bus Bank Baterai DC",
            "en": "DC Battery Bus Voltage"
          },
          "type": "select",
          "defaultValue": 12,
          "options": [
            {
              "value": 12,
              "label": {
                "id": "12V DC (1× Aki 12V - Sistem Sederhana / Kecil)",
                "en": "12V DC (1× 12V Battery - Compact Systems)"
              }
            },
            {
              "value": 24,
              "label": {
                "id": "24V DC (2× Aki 12V Seri - Sistem Menengah)",
                "en": "24V DC (2× 12V Batteries in Series - Mid-size)"
              }
            },
            {
              "value": 48,
              "label": {
                "id": "48V DC (4× Aki 12V Seri - UPS Enterprise / Efisien)",
                "en": "48V DC (4× 12V Batteries in Series - Enterprise)"
              }
            }
          ]
        }
      ],
      "formulas": {
        "id": [
          "Beban Daya Sistem (W) = (Jumlah Kamera × Daya W) + (NVR Base 18W + HDD × 9W) + (Switch × 12W)",
          "Kapasitas UPS Minimal (VA) = ceil((Total Beban Watt × 1,3 Safety Margin) ÷ 0,7 Power Factor)",
          "Kapasitas Baterai Aki (Ah) = ceil((Total Beban Watt × Jam Backup) ÷ (Voltase Bus DC × 0,85 Inverter × 0,80 DoD))",
          "Jumlah Aki 12V = round(Voltase Bus DC ÷ 12)"
        ],
        "en": [
          "Total System Load (W) = (Cameras × Power W) + (NVR Base 18W + HDDs × 9W) + (PoE Switches × 12W)",
          "Recommended UPS Apparent Power (VA) = ceil((Total Watts × 1.3 Safety Margin) ÷ 0.7 Power Factor)",
          "Battery Bank Capacity (Ah) = ceil((Total Watts × Backup Hours) ÷ (DC Bus Volts × 0.85 Inverter × 0.80 DoD))",
          "12V Battery Series Units = round(DC Bus Volts ÷ 12)"
        ]
      }
    },
    {
      "id": "cron-generator",
      "slug": "cron-generator",
      "category": "linux",
      "title": {
        "id": "Generator Ekspresi Cron Job & Jadwal Crontab Linux",
        "en": "Linux Cron Job Expression & Crontab Schedule Generator"
      },
      "description": {
        "id": "Generator ekspresi cron POSIX 5 kolom, baris crontab siap pakai, jadwal 5 eksekusi berikutnya, dan konversi unit systemd timer.",
        "en": "POSIX 5-field cron expression generator, production crontab line builder, next 5 execution timestamps, and systemd timer unit converter."
      },
      "canonicalId": "https://kalkunet.com/id/tools/cron-generator",
      "canonicalEn": "https://kalkunet.com/en/tools/cron-generator",
      "inputs": [
        {
          "key": "preset",
          "label": {
            "id": "Preset Jadwal Populer",
            "en": "Popular Schedule Preset"
          },
          "type": "select",
          "defaultValue": "daily_midnight",
          "options": [
            {
              "value": "custom",
              "label": {
                "id": "Kustom Manual (Edit Ekspresi)",
                "en": "Custom Expression (Manual)"
              }
            },
            {
              "value": "every_minute",
              "label": {
                "id": "Setiap Menit (* * * * *)",
                "en": "Every Minute (* * * * *)"
              }
            },
            {
              "value": "every_5_minutes",
              "label": {
                "id": "Setiap 5 Menit (*/5 * * * *)",
                "en": "Every 5 Minutes (*/5 * * * *)"
              }
            },
            {
              "value": "every_15_minutes",
              "label": {
                "id": "Setiap 15 Menit (*/15 * * * *)",
                "en": "Every 15 Minutes (*/15 * * * *)"
              }
            },
            {
              "value": "every_30_minutes",
              "label": {
                "id": "Setiap 30 Menit (*/30 * * * *)",
                "en": "Every 30 Minutes (*/30 * * * *)"
              }
            },
            {
              "value": "hourly",
              "label": {
                "id": "Setiap Jam (0 * * * *)",
                "en": "Every Hour (0 * * * *)"
              }
            },
            {
              "value": "daily_midnight",
              "label": {
                "id": "Harian Tengah Malam 00:00 (0 0 * * *)",
                "en": "Daily Midnight 00:00 (0 0 * * *)"
              }
            },
            {
              "value": "daily_0600",
              "label": {
                "id": "Harian Pagi 06:00 (0 6 * * *)",
                "en": "Daily Morning 06:00 (0 6 * * *)"
              }
            },
            {
              "value": "daily_noon",
              "label": {
                "id": "Harian Siang 12:00 (0 12 * * *)",
                "en": "Daily Noon 12:00 (0 12 * * *)"
              }
            },
            {
              "value": "daily_1800",
              "label": {
                "id": "Harian Sore 18:00 (0 18 * * *)",
                "en": "Daily Evening 18:00 (0 18 * * *)"
              }
            },
            {
              "value": "weekly_sunday",
              "label": {
                "id": "Mingguan Hari Minggu 00:00 (0 0 * * 0)",
                "en": "Weekly Sunday 00:00 (0 0 * * 0)"
              }
            },
            {
              "value": "weekly_monday",
              "label": {
                "id": "Mingguan Hari Senin 00:00 (0 0 * * 1)",
                "en": "Weekly Monday 00:00 (0 0 * * 1)"
              }
            },
            {
              "value": "weekdays_0900",
              "label": {
                "id": "Hari Kerja Senin-Jumat 09:00 (0 9 * * 1-5)",
                "en": "Weekdays Mon-Fri 09:00 (0 9 * * 1-5)"
              }
            },
            {
              "value": "monthly_first",
              "label": {
                "id": "Bulanan Tanggal 1 00:00 (0 0 1 * *)",
                "en": "Monthly 1st at 00:00 (0 0 1 * *)"
              }
            },
            {
              "value": "quarterly",
              "label": {
                "id": "Kuartalan (0 0 1 1,4,7,10 *)",
                "en": "Quarterly (0 0 1 1,4,7,10 *)"
              }
            },
            {
              "value": "yearly",
              "label": {
                "id": "Tahunan 1 Januari 00:00 (0 0 1 1 *)",
                "en": "Yearly January 1st (0 0 1 1 *)"
              }
            }
          ]
        },
        {
          "key": "expression",
          "label": {
            "id": "Ekspresi Cron (5 atau 6 Kolom)",
            "en": "Cron Expression (5 or 6 Fields)"
          },
          "type": "text",
          "defaultValue": "0 0 * * *"
        },
        {
          "key": "timezone",
          "label": {
            "id": "Zona Waktu Target Eksekusi",
            "en": "Target Execution Timezone"
          },
          "type": "select",
          "defaultValue": "Asia/Jakarta",
          "options": [
            {
              "value": "Asia/Jakarta",
              "label": {
                "id": "Asia/Jakarta (WIB, UTC+7)",
                "en": "Asia/Jakarta (WIB, UTC+7)"
              }
            },
            {
              "value": "Asia/Makassar",
              "label": {
                "id": "Asia/Makassar (WITA, UTC+8)",
                "en": "Asia/Makassar (WITA, UTC+8)"
              }
            },
            {
              "value": "Asia/Jayapura",
              "label": {
                "id": "Asia/Jayapura (WIT, UTC+9)",
                "en": "Asia/Jayapura (WIT, UTC+9)"
              }
            },
            {
              "value": "UTC",
              "label": {
                "id": "UTC (Coordinated Universal Time)",
                "en": "UTC (Coordinated Universal Time)"
              }
            },
            {
              "value": "America/New_York",
              "label": {
                "id": "America/New_York (US Eastern)",
                "en": "America/New_York (US Eastern)"
              }
            },
            {
              "value": "America/Los_Angeles",
              "label": {
                "id": "America/Los_Angeles (US Pacific)",
                "en": "America/Los_Angeles (US Pacific)"
              }
            },
            {
              "value": "Europe/London",
              "label": {
                "id": "Europe/London (GMT/BST)",
                "en": "Europe/London (GMT/BST)"
              }
            },
            {
              "value": "Asia/Singapore",
              "label": {
                "id": "Asia/Singapore (SGT, UTC+8)",
                "en": "Asia/Singapore (SGT, UTC+8)"
              }
            },
            {
              "value": "Asia/Tokyo",
              "label": {
                "id": "Asia/Tokyo (JST, UTC+9)",
                "en": "Asia/Tokyo (JST, UTC+9)"
              }
            }
          ]
        },
        {
          "key": "command",
          "label": {
            "id": "Perintah / Skrip yang Dijalankan",
            "en": "Command / Script to Execute"
          },
          "type": "text",
          "defaultValue": "/usr/local/bin/backup-job.sh"
        }
      ],
      "formulas": {
        "id": [
          "Format 5 kolom standar: <menit: 0-59> <jam: 0-23> <tgl-bulan: 1-31> <bulan: 1-12/JAN-DEC> <hari-minggu: 0-7/SUN-SAT>",
          "Format 6 kolom dengan detik: <detik: 0-59> <menit> <jam> <tgl-bulan> <bulan> <hari-minggu>",
          "Logika Hari POSIX: Jika tgl-bulan !== '*' && hari-minggu !== '*', picu jika DOM cocok OR DOW cocok (operasi UNION)"
        ],
        "en": [
          "Standard 5-field syntax: <minute: 0-59> <hour: 0-23> <day-of-month: 1-31> <month: 1-12/JAN-DEC> <day-of-week: 0-7/SUN-SAT>",
          "Extended 6-field syntax: <second: 0-59> <minute> <hour> <day-of-month> <month> <day-of-week>",
          "POSIX Day Matching Logic: If day-of-month !== '*' && day-of-week !== '*', trigger when DOM matches OR DOW matches (UNION logic)"
        ]
      }
    },
    {
      "id": "chmod-calculator",
      "slug": "chmod-calculator",
      "category": "linux",
      "title": {
        "id": "Kalkulator Izin File Linux Chmod (Octal & Symbolic)",
        "en": "Linux Chmod File Permissions Calculator (Octal & Symbolic)"
      },
      "description": {
        "id": "Konversi izin file Linux chmod oktal (755, 644, 4750) dan simbolik (-rwxr-xr-x), kalkulasi umask, analisis keamanan 777, dan tabel hak akses.",
        "en": "Convert Linux chmod octal (755, 644, 4750) and symbolic (-rwxr-xr-x) permissions, calculate umask, audit 777 security risks, and view breakdown tables."
      },
      "canonicalId": "https://kalkunet.com/id/tools/chmod-calculator",
      "canonicalEn": "https://kalkunet.com/en/tools/chmod-calculator",
      "inputs": [
        {
          "key": "preset",
          "label": {
            "id": "Preset Izin Standar Linux",
            "en": "Standard Linux Permission Preset"
          },
          "type": "select",
          "defaultValue": "p755",
          "options": [
            {
              "value": "custom",
              "label": {
                "id": "Kustom Manual (Edit Nilai Oktal)",
                "en": "Custom Manual (Edit Octal)"
              }
            },
            {
              "value": "p755",
              "label": {
                "id": "755 (rwxr-xr-x) — Direktori Publik & Biner Eksekusi",
                "en": "755 (rwxr-xr-x) — Public Directory & Binaries"
              }
            },
            {
              "value": "p644",
              "label": {
                "id": "644 (rw-r--r--) — File Dokumen & Konfigurasi Standar",
                "en": "644 (rw-r--r--) — Standard Files & Configs"
              }
            },
            {
              "value": "p700",
              "label": {
                "id": "700 (rwx------) — Folder Privat Akun / Direktori .ssh",
                "en": "700 (rwx------) — Private Folder / .ssh Dir"
              }
            },
            {
              "value": "p600",
              "label": {
                "id": "600 (rw-------) — Private Key SSH & Kredensial Sensitif",
                "en": "600 (rw-------) — SSH Private Key & Secrets"
              }
            },
            {
              "value": "p750",
              "label": {
                "id": "750 (rwxr-x---) — Direktori Terbatas Hanya Anggota Grup",
                "en": "750 (rwxr-x---) — Restricted Group-Only Dir"
              }
            },
            {
              "value": "p640",
              "label": {
                "id": "640 (rw-r-----) — File Log & Konfigurasi Terbatas Grup",
                "en": "640 (rw-r-----) — Group-Readable Log & Config"
              }
            },
            {
              "value": "p4755",
              "label": {
                "id": "4755 (rwsr-xr-x) — Biner Khusus dengan SetUID (root)",
                "en": "4755 (rwsr-xr-x) — SetUID Binary (e.g. passwd)"
              }
            },
            {
              "value": "p2755",
              "label": {
                "id": "2755 (rwxr-sr-x) — Folder Kolaborasi Tim dengan SetGID",
                "en": "2755 (rwxr-sr-x) — Team Collaboration with SetGID"
              }
            },
            {
              "value": "p1777",
              "label": {
                "id": "1777 (rwxrwxrwt) — Folder Publik Bersama dengan Sticky Bit (/tmp)",
                "en": "1777 (rwxrwxrwt) — Public Temp with Sticky Bit (/tmp)"
              }
            },
            {
              "value": "p777",
              "label": {
                "id": "777 (rwxrwxrwx) — Akses Bebas Semua Pengguna (Tidak Aman)",
                "en": "777 (rwxrwxrwx) — Unrestricted Access (Insecure)"
              }
            },
            {
              "value": "p666",
              "label": {
                "id": "666 (rw-rw-rw-) — Baca & Tulis Semua Pengguna",
                "en": "666 (rw-rw-rw-) — Read & Write for Everyone"
              }
            }
          ]
        },
        {
          "key": "octal",
          "label": {
            "id": "Nilai Izin Oktal (3 atau 4 Digit)",
            "en": "Octal Permission Value (3 or 4 Digits)"
          },
          "type": "text",
          "defaultValue": "755"
        },
        {
          "key": "umask",
          "label": {
            "id": "Nilai Umask Sistem (Filter Izin Default)",
            "en": "System Umask Value (Default Creation Filter)"
          },
          "type": "text",
          "defaultValue": "022"
        }
      ],
      "formulas": {
        "id": [
          "Bobot Izin Dasar: Read (r) = 4, Write (w) = 2, Execute (x) = 1 (Jumlah: 0 sampai 7)",
          "Bit Khusus: SetUID = 4000 (s/S), SetGID = 2000 (s/S), Sticky Bit = 1000 (t/T)",
          "Izin Berkas Baru = 0666 & ~umask, Izin Direktori Baru = 0777 & ~umask"
        ],
        "en": [
          "Base Permission Weights: Read (r) = 4, Write (w) = 2, Execute (x) = 1 (Sum: 0 to 7)",
          "Special Bits: SetUID = 4000 (s/S), SetGID = 2000 (s/S), Sticky Bit = 1000 (t/T)",
          "New File Mode = 0666 & ~umask, New Directory Mode = 0777 & ~umask"
        ]
      }
    },
    {
      "id": "linux-firewall-generator",
      "slug": "linux-firewall-generator",
      "category": "linux",
      "title": {
        "id": "Generator Firewall Linux UFW, Iptables & Nftables",
        "en": "Linux Firewall Generator (UFW, Iptables & Nftables)"
      },
      "description": {
        "id": "Generate skrip hardening firewall server Linux untuk UFW, iptables, dan /etc/nftables.conf lengkap dengan proteksi rate-limit SSH dan whitelist subnet.",
        "en": "Generate production Linux server firewall rulesets for UFW, iptables, and /etc/nftables.conf with SSH rate-limiting and trusted subnet whitelisting."
      },
      "canonicalId": "https://kalkunet.com/id/tools/linux-firewall-generator",
      "canonicalEn": "https://kalkunet.com/en/tools/linux-firewall-generator",
      "inputs": [
        {
          "key": "defaultPolicy",
          "label": {
            "id": "Kebijakan Default Inbound (Input)",
            "en": "Default Inbound Policy"
          },
          "type": "select",
          "defaultValue": "drop",
          "options": [
            {
              "value": "drop",
              "label": {
                "id": "DROP (Silent Drop — Rekomendasi Server Produksi)",
                "en": "DROP (Silent Drop — Production Recommended)"
              }
            },
            {
              "value": "reject",
              "label": {
                "id": "REJECT (Kirim ICMP Port Unreachable)",
                "en": "REJECT (Send ICMP Unreachable)"
              }
            }
          ]
        },
        {
          "key": "wanInterface",
          "label": {
            "id": "Nama Interface Jaringan WAN",
            "en": "WAN Network Interface Name"
          },
          "type": "text",
          "defaultValue": "eth0"
        },
        {
          "key": "sshPort",
          "label": {
            "id": "Port TCP SSH Server",
            "en": "SSH Server TCP Port"
          },
          "type": "number",
          "defaultValue": 22,
          "min": 1,
          "max": 65535
        },
        {
          "key": "sshRateLimit",
          "label": {
            "id": "Aktifkan Proteksi Brute-Force Rate-Limit pada SSH",
            "en": "Enable SSH Brute-Force Rate-Limiting"
          },
          "type": "boolean",
          "defaultValue": true
        },
        {
          "key": "allowHttp",
          "label": {
            "id": "Izinkan HTTP Web Server (Port 80/TCP)",
            "en": "Allow HTTP Web Server (Port 80/TCP)"
          },
          "type": "boolean",
          "defaultValue": true
        },
        {
          "key": "allowHttps",
          "label": {
            "id": "Izinkan HTTPS TLS Web Server (Port 443/TCP)",
            "en": "Allow HTTPS TLS Web Server (Port 443/TCP)"
          },
          "type": "boolean",
          "defaultValue": true
        },
        {
          "key": "allowWireguard",
          "label": {
            "id": "Izinkan Tunnel VPN WireGuard (UDP)",
            "en": "Allow WireGuard VPN Tunnel (UDP)"
          },
          "type": "boolean",
          "defaultValue": true
        },
        {
          "key": "wireguardPort",
          "label": {
            "id": "Port UDP WireGuard",
            "en": "WireGuard UDP Port"
          },
          "type": "number",
          "defaultValue": 51820,
          "min": 1,
          "max": 65535
        },
        {
          "key": "allowProxmox",
          "label": {
            "id": "Izinkan Web GUI Proxmox VE (Port 8006/TCP dari Subnet Tepercaya)",
            "en": "Allow Proxmox VE Web GUI (Port 8006/TCP from Trusted Subnet)"
          },
          "type": "boolean",
          "defaultValue": false
        },
        {
          "key": "allowDatabase",
          "label": {
            "id": "Izinkan Database MySQL/PostgreSQL (3306 & 5432 dari Subnet Tepercaya)",
            "en": "Allow MySQL/PostgreSQL (3306 & 5432 from Trusted Subnet)"
          },
          "type": "boolean",
          "defaultValue": false
        },
        {
          "key": "trustedSubnet",
          "label": {
            "id": "Subnet Manajemen Tepercaya (CIDR)",
            "en": "Trusted Management Subnet (CIDR)"
          },
          "type": "text",
          "defaultValue": "10.10.10.0/24"
        },
        {
          "key": "allowIcmpPing",
          "label": {
            "id": "Izinkan Diagnostik ICMP Echo Request (Ping)",
            "en": "Allow ICMP Echo Request Diagnostics (Ping)"
          },
          "type": "boolean",
          "defaultValue": true
        }
      ],
      "formulas": {
        "id": [
          "Prinsip Stateful Firewall: Izinkan ct state { established, related }, buang ct state invalid, dan terapkan kebijakan default DROP pada rantai INPUT.",
          "Rate-Limit SSH: Batasi koneksi SYN baru maksimal 6 percobaan per 30–60 detik per alamat IP sumber.",
          "Isolasi Port Manajemen & Database: Batasi akses port 8006, 3306, dan 5432 hanya dari blok CIDR manajemen tepercaya."
        ],
        "en": [
          "Stateful Filtering Principle: Accept ct state { established, related }, drop ct state invalid, and enforce default DROP on the INPUT chain.",
          "SSH Rate-Limiting: Throttle new TCP SYN handshakes to a maximum of 6 attempts per 30–60 seconds per source IP.",
          "Management & Database Isolation: Restrict ports 8006, 3306, and 5432 exclusively to the trusted management CIDR block."
        ]
      }
    },
    {
      "id": "linux-swap-tuning-calculator",
      "slug": "linux-swap-tuning-calculator",
      "category": "linux",
      "title": {
        "id": "Kalkulator Tuning Swap, Swappiness & Inode Disk Linux",
        "en": "Linux Swap Size, Swappiness & Ext4 Inode Calculator"
      },
      "description": {
        "id": "Hitung ukuran swap optimal Linux, parameter sysctl vm.swappiness, vm.vfs_cache_pressure, estimasi jumlah inode ext4, dan generator skrip /swapfile.",
        "en": "Calculate optimal Linux swap size, vm.swappiness, vm.vfs_cache_pressure sysctl tunables, default ext4 inode count, and /swapfile creation script."
      },
      "canonicalId": "https://kalkunet.com/id/tools/linux-swap-tuning-calculator",
      "canonicalEn": "https://kalkunet.com/en/tools/linux-swap-tuning-calculator",
      "inputs": [
        {
          "key": "ramGb",
          "label": {
            "id": "Kapasitas RAM Fisik Server (GB)",
            "en": "Physical Server RAM Capacity (GB)"
          },
          "type": "number",
          "defaultValue": 16,
          "min": 0.5,
          "max": 2048,
          "step": 0.5,
          "unit": "GB"
        },
        {
          "key": "workloadProfile",
          "label": {
            "id": "Profil Beban Kerja Server (Workload)",
            "en": "Server Workload Profile"
          },
          "type": "select",
          "defaultValue": "web_container",
          "options": [
            {
              "value": "web_container",
              "label": {
                "id": "Web / Container Server (Docker, Kubernetes, Nginx)",
                "en": "Web / Container Server (Docker, Kubernetes, Nginx)"
              }
            },
            {
              "value": "database_hypervisor",
              "label": {
                "id": "Database / Hypervisor (PostgreSQL, MySQL, Proxmox VE)",
                "en": "Database / Hypervisor (PostgreSQL, MySQL, Proxmox VE)"
              }
            },
            {
              "value": "low_ram_vps",
              "label": {
                "id": "Cloud VPS RAM Kecil (1–4 GB RAM)",
                "en": "Low-RAM Cloud VPS (1–4 GB RAM)"
              }
            },
            {
              "value": "desktop_hibernation",
              "label": {
                "id": "Linux Workstation / Desktop dengan Hibernasi",
                "en": "Linux Workstation / Desktop with Hibernation"
              }
            }
          ]
        },
        {
          "key": "diskType",
          "label": {
            "id": "Jenis Media Penyimpanan Disk",
            "en": "Storage Disk Media Type"
          },
          "type": "select",
          "defaultValue": "nvme_ssd",
          "options": [
            {
              "value": "nvme_ssd",
              "label": {
                "id": "NVMe SSD Enterprise / Cloud Block",
                "en": "NVMe SSD Enterprise / Cloud Block"
              }
            },
            {
              "value": "sata_ssd",
              "label": {
                "id": "SATA / SAS SSD",
                "en": "SATA / SAS SSD"
              }
            },
            {
              "value": "hdd",
              "label": {
                "id": "Hard Disk Drive Mekanik (HDD 7200 RPM)",
                "en": "Mechanical Hard Disk Drive (HDD)"
              }
            }
          ]
        },
        {
          "key": "partitionSizeGb",
          "label": {
            "id": "Ukuran Partisi Penyimpanan ext4 (GB)",
            "en": "ext4 Storage Partition Size (GB)"
          },
          "type": "number",
          "defaultValue": 200,
          "min": 1,
          "max": 100000,
          "unit": "GB"
        }
      ],
      "formulas": {
        "id": [
          "Ukuran Swap Standar (8–64 GB RAM tanpa hibernasi) = max(4 GB, round(√RAM_GB))",
          "Ukuran Swap dengan Hibernasi = ceil(RAM_GB + √RAM_GB)",
          "Estimasi Jumlah Inode Default ext4 = floor((Ukuran_Partisi_GB × 1024^3) ÷ 16.384 byte)"
        ],
        "en": [
          "Standard Swap Size (8–64 GB RAM without hibernation) = max(4 GB, round(√RAM_GB))",
          "Swap Size with Hibernation = ceil(RAM_GB + √RAM_GB)",
          "Default ext4 Inode Count = floor((Partition_Size_GB × 1024^3) ÷ 16,384 bytes)"
        ]
      }
    },
    {
      "id": "password-entropy-calculator",
      "slug": "password-entropy-calculator",
      "category": "dev",
      "title": {
        "id": "Kalkulator Entropi Password & Estimasi Waktu Brute-Force",
        "en": "Password Entropy & Brute-Force Crack Time Calculator"
      },
      "description": {
        "id": "Hitung bit entropi kriptografi kata sandi (E = L × log2(R)), ukuran ruang kunci kombinasi, dan tabel waktu bobol brute-force pada Bcrypt/GPU.",
        "en": "Calculate cryptographic password entropy bits (E = L × log2(R)), total keyspace combinations, and brute-force crack times across Bcrypt and GPU rigs."
      },
      "canonicalId": "https://kalkunet.com/id/tools/password-entropy-calculator",
      "canonicalEn": "https://kalkunet.com/en/tools/password-entropy-calculator",
      "inputs": [
        {
          "key": "length",
          "label": {
            "id": "Panjang Karakter Kata Sandi (8 - 128)",
            "en": "Password Character Length (8 - 128)"
          },
          "type": "number",
          "defaultValue": 16,
          "min": 8,
          "max": 128,
          "step": 1
        },
        {
          "key": "includeUppercase",
          "label": {
            "id": "Sertakan Huruf Besar (A-Z)",
            "en": "Include Uppercase Letters (A-Z)"
          },
          "type": "boolean",
          "defaultValue": true
        },
        {
          "key": "includeLowercase",
          "label": {
            "id": "Sertakan Huruf Kecil (a-z)",
            "en": "Include Lowercase Letters (a-z)"
          },
          "type": "boolean",
          "defaultValue": true
        },
        {
          "key": "includeNumbers",
          "label": {
            "id": "Sertakan Angka Numerik (0-9)",
            "en": "Include Numeric Digits (0-9)"
          },
          "type": "boolean",
          "defaultValue": true
        },
        {
          "key": "includeSymbols",
          "label": {
            "id": "Sertakan Simbol Khusus (!@#$%^&*...)",
            "en": "Include Special Symbols (!@#$%^&*...)"
          },
          "type": "boolean",
          "defaultValue": true
        },
        {
          "key": "excludeAmbiguous",
          "label": {
            "id": "Abaikan Karakter Ambigu (0, O, o, 1, l, I, |)",
            "en": "Exclude Ambiguous Characters (0, O, o, 1, l, I, |)"
          },
          "type": "boolean",
          "defaultValue": true
        },
        {
          "key": "seed",
          "label": {
            "id": "Seed Kustom (Opsional — untuk Hasil Replikasi Deterministik)",
            "en": "Custom Seed (Optional — for Deterministic Reproducibility)"
          },
          "type": "text",
          "defaultValue": ""
        }
      ],
      "formulas": {
        "id": [
          "Entropi Kombinatorial: E (bit) = length × log2(pool size) = L × log2(R)",
          "Total Kemungkinan Kombinasi Kunci = R^L",
          "Rata-rata Tebakan Brute Force = (R^L) ÷ 2 = 2^(E - 1)",
          "Estimasi Waktu Bobol (detik) = (Rata-rata Tebakan) ÷ (Kecepatan Tebakan per Detik)"
        ],
        "en": [
          "Combinatorial Entropy: E (bits) = length × log2(pool size) = L × log2(R)",
          "Total Possible Key Combinations = R^L",
          "Average Brute Force Guesses = (R^L) ÷ 2 = 2^(E - 1)",
          "Estimated Crack Time (seconds) = (Average Guesses) ÷ (Guesses per Second Rate)"
        ]
      }
    },
    {
      "id": "jwt-size-calculator",
      "slug": "jwt-size-calculator",
      "category": "dev",
      "title": {
        "id": "Kalkulator Ukuran Token JWT, Base64 Overhead & Masa Aktif (TTL)",
        "en": "JWT Token Size, Base64URL Overhead & TTL Calculator"
      },
      "description": {
        "id": "Hitung ukuran byte token JWT (HS256, RS256, ES256, EdDSA), overhead Base64URL, batas Cookie 4 KB & header Nginx 8 KB, serta bandwidth bulanan.",
        "en": "Calculate JWT token byte size (HS256, RS256, ES256, EdDSA), Base64URL overhead, 4 KB browser cookie and 8 KB Nginx header limits, and monthly bandwidth."
      },
      "canonicalId": "https://kalkunet.com/id/tools/jwt-size-calculator",
      "canonicalEn": "https://kalkunet.com/en/tools/jwt-size-calculator",
      "inputs": [
        {
          "key": "algorithm",
          "label": {
            "id": "Algoritma Tanda Tangan Kriptografi (JWS)",
            "en": "Cryptographic Signing Algorithm (JWS)"
          },
          "type": "select",
          "defaultValue": "RS256",
          "options": [
            {
              "value": "RS256",
              "label": {
                "id": "RS256 (RSA 2048-bit Signature — 256 Byte Mentah)",
                "en": "RS256 (RSA 2048-bit Signature — 256 Raw Bytes)"
              }
            },
            {
              "value": "ES256",
              "label": {
                "id": "ES256 (ECDSA P-256 — 64 Byte Mentah, Ringkas)",
                "en": "ES256 (ECDSA P-256 — 64 Raw Bytes, Compact)"
              }
            },
            {
              "value": "EdDSA",
              "label": {
                "id": "EdDSA (Ed25519 — 64 Byte Mentah, Performa Tinggi)",
                "en": "EdDSA (Ed25519 — 64 Raw Bytes, High Performance)"
              }
            },
            {
              "value": "HS256",
              "label": {
                "id": "HS256 (HMAC-SHA256 Simetris — 32 Byte Mentah)",
                "en": "HS256 (Symmetric HMAC-SHA256 — 32 Raw Bytes)"
              }
            },
            {
              "value": "HS512",
              "label": {
                "id": "HS512 (HMAC-SHA512 Simetris — 64 Byte Mentah)",
                "en": "HS512 (Symmetric HMAC-SHA512 — 64 Raw Bytes)"
              }
            },
            {
              "value": "RS512",
              "label": {
                "id": "RS512 (RSA 4096-bit Signature — 512 Byte Mentah)",
                "en": "RS512 (RSA 4096-bit Signature — 512 Raw Bytes)"
              }
            }
          ]
        },
        {
          "key": "payloadJsonBytes",
          "label": {
            "id": "Ukuran Payload JSON Dasar (Byte)",
            "en": "Base Payload JSON Size (Bytes)"
          },
          "type": "number",
          "defaultValue": 280,
          "min": 20,
          "max": 16384,
          "unit": "Byte"
        },
        {
          "key": "customClaimCount",
          "label": {
            "id": "Jumlah Klaim Tambahan (Roles / Permissions)",
            "en": "Additional Custom Claims Count"
          },
          "type": "number",
          "defaultValue": 4,
          "min": 0,
          "max": 200
        },
        {
          "key": "ttlMinutes",
          "label": {
            "id": "Masa Aktif Token / TTL (Menit)",
            "en": "Token Time-To-Live / TTL (Minutes)"
          },
          "type": "number",
          "defaultValue": 60,
          "min": 1,
          "max": 525600,
          "unit": "Menit"
        },
        {
          "key": "requestsPerDay",
          "label": {
            "id": "Rata-rata Request API per Hari",
            "en": "Average API Requests per Day"
          },
          "type": "number",
          "defaultValue": 100000,
          "min": 100,
          "max": 1000000000
        }
      ],
      "formulas": {
        "id": [
          "Panjang Karakter Base64URL = ceil((Ukuran_Byte_Mentah × 4) ÷ 3)",
          "Total Ukuran Token JWT = Panjang(Header_B64) + 1 + Panjang(Payload_B64) + 1 + Panjang(Signature_B64)",
          "Ukuran Header HTTP Authorization = Total_Token_JWT + 24 byte ('Authorization: Bearer \\r\\n')"
        ],
        "en": [
          "Base64URL Character Length = ceil((Raw_Byte_Length × 4) ÷ 3)",
          "Total JWT Token Size = Len(Header_B64) + 1 + Len(Payload_B64) + 1 + Len(Signature_B64)",
          "HTTP Authorization Header Size = Total_JWT_Bytes + 24 bytes ('Authorization: Bearer \\r\\n')"
        ]
      }
    },
    {
      "id": "vpn-encryption-overhead-calculator",
      "slug": "vpn-encryption-overhead-calculator",
      "category": "dev",
      "title": {
        "id": "Kalkulator Overhead Enkripsi & MTU Tunnel VPN (WireGuard, IPsec, OpenVPN)",
        "en": "VPN Encryption Overhead & Tunnel MTU Calculator (WireGuard, IPsec, OpenVPN)"
      },
      "description": {
        "id": "Hitung overhead enkapsulasi kriptografi, MTU antarmuka tunnel optimal, TCP MSS clamping, dan throughput bersih untuk WireGuard, IPsec ESP, dan OpenVPN.",
        "en": "Calculate cryptographic encapsulation overhead, optimal tunnel MTU, TCP MSS clamping, and effective payload throughput for WireGuard, IPsec, and OpenVPN."
      },
      "canonicalId": "https://kalkunet.com/id/tools/vpn-encryption-overhead-calculator",
      "canonicalEn": "https://kalkunet.com/en/tools/vpn-encryption-overhead-calculator",
      "inputs": [
        {
          "key": "physicalWanMtu",
          "label": {
            "id": "MTU Antarmuka WAN Fisik (Byte)",
            "en": "Physical WAN Interface MTU (Bytes)"
          },
          "type": "number",
          "defaultValue": 1500,
          "min": 576,
          "max": 9000,
          "unit": "Byte"
        },
        {
          "key": "ipVersion",
          "label": {
            "id": "Versi Protokol IP Carrier (Outer IP)",
            "en": "Outer Carrier IP Protocol Version"
          },
          "type": "select",
          "defaultValue": "ipv4",
          "options": [
            {
              "value": "ipv4",
              "label": {
                "id": "IPv4 Carrier (Header IP Luar 20 Byte)",
                "en": "IPv4 Carrier (20-Byte Outer IP Header)"
              }
            },
            {
              "value": "ipv6",
              "label": {
                "id": "IPv6 Carrier (Header IP Luar 40 Byte)",
                "en": "IPv6 Carrier (40-Byte Outer IP Header)"
              }
            }
          ]
        },
        {
          "key": "vpnProtocol",
          "label": {
            "id": "Protokol Tunnel & Cipher VPN",
            "en": "VPN Tunnel Protocol & Cipher Suite"
          },
          "type": "select",
          "defaultValue": "wireguard",
          "options": [
            {
              "value": "wireguard",
              "label": {
                "id": "WireGuard (ChaCha20-Poly1305 over UDP)",
                "en": "WireGuard (ChaCha20-Poly1305 over UDP)"
              }
            },
            {
              "value": "ipsec_esp_natt",
              "label": {
                "id": "IPsec IKEv2 ESP AES-GCM + UDP NAT-T (Port 4500)",
                "en": "IPsec IKEv2 ESP AES-GCM + UDP NAT-T (Port 4500)"
              }
            },
            {
              "value": "ipsec_esp_native",
              "label": {
                "id": "IPsec ESP AES-GCM Native (IP Protocol 50)",
                "en": "IPsec ESP AES-GCM Native (IP Protocol 50)"
              }
            },
            {
              "value": "openvpn_udp",
              "label": {
                "id": "OpenVPN 2.6 Data Channel AEAD (Mode UDP)",
                "en": "OpenVPN 2.6 Data Channel AEAD (UDP Mode)"
              }
            },
            {
              "value": "openvpn_tcp",
              "label": {
                "id": "OpenVPN Data Channel (Mode TCP)",
                "en": "OpenVPN Data Channel (TCP Mode)"
              }
            },
            {
              "value": "gre_ipsec",
              "label": {
                "id": "GRE Tunnel over IPsec ESP NAT-T",
                "en": "GRE Tunnel over IPsec ESP NAT-T"
              }
            }
          ]
        },
        {
          "key": "linkSpeedMbps",
          "label": {
            "id": "Kecepatan Bandwidth Link WAN (Mbps)",
            "en": "WAN Link Bandwidth Speed (Mbps)"
          },
          "type": "number",
          "defaultValue": 100,
          "min": 1,
          "max": 100000,
          "unit": "Mbps"
        }
      ],
      "formulas": {
        "id": [
          "Total Overhead Tunnel = Header_IP_Luar (20B/40B) + Header_Enkapsulasi_VPN_&_Tag_AEAD",
          "MTU Tunnel Optimal = MTU_WAN_Fisik − Total_Overhead_Tunnel",
          "TCP MSS Clamping Optimal = MTU_Tunnel_Optimal − 40 byte (Header IPv4 Dalam 20B + TCP 20B)",
          "Efisiensi Payload (%) = (TCP_MSS_Optimal ÷ MTU_WAN_Fisik) × 100%"
        ],
        "en": [
          "Total Tunnel Overhead = Outer_IP_Header (20B/40B) + VPN_Encapsulation_&_AEAD_Tag_Bytes",
          "Optimal Tunnel MTU = Physical_WAN_MTU − Total_Tunnel_Overhead",
          "Optimal TCP MSS Clamping = Optimal_Tunnel_MTU − 40 bytes (20B Inner IPv4 + 20B Inner TCP)",
          "Payload Efficiency (%) = (Optimal_TCP_MSS ÷ Physical_WAN_MTU) × 100%"
        ]
      }
    },
    {
      "id": "security-log-storage-calculator",
      "slug": "security-log-storage-calculator",
      "category": "dev",
      "title": {
        "id": "Kalkulator Kapasitas Log SIEM, Syslog & Retensi Audit Keamanan",
        "en": "SIEM Security Log Storage, EPS & Audit Retention Calculator"
      },
      "description": {
        "id": "Hitung total Events Per Second (EPS), volume log harian (GB/hari), kapasitas Hot Storage NVMe & Cold Archive terkompresi untuk Wazuh, ELK, dan Graylog.",
        "en": "Calculate aggregate Events Per Second (EPS), daily raw log volume, indexed Hot Storage, and compressed Cold Archive capacity for Wazuh & Elastic SIEM."
      },
      "canonicalId": "https://kalkunet.com/id/tools/security-log-storage-calculator",
      "canonicalEn": "https://kalkunet.com/en/tools/security-log-storage-calculator",
      "inputs": [
        {
          "key": "networkDevicesCount",
          "label": {
            "id": "Jumlah Perangkat Jaringan & Firewall (MikroTik/FortiGate)",
            "en": "Network Appliances & Firewalls Count"
          },
          "type": "number",
          "defaultValue": 10,
          "min": 0,
          "max": 10000
        },
        {
          "key": "serversCount",
          "label": {
            "id": "Jumlah Server Produksi (Linux / Windows Endpoint)",
            "en": "Production Servers & Endpoints Count"
          },
          "type": "number",
          "defaultValue": 25,
          "min": 0,
          "max": 50000
        },
        {
          "key": "avgEpsPerDevice",
          "label": {
            "id": "Rata-rata Events Per Second (EPS) per Perangkat",
            "en": "Average Events Per Second (EPS) per Device"
          },
          "type": "number",
          "defaultValue": 15,
          "min": 0.5,
          "max": 5000,
          "step": 0.5,
          "unit": "EPS"
        },
        {
          "key": "avgBytesPerEvent",
          "label": {
            "id": "Ukuran Rata-rata per Baris Event Log (Byte)",
            "en": "Average Size per Log Event (Bytes)"
          },
          "type": "number",
          "defaultValue": 350,
          "min": 100,
          "max": 8192,
          "unit": "Byte"
        },
        {
          "key": "hotRetentionDays",
          "label": {
            "id": "Durasi Retensi Hot Storage Terindeks (Hari)",
            "en": "Indexed Hot Storage Retention (Days)"
          },
          "type": "number",
          "defaultValue": 30,
          "min": 1,
          "max": 730,
          "unit": "Hari"
        },
        {
          "key": "coldRetentionDays",
          "label": {
            "id": "Durasi Retensi Cold Archive Terkompresi (Hari)",
            "en": "Compressed Cold Archive Retention (Days)"
          },
          "type": "number",
          "defaultValue": 335,
          "min": 0,
          "max": 3650,
          "unit": "Hari"
        },
        {
          "key": "compressionRatio",
          "label": {
            "id": "Rasio Kompresi Arsip Cold Storage (misal 5 untuk 5:1)",
            "en": "Cold Archive Compression Ratio (e.g. 5 for 5:1)"
          },
          "type": "number",
          "defaultValue": 5,
          "min": 1,
          "max": 15
        }
      ],
      "formulas": {
        "id": [
          "Total EPS = (Jumlah_Perangkat_Jaringan + Jumlah_Server) × Rata_Rata_EPS",
          "Volume Log Mentah Harian (GB/hari) = (Total_EPS × 86.400 detik × Byte_per_Event) ÷ 10^9",
          "Kapasitas Hot Storage (TB) = (Volume_Harian_GB × 1,1 Overhead_Indeks × Hari_Hot) ÷ 1.000",
          "Kapasitas Cold Archive (TB) = ((Volume_Harian_GB ÷ Rasio_Kompresi) × Hari_Cold) ÷ 1.000"
        ],
        "en": [
          "Total EPS = (Network_Devices + Servers) × Average_EPS_per_Node",
          "Daily Raw Log Volume (GB/day) = (Total_EPS × 86,400 seconds × Bytes_per_Event) ÷ 10^9",
          "Hot Storage Capacity (TB) = (Daily_Raw_GB × 1.1 Index_Overhead × Hot_Days) ÷ 1,000",
          "Cold Archive Capacity (TB) = ((Daily_Raw_GB ÷ Compression_Ratio) × Cold_Days) ÷ 1,000"
        ]
      }
    },
    {
      "id": "storage-unit-converter",
      "slug": "storage-unit-converter",
      "category": "general",
      "title": {
        "id": "Konverter Satuan Penyimpanan Data (TB vs TiB, GB vs GiB, Bit vs Byte)",
        "en": "Data Storage Unit Converter (TB vs TiB, GB vs GiB, Decimal vs Binary)"
      },
      "description": {
        "id": "Konversi presisi satuan penyimpanan desimal produsen SI (KB, MB, GB, TB, PB) dan biner sistem operasi IEC 80000-13 (KiB, MiB, GiB, TiB, PiB).",
        "en": "Convert accurately between manufacturer decimal SI units (KB, MB, GB, TB, PB) and operating system binary IEC 80000-13 units (KiB, MiB, GiB, TiB, PiB)."
      },
      "canonicalId": "https://kalkunet.com/id/tools/storage-unit-converter",
      "canonicalEn": "https://kalkunet.com/en/tools/storage-unit-converter",
      "inputs": [
        {
          "key": "value",
          "label": {
            "id": "Besaran Nilai Kapasitas Penyimpanan",
            "en": "Storage Capacity Magnitude"
          },
          "type": "number",
          "defaultValue": 4,
          "min": 0,
          "step": 0.1
        },
        {
          "key": "inputUnit",
          "label": {
            "id": "Satuan Kapasitas Awal",
            "en": "Initial Capacity Unit"
          },
          "type": "select",
          "defaultValue": "TB",
          "options": [
            {
              "value": "TB",
              "label": {
                "id": "TB (Terabyte — 10^12 Desimal SI)",
                "en": "TB (Terabyte — 10^12 Decimal SI)"
              }
            },
            {
              "value": "TiB",
              "label": {
                "id": "TiB (Tebibyte — 2^40 Biner IEC / Windows)",
                "en": "TiB (Tebibyte — 2^40 Binary IEC / Windows)"
              }
            },
            {
              "value": "GB",
              "label": {
                "id": "GB (Gigabyte — 10^9 Desimal SI)",
                "en": "GB (Gigabyte — 10^9 Decimal SI)"
              }
            },
            {
              "value": "GiB",
              "label": {
                "id": "GiB (Gibibyte — 2^30 Biner IEC / Windows)",
                "en": "GiB (Gibibyte — 2^30 Binary IEC / Windows)"
              }
            },
            {
              "value": "MB",
              "label": {
                "id": "MB (Megabyte — 10^6 Desimal SI)",
                "en": "MB (Megabyte — 10^6 Decimal SI)"
              }
            },
            {
              "value": "MiB",
              "label": {
                "id": "MiB (Mebibyte — 2^20 Biner IEC)",
                "en": "MiB (Mebibyte — 2^20 Binary IEC)"
              }
            },
            {
              "value": "KB",
              "label": {
                "id": "KB (Kilobyte — 10^3 Desimal SI)",
                "en": "KB (Kilobyte — 10^3 Decimal SI)"
              }
            },
            {
              "value": "KiB",
              "label": {
                "id": "KiB (Kibibyte — 2^10 Biner IEC)",
                "en": "KiB (Kibibyte — 2^10 Binary IEC)"
              }
            },
            {
              "value": "PB",
              "label": {
                "id": "PB (Petabyte — 10^15 Desimal SI)",
                "en": "PB (Petabyte — 10^15 Decimal SI)"
              }
            },
            {
              "value": "PiB",
              "label": {
                "id": "PiB (Pebibyte — 2^50 Biner IEC)",
                "en": "PiB (Pebibyte — 2^50 Binary IEC)"
              }
            },
            {
              "value": "B",
              "label": {
                "id": "B (Byte murni)",
                "en": "B (Raw Bytes)"
              }
            }
          ]
        }
      ],
      "formulas": {
        "id": [
          "Standar Desimal SI (Basis 10^3): 1 KB = 10^3 B, 1 MB = 10^6 B, 1 GB = 10^9 B, 1 TB = 10^12 B (1.000.000.000.000 Byte)",
          "Standar Biner IEC (Basis 2^10): 1 KiB = 2^10 B (1.024), 1 MiB = 2^20 B (1.048.576), 1 GiB = 2^30 B, 1 TiB = 2^40 B (1.099.511.627.776 Byte)",
          "Formula Deviasi Hard Drive: TiB = (Kapasitas Desimal Byte) / (1024^4). Contoh: 4.000.000.000.000 / 1.099.511.627.776 = 3,63798 TiB (~9,05% selisih)"
        ],
        "en": [
          "SI Decimal Standards (Powers of 10^3): 1 KB = 10^3 B, 1 MB = 10^6 B, 1 GB = 10^9 B, 1 TB = 10^12 B (1,000,000,000,000 Bytes)",
          "IEC Binary Standards (Powers of 2^10): 1 KiB = 2^10 B (1,024), 1 MiB = 2^20 B (1,048,576), 1 GiB = 2^30 B, 1 TiB = 2^40 B (1,099,511,627,776 Bytes)",
          "Hard Drive Discrepancy Formula: TiB = (Raw Decimal Bytes) / (1024^4). Example: 4,000,000,000,000 / 1,099,511,627,776 = 3.63798 TiB (~9.05% difference)"
        ]
      }
    },
    {
      "id": "data-transfer-time-calculator",
      "slug": "data-transfer-time-calculator",
      "category": "general",
      "title": {
        "id": "Kalkulator Waktu Transfer Data, Backup & Sinkronisasi Jaringan",
        "en": "Network Data Transfer, Backup Window & Sync Time Calculator"
      },
      "description": {
        "id": "Hitung estimasi durasi transfer file, replikasi backup, dan throughput efektif (Mbps, MB/s, MiB/s) dengan memperhitungkan overhead protokol TCP/IP.",
        "en": "Calculate file transfer duration, offsite backup windows, and effective throughput (Mbps, MB/s, MiB/s) accounting for TCP/IP protocol overhead."
      },
      "canonicalId": "https://kalkunet.com/id/tools/data-transfer-time-calculator",
      "canonicalEn": "https://kalkunet.com/en/tools/data-transfer-time-calculator",
      "inputs": [
        {
          "key": "fileSize",
          "label": {
            "id": "Ukuran Berkas / Volume Data",
            "en": "File Size / Data Volume"
          },
          "type": "number",
          "defaultValue": 50,
          "min": 0.1,
          "step": 1
        },
        {
          "key": "fileSizeUnit",
          "label": {
            "id": "Satuan Ukuran Berkas",
            "en": "File Size Unit"
          },
          "type": "select",
          "defaultValue": "GB",
          "options": [
            {
              "value": "GB",
              "label": {
                "id": "GB (Gigabyte desimal — 10^9 Byte)",
                "en": "GB (Gigabyte decimal — 10^9 Bytes)"
              }
            },
            {
              "value": "TB",
              "label": {
                "id": "TB (Terabyte desimal — 10^12 Byte)",
                "en": "TB (Terabyte decimal — 10^12 Bytes)"
              }
            },
            {
              "value": "MB",
              "label": {
                "id": "MB (Megabyte desimal — 10^6 Byte)",
                "en": "MB (Megabyte decimal — 10^6 Bytes)"
              }
            },
            {
              "value": "PB",
              "label": {
                "id": "PB (Petabyte desimal — 10^15 Byte)",
                "en": "PB (Petabyte decimal — 10^15 Bytes)"
              }
            },
            {
              "value": "GiB",
              "label": {
                "id": "GiB (Gibibyte biner — 2^30 Byte)",
                "en": "GiB (Gibibyte binary — 2^30 Bytes)"
              }
            },
            {
              "value": "TiB",
              "label": {
                "id": "TiB (Tebibyte biner — 2^40 Byte)",
                "en": "TiB (Tebibyte binary — 2^40 Bytes)"
              }
            },
            {
              "value": "MiB",
              "label": {
                "id": "MiB (Mebibyte biner — 2^20 Byte)",
                "en": "MiB (Mebibyte binary — 2^20 Bytes)"
              }
            }
          ]
        },
        {
          "key": "linkSpeed",
          "label": {
            "id": "Kecepatan Tautan Bandwidth",
            "en": "Network Link Bandwidth"
          },
          "type": "number",
          "defaultValue": 1000,
          "min": 0.1,
          "step": 1
        },
        {
          "key": "linkSpeedUnit",
          "label": {
            "id": "Satuan Kecepatan Bandwidth",
            "en": "Bandwidth Speed Unit"
          },
          "type": "select",
          "defaultValue": "Mbps",
          "options": [
            {
              "value": "Mbps",
              "label": {
                "id": "Mbps (Megabit per detik — Standar LAN/Internet)",
                "en": "Mbps (Megabits per sec — Standard LAN/WAN)"
              }
            },
            {
              "value": "Gbps",
              "label": {
                "id": "Gbps (Gigabit per detik — 1000 Mbps)",
                "en": "Gbps (Gigabits per sec — 1000 Mbps)"
              }
            },
            {
              "value": "Kbps",
              "label": {
                "id": "Kbps (Kilobit per detik — 0.001 Mbps)",
                "en": "Kbps (Kilobits per sec — 0.001 Mbps)"
              }
            }
          ]
        },
        {
          "key": "overheadPct",
          "label": {
            "id": "Overhead Protokol & Retransmisi (%)",
            "en": "Protocol & Retransmission Overhead (%)"
          },
          "type": "number",
          "defaultValue": 10,
          "min": 0,
          "max": 90,
          "step": 1
        }
      ],
      "formulas": {
        "id": [
          "Throughput Efektif = Link Speed × (1 - Overhead%)",
          "Kecepatan Transfer (Byte/detik) = (Throughput Efektif Mbps × 1.000.000) / 8 (8 bit = 1 Byte)",
          "Estimasi Durasi Transfer (detik) = Total Ukuran Berkas (Byte) / Kecepatan Transfer (Byte/detik)"
        ],
        "en": [
          "Effective Throughput = Link Speed × (1 - Overhead%)",
          "Transfer Rate (Bytes/sec) = (Effective Throughput Mbps × 1,000,000) / 8 (8 bits = 1 Byte)",
          "Estimated Duration (seconds) = Total File Size (Bytes) / Transfer Rate (Bytes/sec)"
        ]
      }
    },
    {
      "id": "sla-uptime-calculator",
      "slug": "sla-uptime-calculator",
      "category": "general",
      "title": {
        "id": "Kalkulator SLA Uptime, Downtime Tahunan & Error Budget",
        "en": "SLA Uptime, Allowed Downtime & SRE Error Budget Calculator"
      },
      "description": {
        "id": "Hitung batas maksimal toleransi downtime harian, bulanan, dan tahunan dari target SLA (99.9%–99.999%) atau evaluasi pencapaian SLA dari durasi insiden.",
        "en": "Calculate maximum allowed daily, monthly, and yearly downtime from SLA targets (99.9%–99.999%) or audit achieved SLA from observed incident duration."
      },
      "canonicalId": "https://kalkunet.com/id/tools/sla-uptime-calculator",
      "canonicalEn": "https://kalkunet.com/en/tools/sla-uptime-calculator",
      "inputs": [
        {
          "key": "mode",
          "label": {
            "id": "Arah / Mode Perhitungan",
            "en": "Calculation Direction / Mode"
          },
          "type": "select",
          "defaultValue": "forward",
          "options": [
            {
              "value": "forward",
              "label": {
                "id": "Forward Mode: Target Persentase SLA (%) → Batas Waktu Padam (Downtime)",
                "en": "Forward Mode: Target Availability SLA (%) → Allowable Downtime"
              }
            },
            {
              "value": "reverse",
              "label": {
                "id": "Reverse Mode: Riwayat Insiden Riil → Persentase SLA yang Dicapai",
                "en": "Reverse Mode: Actual Incident Downtime → Achieved Availability Tier"
              }
            }
          ]
        },
        {
          "key": "availabilityPct",
          "label": {
            "id": "Target Ketersediaan SLA (%) (Forward Mode)",
            "en": "Target Availability SLA (%) (Forward Mode)"
          },
          "type": "number",
          "defaultValue": 99.9,
          "min": 0.0001,
          "max": 100,
          "step": 0.001,
          "unit": "%"
        },
        {
          "key": "downtimeValue",
          "label": {
            "id": "Total Durasi Waktu Padam / Padam Riil (Reverse Mode)",
            "en": "Total Logged Outage / Downtime Duration (Reverse Mode)"
          },
          "type": "number",
          "defaultValue": 45,
          "min": 0,
          "step": 1
        },
        {
          "key": "downtimeUnit",
          "label": {
            "id": "Satuan Waktu Downtime (Reverse Mode)",
            "en": "Downtime Time Unit (Reverse Mode)"
          },
          "type": "select",
          "defaultValue": "minutes",
          "options": [
            {
              "value": "seconds",
              "label": {
                "id": "Detik (Seconds)",
                "en": "Seconds"
              }
            },
            {
              "value": "minutes",
              "label": {
                "id": "Menit (Minutes)",
                "en": "Minutes"
              }
            },
            {
              "value": "hours",
              "label": {
                "id": "Jam (Hours)",
                "en": "Hours"
              }
            },
            {
              "value": "days",
              "label": {
                "id": "Hari (Days)",
                "en": "Days"
              }
            }
          ]
        },
        {
          "key": "downtimePeriod",
          "label": {
            "id": "Periode Evaluasi / Pelaporan SLA (Reverse Mode)",
            "en": "SLA Evaluation / Reporting Period (Reverse Mode)"
          },
          "type": "select",
          "defaultValue": "month",
          "options": [
            {
              "value": "day",
              "label": {
                "id": "1 Hari (24 Jam)",
                "en": "1 Day (24 Hours)"
              }
            },
            {
              "value": "week",
              "label": {
                "id": "1 Minggu (7 Hari)",
                "en": "1 Week (7 Days)"
              }
            },
            {
              "value": "month",
              "label": {
                "id": "1 Bulan Kalender (Rata-rata 30,4375 Hari)",
                "en": "1 Calendar Month (Avg 30.4375 Days)"
              }
            },
            {
              "value": "quarter",
              "label": {
                "id": "1 Kuartal / Q (91,3125 Hari)",
                "en": "1 Quarter / Q (91.3125 Days)"
              }
            },
            {
              "value": "year",
              "label": {
                "id": "1 Tahun Kalender Julian (365,25 Hari)",
                "en": "1 Julian Calendar Year (365.25 Days)"
              }
            }
          ]
        }
      ],
      "formulas": {
        "id": [
          "Persentase Ketersediaan Uptime (%) = ((Total Waktu Periode - Total Waktu Padam) / Total Waktu Periode) × 100%",
          "Toleransi Downtime Maksimal = Total Detik Periode × (1 - (Persentase Uptime / 100))",
          "Standar Waktu Kalender: 1 Hari = 86.400 detik, 1 Minggu = 604.800 detik, 1 Tahun Julian = 31.557.600 detik (365,25 hari)",
          "1 Bulan Kalender Rata-rata = 31.557.600 / 12 = 2.629.800 detik (~30,4375 hari)"
        ],
        "en": [
          "Availability Uptime Percentage (%) = ((Total Period Duration - Total Downtime) / Total Period Duration) × 100%",
          "Maximum Allowable Downtime = Total Period Seconds × (1 - (Uptime Percentage / 100))",
          "Calendar Standards: 1 Day = 86,400 seconds, 1 Week = 604,800 seconds, 1 Julian Year = 31,557,600 seconds (365.25 days)",
          "1 Average Calendar Month = 31,557,600 / 12 = 2,629,800 seconds (~30.4375 days)"
        ]
      }
    },
    {
      "id": "it-power-cost-calculator",
      "slug": "it-power-cost-calculator",
      "category": "general",
      "title": {
        "id": "Kalkulator Konsumsi Daya Perangkat IT (Watt, kWh) & Tagihan Listrik Bulanan",
        "en": "IT Equipment Power Consumption (Watt, kWh), PUE & Electricity Cost Calculator"
      },
      "description": {
        "id": "Hitung konsumsi energi listrik kWh harian/bulanan/tahunan, faktor PUE ruang server, estimasi tagihan listrik PLN, arus MCB 220V, dan panas BTU/hr.",
        "en": "Calculate daily, monthly, and annual kWh energy usage, data center PUE overhead, monthly electricity bills, 220V MCB amperage, and BTU/hr heat load."
      },
      "canonicalId": "https://kalkunet.com/id/tools/it-power-cost-calculator",
      "canonicalEn": "https://kalkunet.com/en/tools/it-power-cost-calculator",
      "inputs": [
        {
          "key": "itLoadWatts",
          "label": {
            "id": "Total Beban Daya Perangkat IT (Watt)",
            "en": "Total IT Equipment Power Load (Watts)"
          },
          "type": "number",
          "defaultValue": 850,
          "min": 5,
          "max": 500000,
          "unit": "Watt"
        },
        {
          "key": "pueFactor",
          "label": {
            "id": "Faktor Efisiensi Fasilitas PUE (1.0 = Perangkat Saja)",
            "en": "Facility PUE Factor (1.0 = Hardware Only)"
          },
          "type": "number",
          "defaultValue": 1.4,
          "min": 1,
          "max": 3,
          "step": 0.05
        },
        {
          "key": "dailyOperatingHours",
          "label": {
            "id": "Jam Operasional Menyala per Hari (Jam)",
            "en": "Daily Operating Hours (1–24h)"
          },
          "type": "number",
          "defaultValue": 24,
          "min": 1,
          "max": 24,
          "unit": "Jam"
        },
        {
          "key": "tariffIdrPerKwh",
          "label": {
            "id": "Tarif Listrik per kWh (Rp/kWh — PLN Non-Subsidi)",
            "en": "Electricity Tariff per kWh (IDR/kWh)"
          },
          "type": "number",
          "defaultValue": 1444.7,
          "min": 100,
          "max": 10000,
          "step": 0.1,
          "unit": "Rp/kWh"
        }
      ],
      "formulas": {
        "id": [
          "Total Daya Fasilitas (Watt) = Beban_Perangkat_IT_Watt × Faktor_PUE",
          "Konsumsi Energi Harian (kWh) = (Total_Daya_Fasilitas × Jam_Operasional_Harian) ÷ 1.000",
          "Tagihan Listrik Bulanan (Rp) = Konsumsi_Harian_kWh × 30 hari × Tarif_per_kWh",
          "Disipasi Panas Termal (BTU/jam) = Beban_Perangkat_IT_Watt × 3,41214"
        ],
        "en": [
          "Total Facility Power (Watts) = IT_Equipment_Watts × PUE_Factor",
          "Daily Energy Consumption (kWh) = (Total_Facility_Watts × Daily_Hours) ÷ 1,000",
          "Monthly Electricity Cost (IDR) = Daily_kWh × 30 days × Tariff_per_kWh",
          "Thermal Heat Dissipation (BTU/hr) = IT_Equipment_Watts × 3.41214"
        ]
      }
    },
    {
      "id": "floorplan-wifi-cctv-planner",
      "slug": "floorplan-wifi-cctv-planner",
      "category": "cctv",
      "title": {
        "id": "Perencana Denah Wi-Fi & Sudut Pandang CCTV (Heatmap 2D)",
        "en": "Interactive Floorplan Wi-Fi Heatmap & CCTV FoV Planner"
      },
      "description": {
        "id": "Simulasi interaktif denah ruangan 2D untuk estimasi cakupan sinyal Wi-Fi AP 2.4/5 GHz dan sudut pandang kerucut lensa CCTV DORI secara visual.",
        "en": "Interactive 2D floorplan planner for estimating Wi-Fi AP 2.4/5GHz signal coverage radii and CCTV camera FoV DORI coverage cones visually."
      },
      "canonicalId": "https://kalkunet.com/id/tools/floorplan-wifi-cctv-planner",
      "canonicalEn": "https://kalkunet.com/en/tools/floorplan-wifi-cctv-planner",
      "inputs": [
        {
          "key": "buildingWidthM",
          "label": {
            "id": "Lebar Bangunan (Meter)",
            "en": "Building Width (Meters)"
          },
          "type": "number",
          "defaultValue": 20,
          "min": 5,
          "max": 200,
          "unit": "m"
        },
        {
          "key": "buildingLengthM",
          "label": {
            "id": "Panjang Bangunan (Meter)",
            "en": "Building Length (Meters)"
          },
          "type": "number",
          "defaultValue": 30,
          "min": 5,
          "max": 200,
          "unit": "m"
        },
        {
          "key": "wallType",
          "label": {
            "id": "Material Dinding Pembatas Ruangan",
            "en": "Interior Wall Barrier Material"
          },
          "type": "select",
          "defaultValue": "brick",
          "options": [
            {
              "value": "open",
              "label": {
                "id": "Open Space / Tanpa Sekat (2 dB)",
                "en": "Open Space / No Barriers (2 dB)"
              }
            },
            {
              "value": "gypsum",
              "label": {
                "id": "Partisi Gypsum / Drywall (4 dB)",
                "en": "Gypsum Drywall Partitions (4 dB)"
              }
            },
            {
              "value": "brick",
              "label": {
                "id": "Dinding Bata Merah Standar (10 dB)",
                "en": "Standard Brick Masonry (10 dB)"
              }
            },
            {
              "value": "concrete",
              "label": {
                "id": "Dinding Beton Bertulang (15 dB)",
                "en": "Reinforced Concrete Walls (15 dB)"
              }
            }
          ]
        },
        {
          "key": "apCount",
          "label": {
            "id": "Jumlah Access Point Terpasang",
            "en": "Installed Access Points Count"
          },
          "type": "number",
          "defaultValue": 3,
          "min": 1,
          "max": 20,
          "unit": "AP"
        },
        {
          "key": "apTxPowerDbm",
          "label": {
            "id": "Daya Pancar AP (Tx Power)",
            "en": "AP Transmit Power (Tx Power)"
          },
          "type": "number",
          "defaultValue": 20,
          "min": 10,
          "max": 30,
          "unit": "dBm"
        },
        {
          "key": "cctvCount",
          "label": {
            "id": "Jumlah Kamera CCTV Terpasang",
            "en": "Installed CCTV Cameras Count"
          },
          "type": "number",
          "defaultValue": 4,
          "min": 1,
          "max": 32,
          "unit": "Unit"
        },
        {
          "key": "lensFocalMm",
          "label": {
            "id": "Panjang Fokal Lensa Kamera CCTV",
            "en": "CCTV Camera Lens Focal Length"
          },
          "type": "select",
          "defaultValue": "2.8",
          "options": [
            {
              "value": "2.8",
              "label": {
                "id": "2.8 mm (Sudut Lebar 103° - Pantau Ruangan)",
                "en": "2.8 mm (Wide Angle 103° - Room Overview)"
              }
            },
            {
              "value": "4",
              "label": {
                "id": "4.0 mm (Sudut Standar 84° - Koridor / Lobi)",
                "en": "4.0 mm (Standard 84° - Corridor / Lobby)"
              }
            },
            {
              "value": "6",
              "label": {
                "id": "6.0 mm (Sudut Sempit 52° - Pintu Masuk / Gerbang)",
                "en": "6.0 mm (Narrow 52° - Entry / Gate)"
              }
            },
            {
              "value": "8",
              "label": {
                "id": "8.0 mm (Telefoto 38° - Pengenalan Jarak Jauh)",
                "en": "8.0 mm (Telephoto 38° - Distant ID)"
              }
            }
          ]
        }
      ],
      "formulas": {
        "id": [
          "Luas Total Area = Lebar (m) × Panjang (m)",
          "Radius Sel 5 GHz Efektif = max(5, round(18 - Redaman Dinding × 0.65)) meter pada -67 dBm",
          "Estimasi Cakupan Sinyal (%) = min(100, round((Jumlah AP ÷ Rekomendasi AP) × 100))",
          "Sudut FoV Horizontal CCTV: 2.8mm (103°), 4mm (84°), 6mm (52°), 8mm (38°)"
        ],
        "en": [
          "Total Floor Area = Width (m) × Length (m)",
          "Effective 5 GHz Cell Radius = max(5, round(18 - Wall Attenuation × 0.65)) meters at -67 dBm",
          "Estimated Wi-Fi Coverage (%) = min(100, round((Installed APs ÷ Recommended APs) × 100))",
          "CCTV Horizontal FoV: 2.8mm (103°), 4mm (84°), 6mm (52°), 8mm (38°)"
        ]
      }
    },
    {
      "id": "mikrotik-config-security-auditor",
      "slug": "mikrotik-config-security-auditor",
      "category": "network",
      "title": {
        "id": "Auditor Keamanan Konfigurasi MikroTik (.rsc)",
        "en": "MikroTik RouterOS .rsc Config Security Auditor"
      },
      "description": {
        "id": "Audit keamanan otomatis file export .rsc MikroTik RouterOS v7 untuk mendeteksi celah keamanan, port default, dan menghasilkan skrip perbaikan.",
        "en": "Automated security audit for MikroTik RouterOS v7 .rsc export files, detecting misconfigurations, exposed services, and generating fix scripts."
      },
      "canonicalId": "https://kalkunet.com/id/tools/mikrotik-config-security-auditor",
      "canonicalEn": "https://kalkunet.com/en/tools/mikrotik-config-security-auditor",
      "inputs": [
        {
          "key": "wanInterface",
          "label": {
            "id": "Nama Interface WAN Internet",
            "en": "WAN Internet Interface Name"
          },
          "type": "text",
          "defaultValue": "ether1-wan"
        },
        {
          "key": "lanSubnet",
          "label": {
            "id": "Subnet LAN Manajemen Terpercaya",
            "en": "Trusted Management LAN Subnet"
          },
          "type": "text",
          "defaultValue": "192.168.88.0/24"
        },
        {
          "key": "winboxPort",
          "label": {
            "id": "Port Layanan Winbox Saat Ini",
            "en": "Current Winbox Service Port"
          },
          "type": "number",
          "defaultValue": 8291,
          "min": 1,
          "max": 65535
        },
        {
          "key": "sshPort",
          "label": {
            "id": "Port Layanan SSH Saat Ini",
            "en": "Current SSH Service Port"
          },
          "type": "number",
          "defaultValue": 22,
          "min": 1,
          "max": 65535
        },
        {
          "key": "dnsAllowRemote",
          "label": {
            "id": "DNS 'Allow Remote Requests' Aktif",
            "en": "DNS 'Allow Remote Requests' Enabled"
          },
          "type": "checkbox",
          "defaultValue": true
        },
        {
          "key": "hasInputDropRule",
          "label": {
            "id": "Firewall Memblokir Port DNS 53 dari WAN",
            "en": "Firewall Filters Drop WAN Port 53"
          },
          "type": "checkbox",
          "defaultValue": false
        },
        {
          "key": "telnetFtpApiDisabled",
          "label": {
            "id": "Layanan Telnet, FTP, WWW & API Telah Dinonaktifkan",
            "en": "Telnet, FTP, WWW & API Services Disabled"
          },
          "type": "checkbox",
          "defaultValue": false
        },
        {
          "key": "btestServerDisabled",
          "label": {
            "id": "Bandwidth Test Server (BTest) Telah Dinonaktifkan",
            "en": "Bandwidth Test Server (BTest) Disabled"
          },
          "type": "checkbox",
          "defaultValue": false
        },
        {
          "key": "neighborDiscoveryRestricted",
          "label": {
            "id": "Neighbor Discovery (MNDP/CDP) Dibatasi ke LAN Saja",
            "en": "Neighbor Discovery Restricted to LAN Only"
          },
          "type": "checkbox",
          "defaultValue": false
        },
        {
          "key": "defaultAdminRenamed",
          "label": {
            "id": "Akun Default 'admin' Telah Diganti & Dinonaktifkan",
            "en": "Default 'admin' User Renamed & Disabled"
          },
          "type": "checkbox",
          "defaultValue": false
        }
      ],
      "formulas": {
        "id": [
          "Skor Dasar Keamanan = 100 poin",
          "Penalti Open DNS WAN = -30 poin (Rentan DDoS Amplification)",
          "Penalti Layanan Plaintext Telnet/FTP/HTTP = -20 poin",
          "Penalti Port Winbox 8291 / SSH 22 Default = -15 poin",
          "Penalti Akun Default 'admin' Aktif = -15 poin",
          "Penalti BTest Server & Discovery Tanpa Filter = -20 poin"
        ],
        "en": [
          "Baseline Security Score = 100 points",
          "Open Recursive WAN DNS Penalty = -30 points (DDoS Amplification Vector)",
          "Unencrypted Legacy Daemons (Telnet/FTP/HTTP) Penalty = -20 points",
          "Default Winbox (8291) / SSH (22) Ports Penalty = -15 points",
          "Default 'admin' Username Active Penalty = -15 points",
          "Bandwidth Server & Discovery Unrestricted Penalty = -20 points"
        ]
      }
    },
    {
      "id": "fiber-color-code-rj45-simulator",
      "slug": "fiber-color-code-rj45-simulator",
      "category": "network",
      "title": {
        "id": "Simulator Kode Warna Fiber Optik TIA-598C & Pinout RJ45",
        "en": "TIA-598C Fiber Color Code & RJ45 Pinout Simulator"
      },
      "description": {
        "id": "Visualisasi kode warna core fiber optik TIA-598C 1-288 core, nomor tube, dan diagram pinout kabel LAN RJ45 T568A/T568B beserta PoE standar.",
        "en": "Visualizer for TIA-598C fiber optic color codes from 1 to 288 cores, tube mapping, and RJ45 LAN pinout diagrams (T568A/T568B) with PoE pairing."
      },
      "canonicalId": "https://kalkunet.com/id/tools/fiber-color-code-rj45-simulator",
      "canonicalEn": "https://kalkunet.com/en/tools/fiber-color-code-rj45-simulator",
      "inputs": [
        {
          "key": "targetCoreNumber",
          "label": {
            "id": "Nomor Core Target yang Dicari (1–288)",
            "en": "Target Core Number to Trace (1–288)"
          },
          "type": "number",
          "defaultValue": 27,
          "min": 1,
          "max": 288
        },
        {
          "key": "coresPerTube",
          "label": {
            "id": "Kapasitas Core per Loose Tube",
            "en": "Cores Count per Loose Tube"
          },
          "type": "select",
          "defaultValue": "12",
          "options": [
            {
              "value": "6",
              "label": {
                "id": "6 Core per Tube (Kabel Drop / Distribusi)",
                "en": "6 Cores per Tube (Drop / Distribution)"
              }
            },
            {
              "value": "12",
              "label": {
                "id": "12 Core per Tube (Standar Industri Enterprise)",
                "en": "12 Cores per Tube (Industry Standard)"
              }
            },
            {
              "value": "24",
              "label": {
                "id": "24 Core per Tube (High Density Trunk)",
                "en": "24 Cores per Tube (High Density Trunk)"
              }
            }
          ]
        },
        {
          "key": "totalCableCores",
          "label": {
            "id": "Total Kapasitas Core Kabel",
            "en": "Total Cable Core Capacity"
          },
          "type": "select",
          "defaultValue": "48",
          "options": [
            {
              "value": "12",
              "label": {
                "id": "12 Core (1 Tube)",
                "en": "12 Cores (1 Tube)"
              }
            },
            {
              "value": "24",
              "label": {
                "id": "24 Core (2 Tube)",
                "en": "24 Cores (2 Tubes)"
              }
            },
            {
              "value": "48",
              "label": {
                "id": "48 Core (4 Tube)",
                "en": "48 Cores (4 Tubes)"
              }
            },
            {
              "value": "96",
              "label": {
                "id": "96 Core (8 Tube)",
                "en": "96 Cores (8 Tubes)"
              }
            },
            {
              "value": "144",
              "label": {
                "id": "144 Core (12 Tube)",
                "en": "144 Cores (12 Tubes)"
              }
            },
            {
              "value": "288",
              "label": {
                "id": "288 Core (24 Tube)",
                "en": "288 Cores (24 Tubes)"
              }
            }
          ]
        },
        {
          "key": "rj45Standard",
          "label": {
            "id": "Standar Susunan Pinout RJ45",
            "en": "RJ45 Pinout Wiring Standard"
          },
          "type": "select",
          "defaultValue": "T568B",
          "options": [
            {
              "value": "T568B",
              "label": {
                "id": "T568B (Komersial / Standar Dominan Indonesia)",
                "en": "T568B (Commercial / Standard)"
              }
            },
            {
              "value": "T568A",
              "label": {
                "id": "T568A (Perumahan / Standar Pemerintah AS)",
                "en": "T568A (Residential / US Gov)"
              }
            },
            {
              "value": "CROSSOVER",
              "label": {
                "id": "Crossover (T568A ke T568B Perangkat Lawas)",
                "en": "Crossover (T568A to T568B Legacy)"
              }
            }
          ]
        }
      ],
      "formulas": {
        "id": [
          "Nomor Tube = ceil(Nomor Core ÷ Core per Tube)",
          "Posisi Core dalam Tube = ((Nomor Core - 1) mod Core per Tube) + 1",
          "Urutan Warna TIA-598: Biru, Oranye, Hijau, Cokelat, Abu, Putih, Merah, Hitam, Kuning, Ungu, Pink, Toska",
          "PoE Mode A (Endspan): DC Power pada Pin 1, 2 (+) dan Pin 3, 6 (-)",
          "PoE Mode B (Midspan): DC Power pada Pin 4, 5 (+) dan Pin 7, 8 (-)"
        ],
        "en": [
          "Buffer Tube Number = ceil(Core Number ÷ Cores per Tube)",
          "Core Position in Tube = ((Core Number - 1) mod Cores per Tube) + 1",
          "TIA-598 Sequence: Blue, Orange, Green, Brown, Slate, White, Red, Black, Yellow, Violet, Rose, Aqua",
          "PoE Mode A (Endspan): DC Power on Pins 1, 2 (+) and Pins 3, 6 (-)",
          "PoE Mode B (Midspan): DC Power on Pins 4, 5 (+) and Pins 7, 8 (-)"
        ]
      }
    },
    {
      "id": "cable-label-qr-generator",
      "slug": "cable-label-qr-generator",
      "category": "server",
      "title": {
        "id": "Generator Label Kabel & Kode QR Standar TIA-606-C",
        "en": "TIA-606-C Cable Label & Asset QR Code Generator"
      },
      "description": {
        "id": "Generator label penamaan kabel patch panel, rak server, dan tag aset QR standar ANSI/TIA-606-C siap cetak untuk manajemen kabel rapi profesional.",
        "en": "Print-ready ANSI/TIA-606-C cable wrap, patch panel strip, and asset QR tag generator for standardized, enterprise-grade structured cabling."
      },
      "canonicalId": "https://kalkunet.com/id/tools/cable-label-qr-generator",
      "canonicalEn": "https://kalkunet.com/en/tools/cable-label-qr-generator",
      "inputs": [
        {
          "key": "floorCode",
          "label": {
            "id": "Kode Lantai Gedung (Floor ID)",
            "en": "Building Floor Identifier"
          },
          "type": "text",
          "defaultValue": "FL01"
        },
        {
          "key": "rackCode",
          "label": {
            "id": "Kode Rak Server (Rack ID)",
            "en": "Server Cabinet / Rack Identifier"
          },
          "type": "text",
          "defaultValue": "RK01"
        },
        {
          "key": "switchCode",
          "label": {
            "id": "Kode Switch / Patch Panel",
            "en": "Switch / Patch Panel Identifier"
          },
          "type": "text",
          "defaultValue": "SW01"
        },
        {
          "key": "startPort",
          "label": {
            "id": "Nomor Port Switch Awal",
            "en": "Starting Switch Port Number"
          },
          "type": "number",
          "defaultValue": 1,
          "min": 1,
          "max": 48
        },
        {
          "key": "portCount",
          "label": {
            "id": "Jumlah Port yang Dilabeli",
            "en": "Number of Ports to Label"
          },
          "type": "select",
          "defaultValue": "24",
          "options": [
            {
              "value": "12",
              "label": {
                "id": "12 Port (Mini Patch Panel)",
                "en": "12 Ports (Mini Patch Panel)"
              }
            },
            {
              "value": "24",
              "label": {
                "id": "24 Port (1U Standard)",
                "en": "24 Ports (1U Standard)"
              }
            },
            {
              "value": "48",
              "label": {
                "id": "48 Port (2U Standard)",
                "en": "48 Ports (2U Standard)"
              }
            }
          ]
        },
        {
          "key": "vlanId",
          "label": {
            "id": "Alokasi Nomor VLAN Port",
            "en": "Assigned Port VLAN ID"
          },
          "type": "number",
          "defaultValue": 10,
          "min": 1,
          "max": 4094
        },
        {
          "key": "ipSubnetPrefix",
          "label": {
            "id": "Prefiks Subnet IP Host",
            "en": "Host Subnet IP Prefix"
          },
          "type": "text",
          "defaultValue": "192.168.10"
        }
      ],
      "formulas": {
        "id": [
          "Format Label TIA-606-C: [Lantai]-[Rak]-[Perangkat]:[Port] (Contoh: FL01-RK01-SW01:P01)",
          "Slot Patch Panel: PP-[Rak]:#[Port] (Contoh: PP-RK01:#01)",
          "Estimasi Lembar Kertas Stiker A4 = ceil(Jumlah Port ÷ 24)",
          "Pola Wrap-Around: [ Sumber | Tujuan ] ganda pada kedua ujung kabel"
        ],
        "en": [
          "ANSI/TIA-606-C Format: [Floor]-[Rack]-[Device]:[Port] (e.g. FL01-RK01-SW01:P01)",
          "Patch Panel Faceplate Slot: PP-[Rack]:#[Port] (e.g. PP-RK01:#01)",
          "Estimated A4 Sticker Sheets = ceil(Port Count ÷ 24)",
          "Wrap-Around Geometry: Mirrored [ Source | Destination ] tags applied at both cable ends"
        ]
      }
    },
    {
      "id": "it-bast-uat-checklist-generator",
      "slug": "it-bast-uat-checklist-generator",
      "category": "general",
      "title": {
        "id": "Generator Checklist UAT & Berita Acara BAST Proyek IT",
        "en": "IT Project UAT Checklist & Handover BAST Generator"
      },
      "description": {
        "id": "Pembuat dokumen checklist User Acceptance Testing (UAT) dan draft Berita Acara Serah Terima (BAST) resmi untuk commissioning proyek jaringan & IT.",
        "en": "Generate formal User Acceptance Testing (UAT) checklists and project commissioning handover (BAST) documentation for enterprise IT deployments."
      },
      "canonicalId": "https://kalkunet.com/id/tools/it-bast-uat-checklist-generator",
      "canonicalEn": "https://kalkunet.com/en/tools/it-bast-uat-checklist-generator",
      "inputs": [
        {
          "key": "projectScope",
          "label": {
            "id": "Lingkup Pekerjaan Proyek",
            "en": "Project Scope of Work"
          },
          "type": "select",
          "defaultValue": "full_infrastructure",
          "options": [
            {
              "value": "network_wifi",
              "label": {
                "id": "Jaringan Komputer & Wi-Fi Enterprise",
                "en": "Enterprise Network & Wi-Fi"
              }
            },
            {
              "value": "cctv_surveillance",
              "label": {
                "id": "Sistem Keamanan CCTV Surveillance",
                "en": "CCTV Surveillance System"
              }
            },
            {
              "value": "server_virtualization",
              "label": {
                "id": "Server Virtualisasi & Storage Cluster",
                "en": "Server Virtualization & Storage"
              }
            },
            {
              "value": "full_infrastructure",
              "label": {
                "id": "Infrastruktur IT Lengkap (Full Turnkey)",
                "en": "Full Enterprise Infrastructure (Turnkey)"
              }
            }
          ]
        },
        {
          "key": "totalEndpoints",
          "label": {
            "id": "Total Titik Tarikan Kabel / Endpoints",
            "en": "Total Endpoint Node Count"
          },
          "type": "number",
          "defaultValue": 24,
          "min": 1,
          "max": 500
        },
        {
          "key": "targetUptimeSlaPct",
          "label": {
            "id": "Target Komitmen SLA Ketersediaan",
            "en": "Target Availability SLA Commitment"
          },
          "type": "number",
          "defaultValue": 99.5,
          "min": 90,
          "max": 99.999,
          "step": 0.1,
          "unit": "%"
        },
        {
          "key": "retentionDays",
          "label": {
            "id": "Persyaratan Hari Retensi Data/Rekaman",
            "en": "Required Storage Retention Period"
          },
          "type": "number",
          "defaultValue": 30,
          "min": 7,
          "max": 365,
          "unit": "Hari"
        }
      ],
      "formulas": {
        "id": [
          "Checklist UAT 5 Pilar: Fisik Kabel, Switching PoE, Redundansi & Failover, Penyimpanan, dan Pengerasan Keamanan",
          "Kriteria Kelulusan Kabel: 100% Pass Fluke/LAN Tester & Label TIA-606 Terpasang",
          "Kriteria Kelulusan PoE: Packet Loss 0%, Tegangan PD >= 44V DC",
          "Syarat BAST 100%: Seluruh butir pengujian Lulus (Pass) dan dokumen As-Built diserahkan"
        ],
        "en": [
          "5-Pillar Commissioning: Physical Layer, Switching & PoE, Redundancy & Failover, Storage Retention, and Security Hardening",
          "Cabling Acceptance: 100% Pass on Fluke/LAN tester & TIA-606 label compliance",
          "PoE Delivery Acceptance: Zero packet loss, PD DC Voltage >= 44V",
          "100% BAST Signoff: All UAT checklist parameters Pass and As-Built drawings delivered"
        ]
      }
    },
    {
      "id": "maintenance-window-timezone-planner",
      "slug": "maintenance-window-timezone-planner",
      "category": "linux",
      "title": {
        "id": "Perencana Jendela Pemeliharaan Multi-Timezone & Cron",
        "en": "Multi-Timezone Maintenance Window & Cron Planner"
      },
      "description": {
        "id": "Rencanakan jadwal jendela maintenance server lintas zona waktu WIB, WITA, WIT, SGT, dan UTC dengan deteksi benturan cron backup otomatis.",
        "en": "Plan server maintenance windows across WIB, WITA, WIT, SGT, and UTC timezones with automated cron backup conflict detection and change notice."
      },
      "canonicalId": "https://kalkunet.com/id/tools/maintenance-window-timezone-planner",
      "canonicalEn": "https://kalkunet.com/en/tools/maintenance-window-timezone-planner",
      "inputs": [
        {
          "key": "startHourWita",
          "label": {
            "id": "Jam Mulai Pemeliharaan (Format WITA Makassar/Bali)",
            "en": "Maintenance Start Hour (WITA Timezone)"
          },
          "type": "select",
          "defaultValue": "1",
          "options": [
            {
              "value": "0",
              "label": {
                "id": "Pukul 00:00 WITA",
                "en": "00:00 WITA"
              }
            },
            {
              "value": "1",
              "label": {
                "id": "Pukul 01:00 WITA",
                "en": "01:00 WITA"
              }
            },
            {
              "value": "2",
              "label": {
                "id": "Pukul 02:00 WITA",
                "en": "02:00 WITA"
              }
            },
            {
              "value": "3",
              "label": {
                "id": "Pukul 03:00 WITA",
                "en": "03:00 WITA"
              }
            },
            {
              "value": "4",
              "label": {
                "id": "Pukul 04:00 WITA",
                "en": "04:00 WITA"
              }
            },
            {
              "value": "5",
              "label": {
                "id": "Pukul 05:00 WITA",
                "en": "05:00 WITA"
              }
            },
            {
              "value": "6",
              "label": {
                "id": "Pukul 06:00 WITA",
                "en": "06:00 WITA"
              }
            },
            {
              "value": "7",
              "label": {
                "id": "Pukul 07:00 WITA",
                "en": "07:00 WITA"
              }
            },
            {
              "value": "8",
              "label": {
                "id": "Pukul 08:00 WITA",
                "en": "08:00 WITA"
              }
            },
            {
              "value": "9",
              "label": {
                "id": "Pukul 09:00 WITA",
                "en": "09:00 WITA"
              }
            },
            {
              "value": "10",
              "label": {
                "id": "Pukul 10:00 WITA",
                "en": "10:00 WITA"
              }
            },
            {
              "value": "11",
              "label": {
                "id": "Pukul 11:00 WITA",
                "en": "11:00 WITA"
              }
            },
            {
              "value": "12",
              "label": {
                "id": "Pukul 12:00 WITA",
                "en": "12:00 WITA"
              }
            },
            {
              "value": "13",
              "label": {
                "id": "Pukul 13:00 WITA",
                "en": "13:00 WITA"
              }
            },
            {
              "value": "14",
              "label": {
                "id": "Pukul 14:00 WITA",
                "en": "14:00 WITA"
              }
            },
            {
              "value": "15",
              "label": {
                "id": "Pukul 15:00 WITA",
                "en": "15:00 WITA"
              }
            },
            {
              "value": "16",
              "label": {
                "id": "Pukul 16:00 WITA",
                "en": "16:00 WITA"
              }
            },
            {
              "value": "17",
              "label": {
                "id": "Pukul 17:00 WITA",
                "en": "17:00 WITA"
              }
            },
            {
              "value": "18",
              "label": {
                "id": "Pukul 18:00 WITA",
                "en": "18:00 WITA"
              }
            },
            {
              "value": "19",
              "label": {
                "id": "Pukul 19:00 WITA",
                "en": "19:00 WITA"
              }
            },
            {
              "value": "20",
              "label": {
                "id": "Pukul 20:00 WITA",
                "en": "20:00 WITA"
              }
            },
            {
              "value": "21",
              "label": {
                "id": "Pukul 21:00 WITA",
                "en": "21:00 WITA"
              }
            },
            {
              "value": "22",
              "label": {
                "id": "Pukul 22:00 WITA",
                "en": "22:00 WITA"
              }
            },
            {
              "value": "23",
              "label": {
                "id": "Pukul 23:00 WITA",
                "en": "23:00 WITA"
              }
            }
          ]
        },
        {
          "key": "durationHours",
          "label": {
            "id": "Durasi Alokasi Jendela Kerja",
            "en": "Allocated Window Duration"
          },
          "type": "number",
          "defaultValue": 2,
          "min": 1,
          "max": 12,
          "unit": "Jam"
        },
        {
          "key": "estimatedDowntimeMinutes",
          "label": {
            "id": "Perkiraan Total Durasi Downtime Layanan",
            "en": "Estimated Service Downtime Minutes"
          },
          "type": "number",
          "defaultValue": 15,
          "min": 0,
          "max": 360,
          "unit": "Menit"
        }
      ],
      "formulas": {
        "id": [
          "Konversi WIB = (WITA - 1 + 24) mod 24 (UTC+7)",
          "Konversi WIT = (WITA + 1) mod 24 (UTC+9)",
          "Konversi Server Standard Time UTC = (WITA - 8 + 24) mod 24 (UTC+0)",
          "Kriteria Off-Peak Nasional: Jam Mulai WIB antara 00:00 hingga 05:00",
          "Sisa Target SLA Bulanan (%) = ((43.800 - Downtime Menit) ÷ 43.800) × 100"
        ],
        "en": [
          "WIB Conversion = (WITA - 1 + 24) mod 24 (UTC+7)",
          "WIT Conversion = (WITA + 1) mod 24 (UTC+9)",
          "Server Standard Time UTC = (WITA - 8 + 24) mod 24 (UTC+0)",
          "National Off-Peak Window: WIB Start Hour between 00:00 and 05:00",
          "Monthly SLA Availability (%) = ((43,800 - Downtime Minutes) ÷ 43,800) × 100"
        ]
      }
    },
    {
      "id": "gpon-ftth-splitter-cascade-calculator",
      "slug": "gpon-ftth-splitter-cascade-calculator",
      "category": "network",
      "title": {
        "id": "Kalkulator Cascade Splitter GPON & Optical Tree FTTH",
        "en": "GPON FTTH Cascade Splitter & Optical Tree Calculator"
      },
      "description": {
        "id": "Hitung redaman link optik GPON/EPON, simulasi rasio splitter ODC dan ODP cascade (1:2 hingga 1:16, tap 15/85), serta diagram pohon optik ITU-T G.984.",
        "en": "Calculate GPON/EPON optical link loss budget, simulate ODC/ODP cascade splitters (1:2 to 1:16, tap 15/85), and view ITU-T G.984 optical tree diagrams."
      },
      "canonicalId": "https://kalkunet.com/id/tools/gpon-ftth-splitter-cascade-calculator",
      "canonicalEn": "https://kalkunet.com/en/tools/gpon-ftth-splitter-cascade-calculator",
      "inputs": [
        {
          "key": "oltSfpClass",
          "label": {
            "id": "Kelas Modul SFP OLT PON",
            "en": "OLT PON SFP Class"
          },
          "type": "select",
          "defaultValue": "C_PLUS",
          "options": [
            {
              "value": "B_PLUS",
              "label": {
                "id": "Class B+ (Daya Typ +3.0 dBm)",
                "en": "Class B+ (+3.0 dBm Typ)"
              }
            },
            {
              "value": "C_PLUS",
              "label": {
                "id": "Class C+ (Daya Typ +5.0 dBm)",
                "en": "Class C+ (+5.0 dBm Typ)"
              }
            },
            {
              "value": "C_PLUS_PLUS",
              "label": {
                "id": "Class C++ (Daya Typ +7.0 dBm)",
                "en": "Class C++ (+7.0 dBm Typ)"
              }
            }
          ]
        },
        {
          "key": "oltTxPowerDbm",
          "label": {
            "id": "Daya Output SFP OLT Terukur (dBm)",
            "en": "Measured OLT Tx Power (dBm)"
          },
          "type": "number",
          "defaultValue": 5,
          "min": 1,
          "max": 12,
          "step": 0.1,
          "unit": "dBm"
        },
        {
          "key": "feederLengthKm",
          "label": {
            "id": "Jarak Kabel Feeder OLT ke ODC (km)",
            "en": "Feeder Fiber Length OLT to ODC (km)"
          },
          "type": "number",
          "defaultValue": 1.5,
          "min": 0.1,
          "max": 25,
          "step": 0.1,
          "unit": "km"
        },
        {
          "key": "distributionLengthKm",
          "label": {
            "id": "Jarak Kabel Distribusi ODC ke ODP (km)",
            "en": "Distribution Fiber Length ODC to ODP (km)"
          },
          "type": "number",
          "defaultValue": 0.8,
          "min": 0.1,
          "max": 15,
          "step": 0.1,
          "unit": "km"
        },
        {
          "key": "dropCableLengthM",
          "label": {
            "id": "Panjang Drop Cable ODP ke ONT (m)",
            "en": "Drop Cable Length ODP to ONT (m)"
          },
          "type": "number",
          "defaultValue": 150,
          "min": 10,
          "max": 500,
          "step": 10,
          "unit": "m"
        },
        {
          "key": "odcSplitterRatio",
          "label": {
            "id": "Rasio Splitter Tahap 1 di ODC",
            "en": "1st Stage ODC Splitter Ratio"
          },
          "type": "select",
          "defaultValue": "1:4",
          "options": [
            {
              "value": "1:2",
              "label": {
                "id": "PLC 1:2 (Redaman ~3.7 dB)",
                "en": "PLC 1:2 (Loss ~3.7 dB)"
              }
            },
            {
              "value": "1:4",
              "label": {
                "id": "PLC 1:4 (Redaman ~7.2 dB)",
                "en": "PLC 1:4 (Loss ~7.2 dB)"
              }
            },
            {
              "value": "1:8",
              "label": {
                "id": "PLC 1:8 (Redaman ~10.5 dB)",
                "en": "PLC 1:8 (Loss ~10.5 dB)"
              }
            }
          ]
        },
        {
          "key": "odpSplitterRatio",
          "label": {
            "id": "Rasio Splitter Tahap 2 di ODP",
            "en": "2nd Stage ODP Splitter Ratio"
          },
          "type": "select",
          "defaultValue": "1:8",
          "options": [
            {
              "value": "1:4",
              "label": {
                "id": "PLC 1:4 (Redaman ~7.2 dB)",
                "en": "PLC 1:4 (Loss ~7.2 dB)"
              }
            },
            {
              "value": "1:8",
              "label": {
                "id": "PLC 1:8 (Redaman ~10.5 dB)",
                "en": "PLC 1:8 (Loss ~10.5 dB)"
              }
            },
            {
              "value": "1:16",
              "label": {
                "id": "PLC 1:16 (Redaman ~13.8 dB)",
                "en": "PLC 1:16 (Loss ~13.8 dB)"
              }
            }
          ]
        },
        {
          "key": "cascadeRatioTap",
          "label": {
            "id": "Konfigurasi Unbalanced FBT Cascade",
            "en": "FBT Unbalanced Tap Ratio"
          },
          "type": "select",
          "defaultValue": "NONE",
          "options": [
            {
              "value": "NONE",
              "label": {
                "id": "Tanpa Tap Cascade (Murni Star Topology)",
                "en": "No Cascade Tap (Pure Star Topology)"
              }
            },
            {
              "value": "15/85",
              "label": {
                "id": "FBT 15/85 (Tap: 8.6 dB, Through: 0.9 dB)",
                "en": "FBT 15/85 (Tap 8.6 dB, Thru 0.9 dB)"
              }
            },
            {
              "value": "20/80",
              "label": {
                "id": "FBT 20/80 (Tap: 7.3 dB, Through: 1.1 dB)",
                "en": "FBT 20/80 (Tap 7.3 dB, Thru 1.1 dB)"
              }
            },
            {
              "value": "30/70",
              "label": {
                "id": "FBT 30/70 (Tap: 5.4 dB, Through: 1.7 dB)",
                "en": "FBT 30/70 (Tap 5.4 dB, Thru 1.7 dB)"
              }
            },
            {
              "value": "50/50",
              "label": {
                "id": "FBT 50/50 (Tap: 3.2 dB, Through: 3.2 dB)",
                "en": "FBT 50/50 (Tap 3.2 dB, Thru 3.2 dB)"
              }
            }
          ]
        },
        {
          "key": "spliceCount",
          "label": {
            "id": "Jumlah Titik Sambungan Splicing",
            "en": "Splice Joint Points Count"
          },
          "type": "number",
          "defaultValue": 6,
          "min": 0,
          "max": 50,
          "unit": "Titik"
        },
        {
          "key": "connectorCount",
          "label": {
            "id": "Jumlah Pasang Konektor SC/APC",
            "en": "SC/APC Connector Pairs"
          },
          "type": "number",
          "defaultValue": 6,
          "min": 2,
          "max": 30,
          "unit": "Pasang"
        }
      ],
      "formulas": {
        "id": [
          "Total Link Loss (dB) = (Jarak Serat km × 0.25 dB/km) + (Splice × 0.1 dB) + (Konektor × 0.25 dB) + Loss ODC + Loss ODP + FBT Tap",
          "Daya Terima ONT (dBm) = Daya Pancar OLT Tx (dBm) - Total Link Loss (dB)",
          "Standar Sensitivitas ONT Aman: -8.0 dBm s/d -23.0 dBm (Maksimum Sensitivitas -27 dBm ITU-T G.984)"
        ],
        "en": [
          "Total Link Loss (dB) = (Fiber Distance km × 0.25 dB/km) + (Splices × 0.1 dB) + (Connectors × 0.25 dB) + Loss ODC + Loss ODP + FBT Tap",
          "ONT Received Power (dBm) = OLT SFP Launch Tx (dBm) - Total Optical Link Loss (dB)",
          "Target ONT Sensitivity: -8.0 dBm to -23.0 dBm (Maximum Sensitivity -27 dBm per ITU-T G.984)"
        ]
      }
    },
    {
      "id": "mac-oui-dhcp-lease-inspector",
      "slug": "mac-oui-dhcp-lease-inspector",
      "category": "network",
      "title": {
        "id": "Inspektur MAC Vendor OUI & Audit Lease DHCP MikroTik",
        "en": "MAC Vendor OUI & MikroTik DHCP Lease Conflict Inspector"
      },
      "description": {
        "id": "Analisis massal tabel ARP dan DHCP lease MikroTik, identifikasi vendor OUI perangkat, deteksi MAC acak, serta temukan konflik alamat IP ganda jaringan.",
        "en": "Inspect bulk ARP tables and MikroTik DHCP leases, identify OUI vendors, detect randomized MACs, and catch duplicate IP network conflicts instantly."
      },
      "canonicalId": "https://kalkunet.com/id/tools/mac-oui-dhcp-lease-inspector",
      "canonicalEn": "https://kalkunet.com/en/tools/mac-oui-dhcp-lease-inspector",
      "inputs": [
        {
          "key": "singleMacOrDump",
          "label": {
            "id": "Daftar Alamat IP & MAC (Paste Log DHCP / ARP)",
            "en": "IP & MAC Address List (Paste DHCP / ARP Table)"
          },
          "type": "textarea",
          "defaultValue": "192.168.88.1 48:8F:5A:11:22:33 MikroTik-Core\n192.168.88.10 BC:24:11:AA:BB:01 pve-node1\n192.168.88.21 44:19:B6:00:11:22 IPCam-Lobby\n192.168.88.22 30:0D:9E:55:66:77 AP-Ruijie-Lt1\n192.168.88.55 DA:A1:19:12:34:56 iPhone-Guest"
        }
      ],
      "formulas": {
        "id": [
          "OUI Vendor = 3 Oktet Pertama (24 bit awal heksadesimal dari IEEE Registration Authority)",
          "Bit LAA (Locally Administered Address) = Karakter ke-2 pada oktet 1 bernilai 2, 6, A, atau E menandakan MAC Acak Pribadi",
          "Deteksi Konflik IP = Duplikasi Alamat IP yang terikat pada lebih dari satu MAC Address unik"
        ],
        "en": [
          "Vendor OUI = First 3 Octets (initial 24 hex bits assigned by IEEE Registration Authority)",
          "LAA Bit (Locally Administered Address) = 2nd nibble of 1st octet is 2, 6, A, or E indicating Randomized Privacy MAC",
          "IP Conflict Detection = Same IP address mapped to multiple distinct physical MAC addresses"
        ]
      }
    },
    {
      "id": "infrastructure-spec-duel-comparator",
      "slug": "infrastructure-spec-duel-comparator",
      "category": "server",
      "title": {
        "id": "Komparator Duel Spesifikasi Infrastruktur IT & ROI",
        "en": "Infrastructure Spec Duel & Hardware ROI Comparator"
      },
      "description": {
        "id": "Bandingkan spesifikasi teknis ZFS RAIDZ1 vs RAIDZ2 vs RAID10, penghematan hardisk CCTV H.264 vs H.265+, serta throughput WireGuard vs IPsec vs OpenVPN.",
        "en": "Compare technical specifications of ZFS RAIDZ1 vs RAIDZ2 vs RAID10, CCTV H.264 vs H.265+ storage savings, and WireGuard vs IPsec vs OpenVPN throughput."
      },
      "canonicalId": "https://kalkunet.com/id/tools/infrastructure-spec-duel-comparator",
      "canonicalEn": "https://kalkunet.com/en/tools/infrastructure-spec-duel-comparator",
      "inputs": [
        {
          "key": "duelMode",
          "label": {
            "id": "Dimensi Duel Perbandingan",
            "en": "Duel Comparison Mode"
          },
          "type": "select",
          "defaultValue": "STORAGE_RAID",
          "options": [
            {
              "value": "STORAGE_RAID",
              "label": {
                "id": "Penyimpanan ZFS RAIDZ1 vs RAIDZ2 vs RAID10",
                "en": "ZFS Storage RAIDZ1 vs RAIDZ2 vs RAID10"
              }
            },
            {
              "value": "CCTV_CODEC",
              "label": {
                "id": "Penghematan Codec CCTV H.264 vs H.265+",
                "en": "CCTV Codec Savings H.264 vs H.265+"
              }
            },
            {
              "value": "VPN_PROTOCOL",
              "label": {
                "id": "Protokol VPN WireGuard vs IPsec vs OpenVPN",
                "en": "VPN Protocol WireGuard vs IPsec vs OpenVPN"
              }
            }
          ]
        },
        {
          "key": "diskOrCamCount",
          "label": {
            "id": "Jumlah Hardisk Drive / Kamera CCTV",
            "en": "Drive Count / CCTV Cameras Quantity"
          },
          "type": "number",
          "defaultValue": 8,
          "min": 4,
          "max": 64,
          "unit": "Unit"
        },
        {
          "key": "unitSizeTbOrDays",
          "label": {
            "id": "Kapasitas per Disk (TB) / Retensi (Hari)",
            "en": "Disk Capacity (TB) / Retention (Days)"
          },
          "type": "number",
          "defaultValue": 4,
          "min": 1,
          "max": 90,
          "unit": "TB/Hari"
        },
        {
          "key": "hddPricePerTbIdr",
          "label": {
            "id": "Asumsi Harga Hardisk Enterprise per TB (IDR)",
            "en": "Enterprise Hard Drive Price per TB (IDR)"
          },
          "type": "number",
          "defaultValue": 450000,
          "min": 100000,
          "max": 2000000,
          "step": 10000,
          "unit": "Rp/TB"
        }
      ],
      "formulas": {
        "id": [
          "Kapasitas Aman ZFS RAIDZ2 (TB) = (Jumlah Disk - 2 Paritas) × Kapasitas Unit × 80% Pool Safety Margin",
          "Kapasitas Aman ZFS RAID10 (TB) = (Jumlah Disk ÷ 2 Mirror) × Kapasitas Unit × 80% Pool Safety Margin",
          "Estimasi Penghematan CCTV H.265+ (IDR) = (Total TB H.264 - Total TB H.265+) × Harga per TB"
        ],
        "en": [
          "ZFS RAIDZ2 Safe Usable (TB) = (Disks - 2 Parity) × Drive Size × 80% Pool Safety Margin",
          "ZFS RAID10 Safe Usable (TB) = (Disks ÷ 2 Mirror) × Drive Size × 80% Pool Safety Margin",
          "CCTV H.265+ Savings (IDR) = (H.264 Total TB - H.265+ Total TB) × Price per TB"
        ]
      }
    },
    {
      "id": "docker-nginx-stack-composer",
      "slug": "docker-nginx-stack-composer",
      "category": "linux",
      "title": {
        "id": "Visual Composer Docker, Nginx & Linux Stack",
        "en": "Docker, Nginx & Linux Stack Visual Composer"
      },
      "description": {
        "id": "Rancang arsitektur server produksi modular (Lego Builder): pilih Nginx/Cloudflare, Frontend, Backend, DB & Redis. Hasilkan topologi SVG, docker-compose.yml, dan UFW hardening otomatis.",
        "en": "Visually compose production container stacks: select Nginx/Cloudflare ingress, frontend, backend API, databases & Redis. Generates SVG topology, docker-compose.yml, and UFW scripts."
      },
      "canonicalId": "https://kalkunet.com/id/tools/docker-nginx-stack-composer",
      "canonicalEn": "https://kalkunet.com/en/tools/docker-nginx-stack-composer",
      "inputs": [
        {
          "key": "projectName",
          "label": {
            "id": "Nama Proyek (Slug)",
            "en": "Project Name (Slug)"
          },
          "type": "text",
          "defaultValue": "kampus-app"
        },
        {
          "key": "domainName",
          "label": {
            "id": "Domain Produksi",
            "en": "Production Domain"
          },
          "type": "text",
          "defaultValue": "app.example.com"
        },
        {
          "key": "edgeIngress",
          "label": {
            "id": "Lapisan Edge & Ingress Proxy",
            "en": "Edge Ingress & Proxy Tier"
          },
          "type": "select",
          "defaultValue": "BOTH_NGINX_AND_CF",
          "options": [
            {
              "value": "NGINX_SSL",
              "label": {
                "id": "Nginx Reverse Proxy + SSL Let's Encrypt (Port 80/443)",
                "en": "Nginx Reverse Proxy + SSL Let's Encrypt (Port 80/443)"
              }
            },
            {
              "value": "CLOUDFLARE_TUNNEL",
              "label": {
                "id": "Cloudflare Zero-Trust Tunnel (0 Port Terbuka WAN)",
                "en": "Cloudflare Zero-Trust Tunnel (Zero Open WAN Port)"
              }
            },
            {
              "value": "BOTH_NGINX_AND_CF",
              "label": {
                "id": "Hybrid Nginx + Cloudflare Tunnel (Double Protection)",
                "en": "Hybrid Nginx + Cloudflare Tunnel (Double Protection)"
              }
            }
          ]
        },
        {
          "key": "frontendStack",
          "label": {
            "id": "Lapisan Frontend UI / Web App",
            "en": "Frontend UI Tier"
          },
          "type": "select",
          "defaultValue": "NEXTJS_NODE",
          "options": [
            {
              "value": "NEXTJS_NODE",
              "label": {
                "id": "Next.js SSR Frontend (Node 20, Port 3000)",
                "en": "Next.js SSR Frontend (Node 20, Port 3000)"
              }
            },
            {
              "value": "REACT_VITE_STATIC",
              "label": {
                "id": "React / Vue SPA Statis (Nginx, Port 8080)",
                "en": "React / Vue Static SPA (Nginx, Port 8080)"
              }
            },
            {
              "value": "NONE",
              "label": {
                "id": "Tanpa Frontend (API Backend Saja)",
                "en": "No Frontend (Backend API Only)"
              }
            }
          ]
        },
        {
          "key": "backendStack",
          "label": {
            "id": "Lapisan Backend API Engine",
            "en": "Backend API Engine Tier"
          },
          "type": "select",
          "defaultValue": "LARAVEL_OCTANE",
          "options": [
            {
              "value": "NODE_EXPRESS",
              "label": {
                "id": "Node.js / Express / NestJS (Port 4000)",
                "en": "Node.js / Express / NestJS (Port 4000)"
              }
            },
            {
              "value": "LARAVEL_OCTANE",
              "label": {
                "id": "Laravel PHP 8.3 Octane / FrankenPHP (Port 8000)",
                "en": "Laravel PHP 8.3 Octane / FrankenPHP (Port 8000)"
              }
            },
            {
              "value": "GO_FIBER",
              "label": {
                "id": "Go Fiber / Gin High-Throughput Binary (Port 8081)",
                "en": "Go Fiber / Gin High-Throughput Binary (Port 8081)"
              }
            },
            {
              "value": "PYTHON_FASTAPI",
              "label": {
                "id": "Python FastAPI / Uvicorn (Port 8000)",
                "en": "Python FastAPI / Uvicorn (Port 8000)"
              }
            }
          ]
        },
        {
          "key": "databaseStack",
          "label": {
            "id": "Lapisan Basis Data (Terisolasi)",
            "en": "Isolated Database Tier"
          },
          "type": "select",
          "defaultValue": "POSTGRES_16",
          "options": [
            {
              "value": "POSTGRES_16",
              "label": {
                "id": "PostgreSQL 16 Relational DB (Port 5432 Internal)",
                "en": "PostgreSQL 16 Relational DB (Port 5432 Internal)"
              }
            },
            {
              "value": "MYSQL_8",
              "label": {
                "id": "MySQL 8.4 LTS Enterprise Database (Port 3306 Internal)",
                "en": "MySQL 8.4 LTS Enterprise Database (Port 3306 Internal)"
              }
            },
            {
              "value": "MARIADB_11",
              "label": {
                "id": "MariaDB 11.4 Community Database (Port 3306 Internal)",
                "en": "MariaDB 11.4 Community Database (Port 3306 Internal)"
              }
            }
          ]
        },
        {
          "key": "enableRedisCache",
          "label": {
            "id": "Aktifkan Redis 7.4 In-Memory Cache (:6379)",
            "en": "Enable Redis 7.4 In-Memory Cache (:6379)"
          },
          "type": "checkbox",
          "defaultValue": true
        },
        {
          "key": "enableUptimeKuma",
          "label": {
            "id": "Aktifkan Uptime Kuma Health Monitoring (:3001)",
            "en": "Enable Uptime Kuma Health Monitoring (:3001)"
          },
          "type": "checkbox",
          "defaultValue": true
        },
        {
          "key": "sshCustomPort",
          "label": {
            "id": "Port SSH VPS untuk Firewall UFW",
            "en": "VPS SSH Port for UFW Firewall"
          },
          "type": "number",
          "defaultValue": 22,
          "min": 22,
          "max": 65535
        }
      ],
      "formulas": {
        "id": [
          "Total Alokasi RAM (MB) = Σ(RAM Ingress + RAM Frontend + RAM Backend + RAM Database + RAM Addons)",
          "Rekomendasi RAM VPS = Total Alokasi RAM <= 1.2 GB ? 2 GB : Total Alokasi RAM <= 2.6 GB ? 4 GB : 8 GB",
          "Isolasi Jaringan = db-net { driver: bridge, internal: true } -> 0 Port WAN Exposed"
        ],
        "en": [
          "Total Stack RAM (MB) = Σ(RAM Ingress + RAM Frontend + RAM Backend + RAM Database + RAM Addons)",
          "Recommended VPS RAM = Total Stack RAM <= 1.2 GB ? 2 GB : Total Stack RAM <= 2.6 GB ? 4 GB : 8 GB",
          "Network Isolation = db-net { driver: bridge, internal: true } -> 0 Exposed WAN Ports"
        ]
      }
    },
    {
      "id": "api-capacity-rate-limit-calculator",
      "slug": "api-capacity-rate-limit-calculator",
      "category": "dev",
      "title": {
        "id": "Kalkulator Kapasitas API & Rekomendasi Rate Limit",
        "en": "API Capacity & Rate Limit Calculator"
      },
      "description": {
        "id": "Hitung kapasitas RPS puncak (Little's Law L=λW), koneksi in-flight simultan, alokasi vCPU core, dan generator rate limiting Nginx (HTTP 429) otomatis.",
        "en": "Calculate sustained & burst peak RPS (Little's Law L=λW), concurrent in-flight requests, required vCPU cores, and Nginx rate-limiting rules."
      },
      "canonicalId": "https://kalkunet.com/id/tools/api-capacity-rate-limit-calculator",
      "canonicalEn": "https://kalkunet.com/en/tools/api-capacity-rate-limit-calculator",
      "inputs": [
        {
          "key": "dailyActiveUsers",
          "label": {
            "id": "Pengguna Aktif Harian (DAU)",
            "en": "Daily Active Users (DAU)"
          },
          "type": "number",
          "defaultValue": 25000,
          "min": 10,
          "max": 10000000,
          "step": 1000
        },
        {
          "key": "requestsPerUserPerDay",
          "label": {
            "id": "Panggilan API per Pengguna / Hari",
            "en": "Requests per User / Day"
          },
          "type": "number",
          "defaultValue": 40,
          "min": 1,
          "max": 10000,
          "step": 5
        },
        {
          "key": "peakHourTrafficRatioPct",
          "label": {
            "id": "Rasio Trafik Jam Sibuk (%)",
            "en": "Peak Hour Traffic Concentration (%)"
          },
          "type": "number",
          "defaultValue": 20,
          "min": 5,
          "max": 90,
          "step": 5,
          "unit": "%"
        },
        {
          "key": "burstMultiplier",
          "label": {
            "id": "Faktor Lonjakan Spike (Burst)",
            "en": "Instantaneous Burst Multiplier"
          },
          "type": "number",
          "defaultValue": 3,
          "min": 1.2,
          "max": 10,
          "step": 0.5,
          "unit": "x"
        },
        {
          "key": "avgResponsePayloadKb",
          "label": {
            "id": "Rata-rata Ukuran Respons JSON (KB)",
            "en": "Average Response Payload Size (KB)"
          },
          "type": "number",
          "defaultValue": 18,
          "min": 0.5,
          "max": 2048,
          "step": 1,
          "unit": "KB"
        },
        {
          "key": "avgEndpointLatencyMs",
          "label": {
            "id": "Latensi Rata-rata Endpoint (ms)",
            "en": "Average Endpoint Latency (ms)"
          },
          "type": "number",
          "defaultValue": 45,
          "min": 2,
          "max": 10000,
          "step": 5,
          "unit": "ms"
        },
        {
          "key": "workerConcurrencyPerCore",
          "label": {
            "id": "Konkurensi Worker per Core vCPU",
            "en": "Worker Concurrency per vCPU Core"
          },
          "type": "number",
          "defaultValue": 100,
          "min": 10,
          "max": 2000,
          "step": 25,
          "unit": "req/core"
        }
      ],
      "formulas": {
        "id": [
          "Total Request Harian = DAU × Requests/User",
          "Sustained Peak RPS = (Total Request × Peak Ratio %) / 3600 detik",
          "Burst Peak RPS = Sustained Peak RPS × Burst Multiplier",
          "Hukum Little: L = λ × W (In-Flight Connections = Burst RPS × Latensi detik)",
          "vCPU Worker = ceil((L / ConcurrencyPerCore) × 1.5)",
          "Egress Bandwidth = (Burst RPS × Payload KB × 8) / 1000 (Mbps)"
        ],
        "en": [
          "Total Daily Requests = DAU × Requests/User",
          "Sustained Peak RPS = (Total Daily Requests × Peak Ratio %) / 3600 seconds",
          "Burst Peak RPS = Sustained Peak RPS × Burst Multiplier",
          "Little's Law: L = λ × W (In-Flight Connections = Burst RPS × Latency seconds)",
          "Required vCPU = ceil((L / ConcurrencyPerCore) × 1.5)",
          "Peak Egress Bandwidth = (Burst RPS × Payload KB × 8) / 1000 (Mbps)"
        ]
      }
    }
  ]
}