Developer Documentation

Dokumentasi teknis lengkap untuk developer dan admin yang memelihara project AI Chat ini.

Backend
Online
ZISCODE AI
Checking...
Nginx
Port 80
Express
Port 8080
AI Backend
Port 4096
Uptime
-
Status: All Systems Operational Semua service berjalan normal. AI backend aktif via systemd.

Arsitektur Sistem

User Browser │ ▼ ┌──────────────┐ ┌──────────────────┐ ┌──────────────────┐ │ Nginx │────►│ Express Server │────►│ ZISCODE AI Engine │ │ :80 │ │ :8080 │ │ :4096 │ │ (reverse │ │ - Static files │ │ (AI Backend) │ │ proxy) │ │ - REST API │ │ │ └──────────────┘ │ - /oc/* proxy │ └──────────────────┘ └──────────────────┘ │ ┌──────┴──────┐ │ │ ┌────▼───┐ ┌────▼───┐ │ sessions│ │ bugs │ │ / │ │ .json │ └────────┘ └────────┘

Quick Start

1. Akses Server

ssh -p 10072 root@69.197.187.172

2. Cek Status Service

pm2 list                    # Cek Express server
ss -tlnp | grep 4096         # Cek AI backend
curl http://127.0.0.1:4096/global/health  # Test health

3. Restart Express

pm2 restart landing-page
pm2 logs landing-page --lines 50

4. Cek AI Backend

systemctl status opencode          # Cek status service
systemctl restart opencode          # Restart jika perlu
journalctl -u opencode -f           # Lihat log

Server Backend (server.js)

ItemNilai
File/var/www/landing-page/server.js
FrameworkExpress 5.2.1
Port8080
Process ManagerPM2 (fork mode)
OC Proxy Target127.0.0.1:4096

Konfigurasi

VariableNilaiDeskripsi
PORT8080Port Express server
OC_PORT4096Port AI backend
ADMIN_PASSWORDAzisAdmin2026!Password admin panel
MAX_IMAGE_SIZE4000Maksimum gambar (px)
RATE_LIMIT5/60sRate limit bug reports

Routing Order (35 Routes)

#RouteMethodDeskripsi
1/api/admin/loginPOSTLogin admin, return token 1 jam
2/api/generatePOSTGenerate dokumen (PDF/DOCX/HTML)
3/api/documentsGETList file dokumen
4/api/documents/:filenameDELHapus dokumen
5/api/generate-imagePOSTGenerate gambar via Python
6/api/sessionsGETList sesi user
7/api/sessionsPOSTSimpan/update sesi
8/api/sessions/:idDELHapus sesi
9/api/user/tokenPOSTBuat user token
10/api/bugsGETList bug reports
11/api/bugsPOSTKirim bug report (rate limit 5/60s)
12/api/admin/usersGETList semua user (admin)
13/api/admin/user/:userIdGETDetail sesi user (admin)
14/api/admin/user/:userIdDELHapus semua sesi user (admin)
15/api/admin/session/:uid/:sidDELHapus sesi tertentu (admin)
16/api/admin/bugreportsGETList bug (admin)
17/oc/session/:id/permission/:pid/replyPOSTReply permission ke AI
18/oc/*ALLProxy ke ZISCODE AI backend
19/workspaceGETServe workspace home page
20/workspace/editorGETServe editor page
21/healthGETHealth check endpoint
22/api/workspace/projectsGETList project user
23/api/workspace/projectsPOSTBuat project baru (validasi nama duplikat)
24/api/workspace/projects/:idDELHapus project
25/api/workspace/projects/:id/filesGETList file project + projectName
26/api/workspace/projects/:id/newfilePOSTBuat file baru
27/api/workspace/projects/:id/execPOSTJalankan perintah shell (whitelist)
28/api/workspace/projects/:id/runPOSTJalankan Node.js/PHP server
29/api/workspace/projects/:id/deployPOSTDeploy ke URL publik
30/api/workspace/projects/:id/renamePUTRename project (validasi duplikat)
31/api/workspace/projects/:id/duplicatePOSTDuplicate project ("Name - Copy")
32/api/workspace/projects/:id/file/*PUTSave/update file (auto-save)
33/api/workspace/projects/:id/file/*DELHapus file
34/preview/:projectId/:filepathGETPreview file (auto-check public/)
35/deploy/:userId/:projectId/*GETServe deployed files (auto-check public/)

Frontend UI (index.html)

ItemNilai
File/var/www/landing-page/public/index.html
FrameworkVanilla HTML/CSS/JS (no framework)
External Libshighlight.js 11.9.0, Google Fonts Inter
ThemeDark (Slate palette: #0f172a)

Layout Structure

┌──────────────┬──────────────────────────────────┐
│   SIDEBAR    │              MAIN                │
│  260px       │                                  │
│  - New Chat  │  Header: title + status          │
│  - Sessions  │  Chat Area: messages             │
│  - Footer    │  Input: textarea + send + mode   │
└──────────────┴──────────────────────────────────┘

CSS Classes Penting

ClassDeskripsi
.sidebarContainer sidebar, width 260px
.sidebar.openSidebar terbuka (mobile)
.msg.userPesan user (biru, kanan)
.msg.aiPesan AI (gelap, kiri)
.code-wrapCode block dengan label bahasa
.mode-badgeBadge BUILD/PLAN
.typingAnimasi 3 dot
.welcomeLayar selamat datang

Mode Chat

ModeBadgeDeskripsi
buildBUILDEksekusi langsung
planPLANPerencanaan

File Upload

User dapat mengirim file (gambar, dokumen, kode) langsung ke AI tanpa storage server.

ItemNilai
MetodeBase64 data URI (inline)
Tombol (attach) di samping textarea
FormatGambar: png, jpg, gif, webp | Dokumen: pdf, txt, md | Kode: json, csv, py, js, html, css
Max ukuran10MB per file
Max file3 sekaligus
Auto-switchSaat upload file → otomatis pindah ke MiMo V2.5 Free
PreviewGambar: max 200x150px, klik untuk lightbox | File lain: icon tipe + nama
PersistGambar tetap ada setelah reload (disimpan di session JSON)

Model Selector

User dapat memilih model AI melalui dropdown di controls row. Saat upload file, model otomatis switch ke MiMo V2.5 Free (support file + gambar).

ModelFileGambarBiaya
big-pickleGratis
mimo-v2.5-freeGratis
deepseek-v4-flash-freeGratis
hy3-freeGratis
nemotron-3-ultra-freeGratis

Markdown Rendering

SyntaxOutputHTML
**teks**Bold<strong>
*teks*Italic<em>
~~teks~~Strikethrough<del>
`kode`Inline code<code>
```lang ... ```Code block.code-wrap
|header|Tabel<table>
---Garis horizontal<hr>
# HeadingBold<strong>

Gambar yang diupload dan ditampilkan di bubble chat bisa diklik untuk melihat versi besar.

ItemNilai
TriggerKlik gambar di bubble chat
TampilanOverlay gelap (z-index: 600) + gambar besar di tengah
TutupKlik × atau klik area gelap
InfoFilename + ukuran di bawah gambar
MobileResponsive, tidak buka about:blank

API Reference

Base URL: https://azissn2102.web.id

Public Endpoints

MethodEndpointDeskripsiAuth
GET/api/sessionsList sesi useruserId param
POST/api/sessionsSimpan/update sesiuserId in body
DEL/api/sessions/:idHapus sesiuserId param
POST/api/generateGenerate dokumenPublic
GET/api/documentsList dokumenPublic
DEL/api/documents/:nameHapus dokumenPublic
POST/api/generate-imageGenerate gambarPublic
POST/api/bugsKirim bug reportRate limit
GET/api/bugsList bugsPublic

Admin Endpoints

MethodEndpointDeskripsi
POST/api/admin/loginLogin, dapat token
GET/api/admin/usersList semua user
GET/api/admin/user/:uidDetail sesi user
DEL/api/admin/user/:uidHapus semua sesi
DEL/api/admin/session/:uid/:sidHapus sesi
GET/api/admin/bugreportsList bugs (admin)

Backend Proxy

MethodEndpointTarget
GET/oc/global/healthHealth check
POST/oc/sessionBuat session AI
POST/oc/session/:id/messageKirim pesan
POST/oc/session/:id/permission/:pid/replyBalas permission

Session Management

ItemNilai
Lokasi/var/www/landing-page/sessions/
FormatJSON per user: {userId}.json
User IDCookie chat_uid (auto-generated)

Format Sesi

{
  "id": "sess_abc123",
  "title": "Judul chat (maks 40 char)",
  "messages": [
    { "text": "...", "role": "user|ai", "mode": "build|plan" }
  ],
  "updatedAt": "ISO timestamp"
}

Flow

Session Data Storage

Disimpan sebagai file JSON di folder sessions/. Setiap user memiliki satu file JSON berisi array sesi.

/var/www/landing-page/sessions/{userId}.json

User ID

Server Functions

FunctionDeskripsi
getSessionsFile(userId)Return path file JSON user
loadSessions(userId)Baca dan parse file JSON
saveSessions(userId, sessions)Tulis array sesi ke file
sanitize(userId)Bersihkan userId (hanya [a-zA-Z0-9_-])

Admin Panel

ItemNilai
File/var/www/landing-page/public/admin.html
URLhttps://azissn2102.web.id/admin.html
PasswordAzisAdmin2026!
Token StoragelocalStorage (admin_token)
Token Expiry1 jam (3600 detik)

Fitur

Alur Autentikasi

  1. Buka /admin.html
  2. Cek token di localStorage
  3. Jika ada → cek validitas via GET /api/admin/users
  4. Jika valid → tampilkan panel
  5. Jika tidak → tampilkan form login
  6. Login → POST /api/admin/login → simpan token

Admin Endpoints Detail

EndpointMethodDeskripsi
/api/admin/loginPOSTLogin, dapat token 1 jam
/api/admin/usersGETList user dengan jumlah session
/api/admin/user/:userIdGETDetail semua sesi user
/api/admin/user/:userIdDELETEHapus SEMUA sesi user
/api/admin/session/:uid/:sidDELETEHapus sesi tertentu
/api/admin/bugreportsGETList semua bug reports

Backend Proxy

Status: ONLINE AI backend berjalan via systemd service. Auto-restart saat crash.

Implementasi

Fungsi proxyToOC() menggunakan req.body (sudah di-parse oleh express.json()).

function proxyToOC(targetPath, req, res) {
  const body = req.body ? Buffer.from(JSON.stringify(req.body)) : Buffer.alloc(0);
  // Forward ke 127.0.0.1:4096
  // Response di-pipe langsung
}

// Generic proxy
app.use("/oc", (req, res) => {
  proxyToOC(req.url, req, res);
});

// Permission proxy (route spesifik)
app.post("/oc/session/:id/permission/:pid/reply", ...)
Catatan Express 5 Menggunakan app.use("/oc", ...) bukan app.all("/oc/*", ...) karena Express 5 tidak mendukung wildcard * tanpa nama.

Error Handling

ErrorResponsePenyebab
ECONNREFUSED502AI backend tidak berjalan
Timeout504Request terlalu lama
EPIPE502Koneksi terputus

Permission System

ZISCODE AI meminta izin sebelum menjalankan aksi (baca file, jalankan script, dll).

Alur

User kirim pesan
  → AI proses
    → Butuh izin? → Tampilkan Permission Dialog
      → Allow (Once)    → POST reply: "once"
      → Allow (Always)  → POST reply: "always"
      → Reject          → POST reply: "reject"
    → Setelah reply → Kirim "Lanjutkan" otomatis

Response Permission dari OpenCode

{
  "parts": [{
    "type": "permission-request",
    "id": "perm_xyz123",
    "action": "read file: /etc/passwd",
    "resources": ["/etc/passwd"]
  }]
}

Reply Values

ReplyDeskripsi
onceIzinkan sekali ini saja
alwaysIzinkan untuk semua aksi serupa
rejectTolak aksi

Document Generator

User dapat generate dokumen dari respons AI dengan menekan tombol Doc atau otomatis saat pesan mengandung keyword tertentu.

ItemNilai
Tombol Doc toggle di controls row + dropdown format
FormatPDF, DOCX, HTML, ODT, RTF, EPUB
Toolpandoc 3.1.3 + pdflatex
Auto-detectKeyword: pdf, docx, proposal, dokumen, dll
Auto-generateSetelah AI respond → POST /api/generate → tampilkan badge download
Badge PDF Ready — Download
Output/var/www/landing-page/public/downloads/

Flow

  1. Klik tombol Doc → toggle aktif (hijau)
  2. Format selector muncul: [PDF] [DOCX] [HTML] [ODT] [RTF] [EPUB]
  3. User ketik pesan → kirim
  4. AI merespons → otomatis generate dokumen
  5. Badge PDF Ready muncul → klik untuk download

Server Functions

FunctionDeskripsi
loadBugs()Baca bugs.json
saveBugs(bugs)Tulis bugs.json
rateCheck(key, limit, windowMs)Rate limiting

Pandoc Commands

# PDF
pandoc file.md -o file.pdf --pdf-engine=pdflatex -V geometry:margin=1in -V fontsize=11pt

# DOCX
pandoc file.md -o file.docx

# HTML
pandoc file.md -o file.html --standalone

Bug Reporting

ItemNilai
Data File/var/www/landing-page/bugs.json
Rate Limit5 request / 60 detik per userId
Statusnew, reviewed, fixed

Fields yang Dikirim

FieldMaxDeskripsi
message500 charDeskripsi bug dari user
rawText2000 charTeks mentah pesan AI
htmlSnap3000 charSnapshot HTML pesan
userAgent-Browser info
viewport-Ukuran layar

Frontend Flow

  1. Hover pesan AI → tombol "Lapor Bug" muncul
  2. Klik → buka modal bug
  3. Isi deskripsi (opsional)
  4. Klik "Kirim Laporan"
  5. POST ke /api/bugs dengan data
  6. Toast "Laporan terkirim!" muncul 3 detik

Admin View

  1. Buka Admin Panel → tab "Bugs"
  2. List bug reports dengan status badge (new = merah)
  3. Klik → lihat detail: raw text + metadata

Image Generator

ItemNilai
Script/var/www/landing-page/public/generate.py
LibraryPython3 + Pillow (PIL)
Max Size4000 x 4000 px
Output/var/www/landing-page/public/images/
FormatPNG
# Manual execution
python3 /var/www/landing-page/public/generate.py <width> <height> <color> [filename]

ZISCODE Workspace

IDE berbasis browser untuk coding website. Akses: https://azissn2102.web.id/workspace

URL
/workspace
Editor
CodeMirror
Terminal
xterm.js
Preview
iframe
Deploy
Public URL
Mobile
Responsive

Fitur

FiturDeskripsi
Buat ProjectHTML/CSS/JS, Node.js, PHP
File TreeNavigasi file, New File/Folder, Delete
Code EditorCodeMirror 6, syntax highlighting, auto-save
Live Previewiframe render HTML, auto-refresh
Terminalxterm.js, jalankan perintah shell
Run ServerNode.js (auto-port), PHP (php -S)
DeploySymlink ke /deploy/:userId/:projectId/
AI AssistantChat dengan AI, auto-edit kode
Mobile UITab navigation, drawer, responsive

Project Types

TypeTemplateRun Command
htmlindex.html, style.css, script.jsStatic (preview only)
nodepackage.json, server.jsnode server.js (auto-port)
phpindex.php, style.cssphp -S localhost:PORT

Struktur File

/var/www/workspace/
├── projects/
│   └── {userId}/
│       └── {projectId}/
│           ├── .ziscode.json    ← Meta project
│           ├── index.html
│           ├── style.css
│           └── script.js
├── deployed/
│   └── {userId}/
│       └── {projectId}/ → symlink
└── servers/
    └── {userId}_{projectId}.pid

Workspace API

Project Endpoints

MethodEndpointDeskripsi
GET/api/workspace/projectsList project user (dengan fileCount)
POST/api/workspace/projectsBuat project baru (validasi nama duplikat)
PUT/api/workspace/projects/:id/renameRename project
POST/api/workspace/projects/:id/duplicateDuplicate project ("Name - Copy")
DEL/api/workspace/projects/:idHapus project

File Endpoints

MethodEndpointDeskripsi
GET/api/workspace/projects/:id/filesList file project
POST/api/workspace/projects/:id/newfileBuat file baru
POST/api/workspace/projects/:id/execJalankan perintah shell
POST/api/workspace/projects/:id/runJalankan Node.js/PHP server
POST/api/workspace/projects/:id/deployDeploy ke URL publik

Preview & Deploy

MethodEndpointDeskripsi
GET/preview/:projectId/:filepathPreview file project
GET/deploy/:userId/:projectId/*Serve deployed files

Mobile UI

Workspace mendukung mobile dengan tab navigation di bawah layar.

Tab Navigation

TabIconFungsi
FilesFile tree drawer
EditorCode editor (CodeMirror)
PreviewLive preview HTML
AIAI assistant chat
Terminalxterm.js terminal
RunRun output panel

Mobile Layout

┌──────────────────────────────┐
│ [←] Project Name  [▶][🚀][📁]│  ← Topbar
├──────────────────────────────┤
│                              │
│  [Editor / Preview / etc]    │  ← Active panel
│                              │
├──────────────────────────────┤
│ [Files][Editor][Preview]     │  ← Tab bar (fixed)
│ [AI][Terminal][Run]          │
└──────────────────────────────┘

Keamanan

AreaMetodeCatatan
Chat UICookie userIdAuto-generated, tidak ada login
Admin PanelPassword + TokenToken 1 jam, header X-Admin-Token
File DeletePath traversal checkBlokir .., /, \
Bug ReportRate limiting5 req/60s per userId
Image GenSize limitMaks 4000px + sanitize input
XSSescHtml()Escape <, >, &, " di semua output

Environment

ItemNilai
OSLinux (Debian/Ubuntu)
Node.jsv18+ (PM2 managed)
PythonPython 3 + Pillow
NginxReverse proxy (:80 → :8080)
SSHPort 10072
ExpressPM2 (fork mode) — Port 8080
ZISCODE AIsystemd (opencode.service) — Port 4096
VPS IP69.197.187.172
Domainazissn2102.web.id
RAM961MB total (~861MB terpakai)
CPU1 core (Intel Xeon E3-12xx v2)

Known Issues & Resolved Issues

Resolved Issues

TanggalIssuePerbaikan
22/07File Persistence hilang saat refreshSave/restore openTabs ke localStorage
22/07Tidak ada fitur duplikat projectPOST /duplicate + tombol UI
22/07Tidak ada fitur rename projectPUT /rename + tombol UI
22/07AI chat tidak auto-scrollMutationObserver + scrollIntoView
22/07AI Assistant tanpa icon/formattingRobot/user icon, code blocks, typing indicator
22/07Duplicate name validationValidasi case-insensitive saat buat/rename
21/07Preview 404 untuk Node.js projectsAuto-check public/ subfolder
21/07AI JSON Parse ErrorTangkap HTML response, timeout 3 menit
21/07Font Awesome Icons teks plainFix getFileIcon() wrapper + separator
21/07File Tree Folder tidak bisa collapsetoggleFolder() + chevron + JS display
21/07"? files" di home pageAPI menghitung fileCount
21/07Project ID tampil bukan namaAPI /files mengembalikan projectName
21/07AI chat persistlocalStorage ws_ai_{projectId}
21/07Tab persistlocalStorage ws_editor_{projectId}
20/07ZISCODE Workspace IDECodeMirror, Terminal, Preview, Deploy, AI
20/07ZISCODE brandingGanti semua referensi OpenCode
17/07Image LightboxMobile-friendly lightbox overlay
17/07File upload persistGambar tetap setelah reload
17/07Model selectorMiMo V2.5 Free support file
17/07Mobile controls rowCompact, wrap
17/07Format selector alignmentdoc-group container
16/07Proxy Express 5 fixapp.use + req.body
16/07OpenCode via systemdopencode.service
16/07Sidebar UI fixFlexbox, spacing, mobile
16/07Markdown renderingItalic, strikethrough, hr
16/07Table CSS restore.msg table styling

Remaining Issues

StatusIssueDampak
LOWPlaywright MCP aktif di produksiMemakan 93MB RAM
NOTEAI response time bervariasi1-3 menit tergantung complexity

Changelog

TanggalPerubahanFile
22/07Rename project featureserver.js, workspace.html
22/07Duplicate project featureserver.js, workspace.html
22/07File persistence (openTabs restore)editor.html
22/07AI auto-scroll (MutationObserver)editor.html
22/07Duplicate name validationserver.js
22/07docs.html comprehensive updatedocs.html
21/07AI Assistant display upgradeeditor.html
21/07File tree folder toggleeditor.html
21/07Preview/deploy route fix (public/)server.js
21/07Project name display fixserver.js, editor.html
21/07AI error handling + timeout 3 mineditor.html
21/07Font Awesome icons fixeditor.html
21/07AI chat persist (localStorage)editor.html
21/07File tabs persist (localStorage)editor.html
21/07Duplicate name validationserver.js
21/07File count displayserver.js
20/07ZISCODE Workspace IDEworkspace.html, server.js
20/07ZISCODE brandingAll files
20/07Workspace Phase 2 (Terminal, Deploy)workspace.html, server.js
17/07Document Generator toggle ( Doc)index.html
17/07Image Lightbox (mobile-friendly)index.html
17/07File upload persistindex.html
17/07Model selector (MiMo V2.5 Free)index.html
17/07Mobile controls row (compact)index.html
17/07Format selector alignment fixindex.html
17/07Update semua dokumentasi*.md, docs.html, help.html
16/07Buat dokumentasi lengkapdocs/*.md, AGENTS.md
16/07Fix proxy Express 5server.js
16/07Jalankan AI via systemdopencode.service
16/07Perbaiki sidebar UIindex.html
16/07Tambah markdown renderingindex.html
16/07Restore CSS tabelindex.html