ต้นแบบ · รุ่นทดลอง: มีทุก server ในทะเบียนทางการ อัปเดตทุก 30 นาที เข้าสู่ระบบด้วย Google เพื่อเขียนรีวิวได้แล้วต้นแบบ · อัปเดตทุก 30 นาที
PopNx MCPที่รวม MCP สำหรับคนใช้ AI · วิธีติดตั้งภาษาไทยทุกตัว

Veilfile

โดย veilfileรุ่น 1.0.1i★ 0iรันบนคลาวด์
ชื่อใน registryio.github.veilfile/veilfile

วิธีติดตั้ง

ใช้ทำอะไรได้

ยังไม่มีคำอธิบายภาษาไทย ดูข้อเท็จจริงด้านล่าง หรือเปิดคำอธิบายต้นฉบับจากผู้ทำ

  • ต่อแบบ คลาวด์ (ต่อผ่านอินเทอร์เน็ต)
  • บัญชีหรือคีย์ ต้องมี Authorization
  • หมวด เครื่องมือนักพัฒนา
คำอธิบายต้นฉบับจากผู้ทำ (อังกฤษ)
Private, expiring artifact hosting for AI agents. Upload via API or MCP; links die on their own.

ติดตั้ง

เลือกโปรแกรม AI ที่คุณใช้ แล้วคัดลอกค่าตั้งไปวาง

ผลตรวจผ่าน 4/5 · สิ่งที่คุณถามผ่านเซิร์ฟเวอร์ของผู้ทำ (veilfile.com) · ✓ ตรวจคำสั่งแล้ว 13 พ.ย. 2569

ขั้นแรก: คุณใช้ AI ตัวไหน

เลือกแอปที่คุณใช้ ขั้นตอนจะขึ้นด้านล่าง

ต่อกับ Claude ได้ · ประมาณ 5 นาที

ต้องมีคีย์ของ Veilfile (สร้างที่เว็บของผู้ทำ) · ตั้งครั้งเดียวที่ claude.ai หรือแอปบนคอม แล้วใช้ในแชตได้ · บัญชีฟรีเพิ่มได้ 1 ตัว · แผน Team/Enterprise ให้เจ้าของ (Owner) เป็นคนเพิ่ม

  1. สมัครและสร้างคีย์ของ Veilfile

    เปิดเว็บของผู้ทำ สมัครบัญชีแล้วสร้างคีย์ (API key) เก็บไว้ ใช้ในขั้นถัดไป ราคาและแผนฟรีดูที่เว็บของผู้ทำ

    เปิดเว็บของ Veilfile ↗

  2. เปิดหน้า Connectors ของ Claude

    CustomizeConnectors

    CustomizeConnectors1Add2https://…3Add4
  3. กด “Add” → “Custom” → “Web” แล้วกรอก 2 ช่องนี้

    คัดลอกจากที่นี่ไปวางในช่องชื่อเดียวกันบนหน้าจอของ Claude แล้วกด Continue

    Name · ชื่อVeilfile
    Remote MCP server URL · ที่อยู่https://veilfile.com/mcp/

    ที่หัวข้อ Request headers เพิ่มชื่อและค่านี้

    ชื่อ headerAuthorization
    ค่าBearer <วางคีย์ของคุณตรงนี้>

    วางคีย์ในช่องของแอปเท่านั้น อย่าวางในแชตหรือส่งให้ใคร

    กด Continue ผ่านหน้าตรวจการล็อกอินที่ Claude ตรวจเจอ · หัวข้อ Authentication เลือกตามที่ผู้ทำบอก (Sign in now, Sign in when needed หรือ No sign in) แล้วกด Add

  4. เปิดใช้ในแชต

    +ConnectorsVeilfile

  5. ลองเลย

    ใช้ Veilfile บอกหน่อยว่าทำอะไรให้ฉันได้บ้าง แล้วลองทำให้ดูหนึ่งอย่าง

    ✓ ถ้า Claude บอกว่ากำลังใช้ Veilfile หรือมีชื่อเครื่องมือของ Veilfile ขึ้นในคำตอบ แปลว่าต่อสำเร็จ

ชื่อเมนูตรวจกับหน้าช่วยเหลือของ Anthropic เมื่อ 11 พ.ย. 2569 · หน้าจอของคุณอาจต่างเล็กน้อยตามรุ่นของแอป

ChatGPT ยังต่อ Veilfile ไม่ได้

Veilfile ต้องใส่คีย์ส่วนตัวตอนต่อ แต่หน้าช่วยเหลือของ OpenAI พูดถึงแค่การเข้าสู่ระบบแบบ OAuth ยังไม่มีวิธีใส่คีย์ที่เราตรวจได้

คุณทำแบบนี้แทนได้

ก · ใช้แอปที่ต่อ Veilfile ได้

  • ต้องมีคีย์ของ Veilfile (สร้างที่เว็บของผู้ทำ) · ตั้งครั้งเดียวที่ claude.ai หรือแอปบนคอม แล้วใช้ในแชตได้ · บัญชีฟรีเพิ่มได้ 1 ตัว · แผน Team/Enterprise ให้เจ้าของ (Owner) เป็นคนเพิ่ม
  • ต้องมีคีย์ของ Veilfile (สร้างที่เว็บของผู้ทำ)
  • ต้องมีคีย์ของ Veilfile (สร้างที่เว็บของผู้ทำ)
  • ต้องมีคีย์ของ Veilfile (สร้างที่เว็บของผู้ทำ)

ข · ตัวอื่นในหมวด เครื่องมือนักพัฒนา ที่ต่อกับ ChatGPT ได้

เลือกจากตัวที่ใช้มากในหมวดเดียวกัน เฉพาะตัวที่ต่อด้วยที่อยู่ได้โดยไม่ต้องใส่คีย์

ต่อกับ Claude Code ได้ · ประมาณ 5 นาที

ต้องมีคีย์ของ Veilfile (สร้างที่เว็บของผู้ทำ)

  1. สมัครและสร้างคีย์ของ Veilfile

    เปิดเว็บของผู้ทำ สมัครบัญชีแล้วสร้างคีย์ (API key) เก็บไว้ ใช้ในขั้นถัดไป ราคาและแผนฟรีดูที่เว็บของผู้ทำ

    เปิดเว็บของ Veilfile ↗

  2. เปิด Terminal

    Mac: กด Command+Space พิมพ์ Terminal · Windows: เปิด PowerShell

  3. วางคำสั่งนี้แล้วกด Enter

    claude mcp add --transport http --scope user veilfile https://veilfile.com/mcp/ --header 'Authorization: Bearer ใส่ค่าของคุณ'

    แก้ “ใส่ค่าของคุณ” เป็นคีย์ของคุณก่อนกด Enter

    วางคีย์ในช่องของแอปเท่านั้น อย่าวางในแชตหรือส่งให้ใคร

  4. พิมพ์ /mcp ใน Claude Code

    ต้องเห็น Veilfile ในรายการและขึ้นว่าเชื่อมต่อแล้ว

  5. ลองเลย

    ใช้ Veilfile บอกหน่อยว่าทำอะไรให้ฉันได้บ้าง แล้วลองทำให้ดูหนึ่งอย่าง

    ✓ ถ้า Claude Code บอกว่ากำลังใช้ Veilfile หรือมีชื่อเครื่องมือของ Veilfile ขึ้นในคำตอบ แปลว่าต่อสำเร็จ

ชื่อเมนูตรวจกับหน้าช่วยเหลือของ Anthropic เมื่อ 11 พ.ย. 2569 · หน้าจอของคุณอาจต่างเล็กน้อยตามรุ่นของแอป

ต่อกับ Cursor ได้ · ประมาณ 5 นาที

ต้องมีคีย์ของ Veilfile (สร้างที่เว็บของผู้ทำ)

  1. สมัครและสร้างคีย์ของ Veilfile

    เปิดเว็บของผู้ทำ สมัครบัญชีแล้วสร้างคีย์ (API key) เก็บไว้ ใช้ในขั้นถัดไป ราคาและแผนฟรีดูที่เว็บของผู้ทำ

    เปิดเว็บของ Veilfile ↗

  2. กดปุ่มนี้เพื่อเปิด Cursor

    เปิดใน Cursor

    Cursor จะถามยืนยันการติดตั้ง ให้กด Install

  3. ใส่คีย์ในช่องที่ว่างไว้

    ในค่าตั้งของ Veilfile ช่อง Authorization ยังว่าง ใส่คีย์ของคุณแล้วบันทึก

    วางคีย์ในช่องของแอปเท่านั้น อย่าวางในแชตหรือส่งให้ใคร

  4. เปิดแชตของ AI ใน Cursor โหมด Agent

  5. ลองเลย

    ใช้ Veilfile บอกหน่อยว่าทำอะไรให้ฉันได้บ้าง แล้วลองทำให้ดูหนึ่งอย่าง

    ✓ ถ้า Cursor บอกว่ากำลังใช้ Veilfile หรือมีชื่อเครื่องมือของ Veilfile ขึ้นในคำตอบ แปลว่าต่อสำเร็จ

ชื่อเมนูตรวจกับหน้าช่วยเหลือของ Cursor เมื่อ 11 พ.ย. 2569 · หน้าจอของคุณอาจต่างเล็กน้อยตามรุ่นของแอป

ต่อกับ VS Code ได้ · ประมาณ 5 นาที

ต้องมีคีย์ของ Veilfile (สร้างที่เว็บของผู้ทำ)

  1. สมัครและสร้างคีย์ของ Veilfile

    เปิดเว็บของผู้ทำ สมัครบัญชีแล้วสร้างคีย์ (API key) เก็บไว้ ใช้ในขั้นถัดไป ราคาและแผนฟรีดูที่เว็บของผู้ทำ

    เปิดเว็บของ Veilfile ↗

  2. กดปุ่มนี้เพื่อเปิด VS Code

    เปิดใน VS Code

    VS Code จะถามยืนยันการติดตั้ง ให้กด Install

  3. ใส่คีย์ในช่องที่ว่างไว้

    ในค่าตั้งของ Veilfile ช่อง Authorization ยังว่าง ใส่คีย์ของคุณแล้วบันทึก

    วางคีย์ในช่องของแอปเท่านั้น อย่าวางในแชตหรือส่งให้ใคร

  4. เปิดแชตของ AI ใน VS Code โหมด Agent

  5. ลองเลย

    ใช้ Veilfile บอกหน่อยว่าทำอะไรให้ฉันได้บ้าง แล้วลองทำให้ดูหนึ่งอย่าง

    ✓ ถ้า VS Code บอกว่ากำลังใช้ Veilfile หรือมีชื่อเครื่องมือของ Veilfile ขึ้นในคำตอบ แปลว่าต่อสำเร็จ

ชื่อเมนูตรวจกับหน้าช่วยเหลือของ VS Code เมื่อ 11 พ.ย. 2569 · หน้าจอของคุณอาจต่างเล็กน้อยตามรุ่นของแอป

โปรแกรมอื่นที่ใช้ MCP ได้ เช่น Windsurf, Zed หรือ Gemini CLI มีวิธีเพิ่มต่างกัน ดูวิธีของแต่ละตัวในหน้ารวมโปรแกรม

ดูโปรแกรมที่ใช้ MCP ทั้งหมด →

ที่อยู่สำหรับโปรแกรมที่ต่อผ่านเว็บ

ที่อยู่https://veilfile.com/mcp/

ค่าตั้งแบบไฟล์ JSON อยู่ในหัวข้อ “สำหรับคนเขียนโค้ด” ด้านล่าง

ติดตรงไหน? ถามคนที่ใช้ Veilfile อยู่💬 พูดคุย →
สำหรับคนเขียนโค้ด: คำสั่ง Terminal และค่าตั้ง JSON

ต่อผ่านเว็บ

Claude Code

claude mcp add --transport http --scope user veilfile https://veilfile.com/mcp/ --header 'Authorization: Bearer ใส่ค่าของคุณ'

Cursor (~/.cursor/mcp.json)

{
  "mcpServers": {
    "veilfile": {
      "url": "https://veilfile.com/mcp/",
      "headers": {
        "Authorization": "Bearer ใส่ค่าของคุณ"
      }
    }
  }
}

VS Code (mcp.json)

{
  "servers": {
    "veilfile": {
      "type": "http",
      "url": "https://veilfile.com/mcp/",
      "headers": {
        "Authorization": "Bearer ใส่ค่าของคุณ"
      }
    }
  }
}

ค่าที่ต้องใส่เอง

  • Authorization ความลับ จำเป็น HTTP header
    Bearer API key, issued in the Veilfile dashboard after email verification. Shown once; store as an env var.

คำอธิบายยังเป็นภาษาอังกฤษตามต้นฉบับ

ค่าตั้งนี้สร้างจากข้อมูลใน registry ของผู้ทำ ถ้าไม่ตรงกับ README ให้เชื่อ README

สรุป

ดาวน์โหลดต่อสัปดาห์i
ไม่มียอดใน npm/PyPI
licensei
ไม่ระบุ license
การเชื่อมต่อ
รันบนคลาวด์
รุ่นล่าสุดi
1.0.1
ส่งเข้า registryi
10 พ.ย. 2569
แก้โค้ดล่าสุดi
15 พ.ย. 2569
ผู้ทำ
veilfile
เว็บผู้ทำ
veilfile.com
สถานะใน registry
ใช้งานอยู่

ใช้กับโปรแกรมไหนได้

ดูจากแบบการต่อของ server ตัวนี้ และเอกสารของผู้ทำโปรแกรมแต่ละตัว ตรวจเมื่อ 10 พ.ย. 2569

ต่อผ่านคลาวด์ได้ใน

ClaudeGooseLM StudioMsty StudioCherry StudioCursorVS Code + GitHub CopilotVisual StudioWindsurf (Devin Desktop)ZedKiroClineContinueJetBrains AI AssistantClaude CodeCodex CLIGemini CLIOpenCodenodecodeWarpLibreChatOpen WebUIRaycast

ดูโปรแกรมทั้งหมดพร้อมข้อดีข้อเสีย →

คู่มือที่เกี่ยวข้อง

ทำอะไรได้บ้าง

ชื่อและคำอธิบายเครื่องมือตามที่ server ตอบมาเมื่อ 12 พ.ย. 2569 ผู้ทำเป็นคนเขียน ไม่ใช่เรา แสดงเป็นข้อความล้วน

  • upload_artifact

    Upload a file from base64 content and return its id, its private share link as url, expires_at, size_bytes and secret_flags. The link stops working when the file expires. The decoded file can be up to 25 MiB; for larger files, create_upload_url takes the bytes by PUT instead. The

  • create_upload_url

    Create a one-time upload URL for a file too large to send as base64 through upload_artifact. The result has upload_url, expires_at, max_size_bytes (25 MiB), ttl_days and filename. The URL is valid for 15 minutes and needs no API key. A PUT of the file's raw bytes to it, for examp

  • list_artifacts

    List the files in this workspace, newest first. Each entry has id, filename, mime_type, size_bytes, url, expires_at, secret_flags and created_at. Expired files that are not yet deleted are included. The tool changes nothing.

  • revoke_artifact

    Revoke a file by its id. Its link stops working at once and the file is deleted. The result is revoked: true, or revoked: false when this workspace has no file with that id. If storage could not be reached, the result adds storage_deleted: false and a later sweep finishes the del

ผลตรวจเบื้องต้นi

เราตรวจจากข้อมูลที่ใครก็เปิดดูได้ ยังไม่ได้อ่านโค้ด ข้อที่ไม่เกี่ยวกับตัวนี้ไม่นับในตัวหาร · ตรวจเมื่อ 15 พ.ย. 2569

  • ✓ ผ่าน

    ตัวตนผู้ทำตรงกับ repo

    ชื่อใน registry ยืนยันด้วยบัญชี GitHub veilfile ซึ่งเป็นเจ้าของ repo

  • ✓ ผ่าน

    ยังมีคนดูแล

    มีการแก้โค้ดล่าสุด วันนี้

  • ! ควรระวัง

    มีสัญญาอนุญาต (license)

    GitHub อ่านชนิด license ไม่ออก ต้องเปิดไฟล์ดูเอง

  • ✓ ผ่าน

    endpoint ตอบ

    ตอบกลับใน 186 ms (HTTP 200)

  • – ไม่เกี่ยว

    ล็อกอินแบบ OAuth

    ไม่ต้องล็อกอิน

  • ✓ ผ่าน

    คำอธิบายเครื่องมือไม่มีคำสั่งแอบแฝง

    อ่านคำอธิบายเครื่องมือ 4 ตัวแล้ว ไม่พบคำสั่งแอบแฝงถึง AI

เราตรวจอะไรบ้าง → · JSON

ผู้ทำ: ขอให้ตรวจใหม่ หรือแจ้งข้อมูลผิด

พูดคุย

ถาม แชร์เคล็ดลับ หรือแจ้งว่าใช้ไม่ได้ เรียงตามที่คนกดว่ามีประโยชน์

ยังไม่มีใครโพสต์ ถามหรือแชร์เป็นคนแรกได้เลย

ข้อความในส่วนนี้เขียนโดยผู้ใช้ ไม่ใช่ทีม PopNx

เข้าสู่ระบบเพื่อโพสต์

รีวิวจากผู้ใช้

ยังไม่มีรีวิว

เข้าสู่ระบบเพื่อเขียนรีวิว

เทียบกับตัวอื่นในหมวด เครื่องมือนักพัฒนาi

  • ดาวมากกว่า 0% ของอีก 5916 ตัวในหมวดนี้
  • ส่งรุ่นใหม่เข้า registry ล่าสุดกว่า 89% ของอีก 5916 ตัวในหมวดนี้
  • ผลตรวจเบื้องต้นดีกว่าหรือเท่ากับ 50% ของอีก 5916 ตัวในหมวดนี้

เทียบกับทุก server ที่ยังใช้งานในหมวดนี้ทั้งทะเบียน ดาวนับเฉพาะเมื่อผู้ลงทะเบียนเป็นเจ้าของ repo

คำถามที่พบบ่อย

Veilfile ปลอดภัยไหม?

จากการตรวจเบื้องต้นของเรา ผ่าน 4 จาก 5 ข้อที่ตรวจได้ เรายังไม่ได้อ่านโค้ด ก่อนใส่กุญแจหรือ token ให้ดูว่า server ขอสิทธิ์อะไร และเลือกกุญแจที่ทำได้เท่าที่จำเป็น

ต้องใช้กุญแจหรือรหัสอะไรบ้าง?

ต้องใส่ค่าเหล่านี้: Authorization

ตัวนี้รันบนเครื่องหรือบนคลาวด์?

รันบนคลาวด์ของผู้ทำ ต่อผ่านอินเทอร์เน็ตได้เลย ไม่ต้องลงโปรแกรม แต่ข้อมูลที่ส่งให้จะผ่านเซิร์ฟเวอร์ของผู้ทำ

ยังมีคนดูแลอยู่ไหม?

repo บน GitHub มีการแก้โค้ดล่าสุด วันนี้ และส่งรุ่นล่าสุด (1.0.1) เข้า registry 5 วันที่ผ่านมา

ใช้กับโปรแกรมไหนได้บ้าง?

โปรแกรมที่รองรับ MCP เช่น Claude Desktop, Claude Code, Cursor และ VS Code ตัวนี้ต่อผ่าน URL จึงใช้กับโปรแกรมที่รับ remote MCP ได้ เช่น ChatGPT บนเว็บ (แบบเต็มในแผน Business ขึ้นไป · Pro แบบอ่านอย่างเดียว)

มีตัวไหนใช้แทนได้บ้าง?

ในหมวดเดียวกันมี GitDiagram, Appllama, Cloudflare MCP, Omnara, Repowise

ตัวอื่นที่ทำงานคล้ายกัน

หมวดเดียวกันจากผู้ทำคนอื่น ผ่านตัวตรวจคำสั่งแล้ว ตัวทางการขึ้นก่อน แล้วเรียงตามดาว

อ่านการ์ด:↓ ดาวน์โหลดต่อสัปดาห์i★ ดาว GitHubiสามเสา: รีวิว · ผลตรวจ · การใช้งานiอัปเดต = วันที่ส่งรุ่นล่าสุดเข้า registryi

GitDiagram

Architecture diagrams, explanations and Mermaid source for public GitHub repositories.

โดย ahmedkhaleel2004ใช้กันมาก★ 18.9Kอัปเดต 2 เดือนที่ผ่านมา

รันบนคลาวด์✓ เจ้าของบริการ · gitdiagram.comทีม PopNx ลองใช้จริงแล้ว

Appllama

Study screens, flows and paywalls from top-earning iOS apps, then build from what wins.

โดย Appllamaใช้กันมาก★ 5.2Kอัปเดต 3 เดือนที่ผ่านมา

รันบนคลาวด์✓ เจ้าของบริการ · appllama.io

Cloudflare MCP

Cloudflare MCP servers

โดย cloudflareใช้กันมาก★ 4.5Kอัปเดต 14 เดือนที่ผ่านมา

รันบนคลาวด์✓ เจ้าของบริการ · mcp.cloudflare.comทีม PopNx ลองใช้จริงแล้ว

Omnara

Deploy durable AI agents with Omnara, an open-source managed-agent platform.

โดย omnara-aiใช้กันมาก★ 3.4Kอัปเดต 2 เดือนที่ผ่านมา

รันบนคลาวด์✓ เจ้าของบริการ · omnara.com

Repowise

Codebase intelligence for AI coding agents: graph, git history, docs, decisions, code health.

โดย repowise-devใช้กันมาก↓ 6.5K/สัปดาห์★ 8.1K ดาวรวมทั้งรีโปอัปเดต เมื่อวานซืน

บนเครื่องหรือคลาวด์✓ เจ้าของบริการ · repowise.dev
  • GitDiagram — ใช้บนคลาวด์ ไม่ต้องลงเครื่อง · ไม่ต้องใช้คีย์
  • Appllama — ใช้บนคลาวด์ ไม่ต้องลงเครื่อง · ไม่ต้องใช้คีย์
  • Cloudflare MCP — ใช้บนคลาวด์ ไม่ต้องลงเครื่อง · ไม่ต้องใช้คีย์ · อยู่ในคลังของ Claude
  • Omnara — ใช้บนคลาวด์ ไม่ต้องลงเครื่อง · ไม่ต้องใช้คีย์
  • Repowise — มีทั้งบนคลาวด์และแบบลงเครื่อง · ไม่ต้องใช้คีย์

README จากผู้ทำ

เปิดอ่าน README

ส่วนนี้คัดจาก repo ของผู้ทำตามต้นฉบับ PopNx MCP ไม่ได้ตรวจหรือรับรองเนื้อหา ตัด HTML รูปภาพ และสคริปต์ออกแล้ว ลิงก์จะพาออกนอกเว็บ

Veilfile — private, ephemeral artifact hosting for AI agents

When a coding agent in CI or a cloud session produces a screenshot, log bundle, or HAR file for review, it needs a private URL to put it at — not a public repo. Veilfile is the sanctioned place: upload via API key (or MCP), get back an unguessable, expiring URL. Uploads are scanned for secret shapes and flagged (blocked only when the caller passes on_secret=reject; file contents are never logged).

  • API: POST /api/v1/artifacts (multipart, Authorization: Bearer vlf_…) → {id, url, expires_at, size_bytes, secret_flags[]}. GET /a/ serves the file (the 256-bit token *is* the auth). List (bare JSON array) and revoke endpoints included.
  • MCP: hosted server at POST /mcp (JSON-RPC over HTTP; tools upload_artifact, create_upload_url, list_artifacts, revoke_artifact), authenticated with a vlf_ key or an OAuth token.
  • CLIs: veilfile on PyPI (cli/) and npm (npm/): login (device flow), logout, status, push, pull.
  • Dashboard: signed-in pages at /app/, Django views on the same shell as the rest of the site: Overview (usage vs plan caps), Files (secret-flag notes
  • revoke), Keys (a new key is shown once), Connected apps and Billing (plan switching and the Stripe billing portal).
  • Landing page: / (public). Agent docs: /llms.txt, docs/API.md, /docs/.
  • Agents working on this repo: read AGENTS.md.

See SPEC.md for the product spec.

Plans

PlanPriceUploads/moMax TTLStorageAPI keys
Free$01007 days1 GB1
Team$4/mo2,00090 days25 GB5
Team Plus$6/mo4,00090 days40 GB10
Scale$12/mo10,000365 days100 GBunlimited
Team (yearly)$40/yr2,00090 days25 GB5
Team Plus (yearly)$60/yr4,00090 days40 GB10
Scale (yearly)$120/yr10,000365 days100 GBunlimited

Yearly billing costs ten months' price, so two months are free. A yearly plan has the same limits as the monthly one.

The source of truth is backend/drop_core/plans.py (PLANS, and ANNUAL_PRICE_USD for the yearly prices; Stripe prices live in Stripe and the STRIPE_PRICE_* variables). backend/drop_core/tests_fix_docs.py fails when a doc or template states a different price or cap.

Quickstart (local dev)

# Backend

python3 -m venv venv && ./venv/bin/pip install -r backend/requirements.txt export DJANGO_DEBUG=True DJANGO_SECRET_KEY=dev-only-key ./venv/bin/python backend/manage.py migrate ./venv/bin/python backend/manage.py createsuperuser # dashboard login ./venv/bin/python backend/manage.py runserver # :8000

Sign up at http://localhost:8000/accounts/signup/ (or log in), open /app/, create an API key, then:

curl -H "Authorization: Bearer vlf_..." \

-F "file=@screenshot.png" \ http://localhost:8000/api/v1/artifacts/

Environment variables

No secrets are committed to this repo. Copy the names below into a local .env (gitignored) or your host's env config. Billing is live in production (sk_live_..., live price IDs, Stripe Managed Payments); use a Stripe sandbox/test key only on a local or staging copy.

VariableRequiredDefaultNotes
DJANGO_SECRET_KEYprod—Required when DJANGO_DEBUG is false
DJANGO_DEBUGnoFalseSet True for local dev and for tests
DJANGO_ALLOWED_HOSTSprod—Comma-separated, e.g. veilfile.com
DJANGO_CSRF_TRUSTED_ORIGINSnoderived from DJANGO_ALLOWED_HOSTSComma-separated origins
DATABASE_URLprodsqlite (dev only)Postgres URL. Production refuses to start without it, or with a sqlite:// URL, unless DJANGO_ALLOW_SQLITE=True. User, password and name are percent-decoded; ?sslmode=... is passed to the driver
DJANGO_ALLOW_SQLITEno—True lets production mode run on SQLite on purpose (local docker run, image build)
DJANGO_CONN_MAX_AGEno60Persistent DB connection lifetime (seconds)
DROP_BASE_URLprodhttp://localhost:8000Public URL; artifact links are built from it
DROP_STORAGEnolocallocal (dev) or s3 (prod)
DROP_LOCAL_DIRnobackend/media/artifactsLocal storage root
AWS_S3_ENDPOINT_URLprod (s3)—R2 endpoint, e.g. https:// .r2.cloudflarestorage.com
AWS_S3_BUCKETprod (s3)—R2 bucket name
AWS_ACCESS_KEY_IDprod (s3)—R2 API token (access key)
AWS_SECRET_ACCESS_KEYprod (s3)—R2 API token (secret)
STRIPE_SECRET_KEYbilling—Live secret key (sk_live_…) in production
STRIPE_WEBHOOK_SECRETbilling—Signing secret (whsec_…) from the same Stripe account and mode as the secret key
STRIPE_PRICE_TEAMbilling—Price ID for the $4/mo Team plan (tax-inclusive)
STRIPE_PRICE_TEAMPLUSbilling—Price ID for the $6/mo Team Plus plan (tax-inclusive). The name has no underscore between TEAM and PLUS
STRIPE_PRICE_SCALEbilling—Price ID for the $12/mo Scale plan (tax-inclusive)
STRIPE_PRICE_TEAM_ANNUALbilling—Price ID for yearly Team billing, $40/yr (tax-inclusive)
STRIPE_PRICE_TEAMPLUS_ANNUALbilling—Price ID for yearly Team Plus billing, $60/yr (tax-inclusive). No underscore between TEAM and PLUS, as in STRIPE_PRICE_TEAMPLUS
STRIPE_PRICE_SCALE_ANNUALbilling—Price ID for yearly Scale billing, $120/yr (tax-inclusive)
STRIPE_TEAM_PORTAL_CONFIGURATIONno—Portal configuration ID (bpc_…) with plan changes off, used only for a team of more than one person while team seats are on; empty means the default portal
EMAIL_BACKENDprodconsoleSet django.core.mail.backends.smtp.EmailBackend; without SMTP no new user can verify their email, mint keys or approve CLI logins (veilfile.W001)
EMAIL_HOST, EMAIL_PORT, EMAIL_USE_TLS, EMAIL_HOST_USER, EMAIL_HOST_PASSWORDprod—SMTP settings (the live service uses Gmail SMTP)
DEFAULT_FROM_EMAILprod—From address, e.g. support@veilfile.com
EMAIL_TIMEOUTno10SMTP timeout (seconds)
VEILFILE_SAFETY_MODEnooffoff, log or enforce: SHA-256 blocklist screening of uploads. Unset is reported as veilfile.W002
VEILFILE_TEAM_SEATSnounset (off)Turns on team seats: invitations and the Members page. Leave it unset until they launch
VEILFILE_CLIENT_IP_HEADERnoCF-Connecting-IPHeader carrying the visitor IP, set (and overwritten) by Cloudflare. Used for rate limits when it holds a valid IP and the request came from a Cloudflare edge address; otherwise the X-Forwarded-For hop logic below applies. Empty disables it
VEILFILE_TRUSTED_PROXY_HOPSno2Trusted public proxy hops in front of the app. The client IP used for rate limits is the X-Forwarded-For entry that many positions from the right, after trailing private-network hops are skipped, when the last of them is a Cloudflare edge address. A request without one did not come through Cloudflare, and the last entry (the one the platform's proxy appended) is used. Confirm against real traffic before changing
DJANGO_SECURE_HSTS_SECONDSno31536000HSTS max-age on HTTPS responses
DJANGO_SECURE_HSTS_INCLUDE_SUBDOMAINS, DJANGO_SECURE_HSTS_PRELOADnoFalseTurn on only after every subdomain serves HTTPS
PORTno8000Set by the host (Render); the entrypoint falls back to 8000
WEB_CONCURRENCYno1gunicorn workers (gthread)
GUNICORN_THREADSno4Threads per worker. Each in-flight upload is held in memory; lower this on small instances
GUNICORN_TIMEOUT, GUNICORN_GRACEFUL_TIMEOUTno120, 30gunicorn timeouts (seconds)
SKIP_MIGRATEnounset1 skips migrate at boot (use with a Render pre-deploy command)
VEILFILE_FUNNEL_RETENTION_DAYSno365How long prune_funnel_events keeps funnel rows
VEILFILE_ALERT_DIRnounsetDirectory where CRITICAL safety alerts are also written as files, for an external alert bus; they always go to the log
DJANGO_TEST_ALLOW_REMOTE_DBno—Lets manage.py test run against a non-local database server (CI with a service container)

Without Stripe vars, checkout/switch/portal return 503 billing_not_configured and the dashboard shows a friendly note; everything else works.

Tests

Tests need DJANGO_DEBUG=True (the test runner refuses False) and a local database; it also forces local storage and strips STRIPE_*/AWS_*.

# Backend (the count changes; run it rather than trusting a number here)

cd backend && DJANGO_DEBUG=True DJANGO_SECRET_KEY=dev-only-key \ ../venv/bin/python manage.py test ../venv/bin/python manage.py makemigrations --check --dry-run # must report no changes

CLIs

cd npm && node --test cd cli && ../venv/bin/python -m unittest discover -s tests -t .

CI (.github/workflows/ci.yml) runs all of the above plus manage.py check --deploy, a production-settings collectstatic, and the browser checks in site-tests/ (jobs site, site-cloth, site-ink, site-reading, site-phone, site-forms, site-catalog and site-dashboard; see AGENTS.md, "Site checks") on every pull request to main (the browser checks skip a pull request that changes no page), and the backend and CLI checks on every push to it. It runs on GitHub-hosted runners, one machine for each job, with the jobs side by side (AGENTS.md, "Where CI runs").

Ops

  • Deploy: Render Docker web service (serves veilfile.com), auto-deploys every commit to main after its CI checks pass, with a paid Postgres. render.yaml mirrors it. The container runs as a non-root user. Boot sequence (backend/entrypoint.sh): migrate --noinput (skipped when SKIP_MIGRATE=1), createcachetable, a background daily housekeeping loop, then gunicorn.
  • Health check: GET /healthz returns 200 {"status":"ok"} after a SELECT 1, or 503. Set it as the Render Health Check Path.
  • Daily housekeeping: the entrypoint loop runs sweep_expired, clearsessions, cleartokens, prune_funnel_events, prune_email_ips (clears send-log IPs after 90 days) and purge_expired_cache once a day. No separate cron job is needed. Uploads also trigger a small lazy sweep.
  • TTL sweeper: python backend/manage.py sweep_expired deletes expired artifacts (files + rows). Idempotent. Prints swept=N bytes=N failed=N and exits non-zero when any storage delete failed (those rows are kept for the next run); --limit N / --time-budget SECONDS bound a run.
  • Orphaned files: python backend/manage.py reconcile_storage lists stored objects with no artifact row; --delete removes them. Run it by hand, dry run first: --delete refuses when the database looks wrong (empty artifact table, more than 20% orphans, or R2 storage without PostgreSQL) unless you pass --force after checking the db= / storage= it prints.
  • Billing resync: python backend/manage.py sync_stripe_billing (dry run; --apply to write) rebuilds workspace plans from Stripe. The Stripe setup steps are in the private ops repository.
  • Deploy checks: manage.py check --deploy reports veilfile.W001-W006 misconfigurations (also logged at ERROR by every worker at boot).
  • Local container: docker run needs DATABASE_URL=sqlite:////tmp/db.sqlite3 together with DJANGO_ALLOW_SQLITE=True (production mode otherwise refuses SQLite); /app/backend is read-only to the non-root user.
  • Storage: Render's disk is ephemeral. Production must use `DROP_STORAGE=s3` (Cloudflare R2).
  • MCP registries: launch checklist in `docs/REGISTRIES.m

ตัดมาแค่ช่วงต้น อ่านต่อใน repo