[{"data":1,"prerenderedAt":1714},["ShallowReactive",2],{"nav-docs":3,"page-/docs/webspace/examples/folder-board":964,"surround-/docs/webspace/examples/folder-board":1708,"raw-/docs/webspace/examples/folder-board":1711},[4,56,287,615,718,857,890,947],{"title":5,"path":6,"stem":7,"children":8,"page":55},"Space Builder","/getting-started","00.getting-started",[9,13,17,23,29,33,38,42,46,50],{"title":10,"path":11,"stem":12,"children":-1},"Introducing SpaceBuilder","/getting-started/overview","00.getting-started/00.overview",{"title":14,"path":15,"stem":16,"children":-1},"Create a SetFN Account","/getting-started/create-setfn-account","00.getting-started/05.create-setfn-account",{"title":18,"path":19,"stem":20,"tags":21,"children":-1},"Installing on Linux","/getting-started/install-linux","00.getting-started/10.install-linux",[22],"recommended",{"title":24,"path":25,"stem":26,"tags":27,"children":-1},"Installing with Docker","/getting-started/install-docker","00.getting-started/12.install-docker",[28],"preparing",{"title":30,"path":31,"stem":32,"children":-1},"Installing on Windows","/getting-started/install-windows","00.getting-started/14.install-windows",{"title":34,"path":35,"stem":36,"tags":37,"children":-1},"Installing on macOS","/getting-started/install-macos","00.getting-started/16.install-macos",[28],{"title":39,"path":40,"stem":41,"children":-1},"Initial Setup","/getting-started/initial-setup","00.getting-started/20.initial-setup",{"title":43,"path":44,"stem":45,"children":-1},"License Activation","/getting-started/license-activation","00.getting-started/30.license-activation",{"title":47,"path":48,"stem":49,"children":-1},"Checking Your Access Address (Local/Internal Network)","/getting-started/access-url","00.getting-started/35.access-url",{"title":51,"path":52,"stem":53,"tags":54,"children":-1},"Choosing an External Access Method","/getting-started/access-domain","00.getting-started/40.access-domain",[22],false,{"title":57,"path":58,"stem":59,"children":60,"page":-1},"Space management","/admin","10.admin",[61,64,77,135,164,201,221,234,241,270],{"title":62,"path":58,"stem":63,"children":-1},"Explore the Administrator Menus","10.admin/00.index",{"title":65,"path":66,"stem":67,"children":68,"page":55},"Admin Home","/admin/home","10.admin/00.home",[69,73],{"title":70,"path":71,"stem":72,"children":-1},"Accessing the Admin Page","/admin/home/admin-page-access","10.admin/00.home/00.admin-page-access",{"title":74,"path":75,"stem":76,"children":-1},"License Management","/admin/home/license","10.admin/00.home/20.license",{"title":78,"path":79,"stem":80,"children":81,"page":55},"User management","/admin/user-management","10.admin/10.user-management",[82,86,92,96,100,104,108,112,116,120,125,130],{"title":83,"path":84,"stem":85,"children":-1},"Set signup policy and default permissions","/admin/user-management/signup-policy","10.admin/10.user-management/02.signup-policy",{"title":87,"path":88,"stem":89,"tags":90,"children":-1},"Register signup terms","/admin/user-management/signup-terms","10.admin/10.user-management/04.signup-terms",[91],"new",{"title":93,"path":94,"stem":95,"children":-1},"Creating a User Account","/admin/user-management/invite-new-member","10.admin/10.user-management/10.invite-new-member",{"title":97,"path":98,"stem":99,"children":-1},"Editing a User Account","/admin/user-management/edit-member","10.admin/10.user-management/11.edit-member",{"title":101,"path":102,"stem":103,"children":-1},"Adding an Admin","/admin/user-management/add-new-admin","10.admin/10.user-management/12.add-new-admin",{"title":105,"path":106,"stem":107,"children":-1},"Team Management","/admin/user-management/team","10.admin/10.user-management/22.team",{"title":109,"path":110,"stem":111,"children":-1},"Level management","/admin/user-management/level","10.admin/10.user-management/24.level",{"title":113,"path":114,"stem":115,"children":-1},"Checking Access Logs","/admin/user-management/access-log","10.admin/10.user-management/30.access-log",{"title":117,"path":118,"stem":119,"children":-1},"Configure Account & Security policies","/admin/user-management/account-security","10.admin/10.user-management/32.account-security",{"title":121,"path":122,"stem":123,"tags":124,"children":-1},"Configure CAPTCHA","/admin/user-management/captcha","10.admin/10.user-management/33.captcha",[91],{"title":126,"path":127,"stem":128,"tags":129,"children":-1},"Configure notice delivery","/admin/user-management/notice-settings","10.admin/10.user-management/34.notice-settings",[91],{"title":131,"path":132,"stem":133,"tags":134,"children":-1},"Send bulk notices to members","/admin/user-management/bulk-mail","10.admin/10.user-management/36.bulk-mail",[91],{"title":136,"path":137,"stem":138,"children":139,"page":55},"Service Configuration","/admin/service-config","10.admin/20.service-config",[140,144,148,152,156,160],{"title":141,"path":142,"stem":143,"children":-1},"File Area Settings","/admin/service-config/file-area","10.admin/20.service-config/10.file-area",{"title":145,"path":146,"stem":147,"children":-1},"Webhook Settings","/admin/service-config/webhook-settings","10.admin/20.service-config/16.webhook-settings",{"title":149,"path":150,"stem":151,"children":-1},"Community Settings","/admin/service-config/community-space","10.admin/20.service-config/22.community-space",{"title":153,"path":154,"stem":155,"children":-1},"AI Chatbot Policy Settings","/admin/service-config/community-ai-chatbot","10.admin/20.service-config/24.community-ai-chatbot",{"title":157,"path":158,"stem":159,"children":-1},"Email Settings","/admin/service-config/email-settings","10.admin/20.service-config/30.email-settings",{"title":161,"path":162,"stem":163,"children":-1},"Branding Settings","/admin/service-config/brand","10.admin/20.service-config/40.brand",{"title":165,"path":166,"stem":167,"children":168},"Knowledge Services","/admin/knowledge","10.admin/30.knowledge/00.index",[169,171,177,181,185,189,193,197],{"title":170,"path":166,"stem":167,"children":-1},"Knowledge Services overview",{"title":172,"path":173,"stem":174,"children":175},"Ingestion & Indexing","/admin/knowledge/indexing","10.admin/30.knowledge/10.indexing",[176],{"title":172,"path":173,"stem":174,"children":-1},{"title":178,"path":179,"stem":180,"children":-1},"Search Management","/admin/knowledge/search","10.admin/30.knowledge/20.search",{"title":182,"path":183,"stem":184,"children":-1},"Knowledge Storage","/admin/knowledge/storage","10.admin/30.knowledge/30.storage",{"title":186,"path":187,"stem":188,"children":-1},"Operating Knowledge Storage","/admin/knowledge/storage-operations","10.admin/30.knowledge/32.storage-operations",{"title":190,"path":191,"stem":192,"children":-1},"Connect Qdrant","/admin/knowledge/qdrant","10.admin/30.knowledge/34.qdrant",{"title":194,"path":195,"stem":196,"children":-1},"Setting Up a Qdrant Server","/admin/knowledge/qdrant-server-setup","10.admin/30.knowledge/35.qdrant-server-setup",{"title":198,"path":199,"stem":200,"children":-1},"Connect Milvus","/admin/knowledge/milvus","10.admin/30.knowledge/36.milvus",{"title":202,"path":203,"stem":204,"children":205},"AI Services","/admin/ai","10.admin/35.ai/00.index",[206,208,212,217],{"title":207,"path":203,"stem":204,"children":-1},"Manage AI Services",{"title":209,"path":210,"stem":211,"children":-1},"Configure Models & Runtime","/admin/ai/models","10.admin/35.ai/10.models",{"title":213,"path":214,"stem":215,"tags":216,"children":-1},"Configure Tools & Integrations","/admin/ai/integrations","10.admin/35.ai/20.integrations",[91],{"title":218,"path":219,"stem":220,"children":-1},"Manage the MCP Server","/admin/ai/mcp","10.admin/35.ai/30.mcp",{"title":222,"path":223,"stem":224,"children":225,"page":55},"plugin","/admin/plugin","10.admin/40.plugin",[226,230],{"title":227,"path":228,"stem":229,"children":-1},"Managing Plugins","/admin/plugin/overview","10.admin/40.plugin/00.overview",{"title":231,"path":232,"stem":233,"children":-1},"Extension Plugin Settings","/admin/plugin/settings","10.admin/40.plugin/10.settings",{"title":235,"path":236,"stem":237,"children":238,"tags":240},"Review Operations & Audit Logs","/admin/operations","10.admin/45.operations/00.index",[239],{"title":235,"path":236,"stem":237,"tags":240,"children":-1},[91],{"title":242,"path":243,"stem":244,"children":245,"page":55},"Security Management","/admin/security","10.admin/50.security",[246,250,254,258,262,266],{"title":247,"path":248,"stem":249,"children":-1},"Security Overview","/admin/security/overview","10.admin/50.security/00.overview",{"title":251,"path":252,"stem":253,"children":-1},"Checking the Audit Log","/admin/security/audit-log","10.admin/50.security/05.audit-log",{"title":255,"path":256,"stem":257,"children":-1},"Block Management","/admin/security/block-management","10.admin/50.security/10.block-management",{"title":259,"path":260,"stem":261,"children":-1},"Security Settings","/admin/security/security-setting","10.admin/50.security/12.security-setting",{"title":263,"path":264,"stem":265,"children":-1},"Process pending device approvals","/admin/security/device-approvals","10.admin/50.security/14.device-approvals",{"title":267,"path":268,"stem":269,"children":-1},"IP Access Restriction","/admin/security/ip-restriction","10.admin/50.security/16.ip-restriction",{"title":271,"path":272,"stem":273,"children":274,"page":55},"System management","/admin/system-admin","10.admin/60.system-admin",[275,279,283],{"title":276,"path":277,"stem":278,"children":-1},"Device Information","/admin/system-admin/device-info","10.admin/60.system-admin/10.device-info",{"title":280,"path":281,"stem":282,"children":-1},"Server Restart and System Maintenance","/admin/system-admin/server-restart","10.admin/60.system-admin/12.server-restart",{"title":284,"path":285,"stem":286,"children":-1},"Background Services","/admin/system-admin/background-service","10.admin/60.system-admin/14.background-service",{"title":288,"path":289,"stem":290,"children":291,"page":55},"Use workspace","/workspace","20.workspace",[292,325,342,404,520,567,597],{"title":293,"path":294,"stem":295,"children":296,"page":55},"menu","/workspace/menu","20.workspace/05.menu",[297,301,305,309,313,317,321],{"title":298,"path":299,"stem":300,"children":-1},"Workspace Overview","/workspace/menu/overview","20.workspace/05.menu/00.overview",{"title":302,"path":303,"stem":304,"children":-1},"Team Space","/workspace/menu/team-space","20.workspace/05.menu/05.team-space",{"title":306,"path":307,"stem":308,"children":-1},"Client Space","/workspace/menu/client-space","20.workspace/05.menu/06.client-space",{"title":310,"path":311,"stem":312,"children":-1},"Favorites","/workspace/menu/favorites","20.workspace/05.menu/10.favorites",{"title":314,"path":315,"stem":316,"children":-1},"Recent Documents","/workspace/menu/recent","20.workspace/05.menu/20.recent",{"title":318,"path":319,"stem":320,"children":-1},"External Share","/workspace/menu/external-share","20.workspace/05.menu/30.external-share",{"title":322,"path":323,"stem":324,"children":-1},"Trash","/workspace/menu/trash","20.workspace/05.menu/40.trash",{"title":326,"path":327,"stem":328,"children":329,"page":55},"Account","/workspace/account","20.workspace/10.account",[330,334,338],{"title":331,"path":332,"stem":333,"children":-1},"Sign Up and Log In","/workspace/account/signup","20.workspace/10.account/10.signup",{"title":335,"path":336,"stem":337,"children":-1},"Resetting Your Password","/workspace/account/reset-password","20.workspace/10.account/20.reset-password",{"title":339,"path":340,"stem":341,"children":-1},"Account Settings","/workspace/account/account-settings","20.workspace/10.account/30.account-settings",{"title":343,"path":344,"stem":345,"children":346,"page":55},"folder","/workspace/folder","20.workspace/20.folder",[347,351,355,359,363,369,373,377,382,386,390,394,400],{"title":348,"path":349,"stem":350,"children":-1},"Folder Basics","/workspace/folder/basic","20.workspace/20.folder/10.basic",{"title":352,"path":353,"stem":354,"children":-1},"Creating Multiple Folders at Once","/workspace/folder/bulk-folder-creation","20.workspace/20.folder/12.bulk-folder-creation",{"title":356,"path":357,"stem":358,"children":-1},"Filter","/workspace/folder/filter","20.workspace/20.folder/13.filter",{"title":360,"path":361,"stem":362,"children":-1},"Configuring Folder View Options","/workspace/folder/folder-view-options","20.workspace/20.folder/14.folder-view-options",{"title":364,"path":365,"stem":366,"tags":367,"children":-1},"Folder Web View","/workspace/folder/folder-web-view","20.workspace/20.folder/16.folder-web-view",[368],"hot",{"title":370,"path":371,"stem":372,"children":-1},"Folder Organization","/workspace/folder/folder-organize","20.workspace/20.folder/17.folder-organize",{"title":374,"path":375,"stem":376,"children":-1},"Folder Notice (README)","/workspace/folder/folder-readme","20.workspace/20.folder/18.folder-readme",{"title":378,"path":379,"stem":380,"tags":381,"children":-1},"Exporting Folder/File Lists","/workspace/folder/folder-export","20.workspace/20.folder/20.folder-export",[368],{"title":383,"path":384,"stem":385,"children":-1},"Setting Level-Based Access Permissions","/workspace/folder/level-access-permissions","20.workspace/20.folder/24.level-access-permissions",{"title":387,"path":388,"stem":389,"children":-1},"Setting Team-Based Access Permissions","/workspace/folder/team-access-permissions","20.workspace/20.folder/26.team-access-permissions",{"title":391,"path":392,"stem":393,"children":-1},"Folder Webhooks","/workspace/folder/webhook","20.workspace/20.folder/30.webhook",{"title":395,"path":396,"stem":397,"children":398},"Configure folder knowledge indexing","/workspace/folder/knowledge-index","20.workspace/20.folder/32.knowledge-index",[399],{"title":395,"path":396,"stem":397,"children":-1},{"title":401,"path":402,"stem":403,"children":-1},"Work Automation Folder","/workspace/folder/automation","20.workspace/20.folder/40.automation",{"title":405,"path":406,"stem":407,"children":408,"page":55},"file","/workspace/file","20.workspace/30.file",[409,413,418,422,426,430,434,438,442,447,451,455,460,464,468,472,476,480,484,488,492,496,500,504,508,512,516],{"title":410,"path":411,"stem":412,"children":-1},"File Management Basics","/workspace/file/overview","20.workspace/30.file/00.overview",{"title":414,"path":415,"stem":416,"tags":417,"children":-1},"Checking the List While Viewing a File","/workspace/file/list-in-file","20.workspace/30.file/05.list-in-file",[368],{"title":419,"path":420,"stem":421,"children":-1},"Viewing and Editing Markdown and Text Files","/workspace/file/text-file-viewer","20.workspace/30.file/10.text-file-viewer",{"title":423,"path":424,"stem":425,"children":-1},"Viewing HTML Files","/workspace/file/html-viewer","20.workspace/30.file/11.html-viewer",{"title":427,"path":428,"stem":429,"children":-1},"Viewing and Editing CSV Files","/workspace/file/csv-viewer","20.workspace/30.file/12.csv-viewer",{"title":431,"path":432,"stem":433,"children":-1},"Viewing Image/Video Files","/workspace/file/image-file-viewer","20.workspace/30.file/13.image-file-viewer",{"title":435,"path":436,"stem":437,"children":-1},"Viewing Office/PDF Files","/workspace/file/office-viewer","20.workspace/30.file/14.office-viewer",{"title":439,"path":440,"stem":441,"children":-1},"Pasting Web Pages (HTML)","/workspace/file/paste-html","20.workspace/30.file/20.paste-html",{"title":443,"path":444,"stem":445,"tags":446,"children":-1},"Pasting Screenshots","/workspace/file/paste-screenshot","20.workspace/30.file/21.paste-screenshot",[368],{"title":448,"path":449,"stem":450,"children":-1},"Pasting Markdown (MD)","/workspace/file/paste-md","20.workspace/30.file/22.paste-md",{"title":452,"path":453,"stem":454,"children":-1},"Screen Recording","/workspace/file/screen-recording","20.workspace/30.file/23.screen-recording",{"title":456,"path":457,"stem":458,"tags":459,"children":-1},"Quick Note","/workspace/file/quick-note","20.workspace/30.file/24.quick-note",[91,368],{"title":461,"path":462,"stem":463,"children":-1},"File Tags","/workspace/file/file-tag","20.workspace/30.file/33.file-tag",{"title":465,"path":466,"stem":467,"children":-1},"Bulk Renaming Files","/workspace/file/bulk-name-revise","20.workspace/30.file/34.bulk-name-revise",{"title":469,"path":470,"stem":471,"children":-1},"File Conversion","/workspace/file/file-convert-overview","20.workspace/30.file/40.file-convert-overview",{"title":473,"path":474,"stem":475,"children":-1},"Template Files","/workspace/file/templates","20.workspace/30.file/41.templates",{"title":477,"path":478,"stem":479,"children":-1},"To-Do List","/workspace/file/template-todo","20.workspace/30.file/42.template-todo",{"title":481,"path":482,"stem":483,"children":-1},"Approval Form","/workspace/file/template-approval","20.workspace/30.file/43.template-approval",{"title":485,"path":486,"stem":487,"children":-1},"Kanban Board","/workspace/file/template-kanban","20.workspace/30.file/44.template-kanban",{"title":489,"path":490,"stem":491,"children":-1},"Timeline","/workspace/file/template-timeline","20.workspace/30.file/45.template-timeline",{"title":493,"path":494,"stem":495,"children":-1},"Memo","/workspace/file/template-memo","20.workspace/30.file/46.template-memo",{"title":497,"path":498,"stem":499,"children":-1},"AI Chat File","/workspace/file/ai-chat-file","20.workspace/30.file/47.ai-chat-file",{"title":501,"path":502,"stem":503,"children":-1},"Checking the File Change History","/workspace/file/audit-trail","20.workspace/30.file/50.audit-trail",{"title":505,"path":506,"stem":507,"children":-1},"File Version Control","/workspace/file/version-trail","20.workspace/30.file/51.version-trail",{"title":509,"path":510,"stem":511,"children":-1},"Edit Lock","/workspace/file/file-lock","20.workspace/30.file/52.file-lock",{"title":513,"path":514,"stem":515,"children":-1},"File Encryption","/workspace/file/file-encrypt","20.workspace/30.file/53.file-encrypt",{"title":517,"path":518,"stem":519,"children":-1},"Register disk files","/workspace/file/disk-file-registration","20.workspace/30.file/60.disk-file-registration",{"title":521,"path":522,"stem":523,"children":524,"page":55},"Collaboration","/workspace/cooperation","20.workspace/35.cooperation",[525,529,533,537,542,546,550,554,559,563],{"title":526,"path":527,"stem":528,"children":-1},"File/Folder Comments","/workspace/cooperation/file-comments","20.workspace/35.cooperation/00.file-comments",{"title":530,"path":531,"stem":532,"children":-1},"Chat","/workspace/cooperation/chat","20.workspace/35.cooperation/10.chat",{"title":534,"path":535,"stem":536,"children":-1},"Collaboration Chat and Edit Lock","/workspace/cooperation/collaboration-chat","20.workspace/35.cooperation/11.collaboration-chat",{"title":538,"path":539,"stem":540,"tags":541,"children":-1},"Following a Team Member's Location","/workspace/cooperation/follow-team-location","20.workspace/35.cooperation/12.follow-team-location",[368],{"title":543,"path":544,"stem":545,"children":-1},"Mentions","/workspace/cooperation/mention","20.workspace/35.cooperation/14.mention",{"title":547,"path":548,"stem":549,"children":-1},"Direct Messages","/workspace/cooperation/dm","20.workspace/35.cooperation/16.dm",{"title":551,"path":552,"stem":553,"children":-1},"Notification Inbox","/workspace/cooperation/notification-inbox","20.workspace/35.cooperation/18.notification-inbox",{"title":555,"path":556,"stem":557,"tags":558,"children":-1},"Checking Team Activity","/workspace/cooperation/file-activity","20.workspace/35.cooperation/30.file-activity",[368],{"title":560,"path":561,"stem":562,"children":-1},"Creating an External Share Link","/workspace/cooperation/share-link-creation","20.workspace/35.cooperation/40.share-link-creation",{"title":564,"path":565,"stem":566,"children":-1},"Sending an External Share Link by Email","/workspace/cooperation/share-link-email","20.workspace/35.cooperation/42.share-link-email",{"title":568,"path":569,"stem":570,"children":571,"page":55},"Search","/workspace/search","20.workspace/40.search",[572,576,581,585,589,593],{"title":573,"path":574,"stem":575,"children":-1},"File Search","/workspace/search/search","20.workspace/40.search/00.search",{"title":577,"path":578,"stem":579,"tags":580,"children":-1},"Context Search (AI Search)","/workspace/search/context-search","20.workspace/40.search/10.context-search",[368],{"title":582,"path":583,"stem":584,"children":-1},"Image Search","/workspace/search/image-search","20.workspace/40.search/20.image-search",{"title":586,"path":587,"stem":588,"children":-1},"Chat Search","/workspace/search/chat-search","20.workspace/40.search/30.chat-search",{"title":590,"path":591,"stem":592,"children":-1},"Comment Search","/workspace/search/comment-search","20.workspace/40.search/40.comment-search",{"title":594,"path":595,"stem":596,"children":-1},"Synonym Search","/workspace/search/synonym-search","20.workspace/40.search/50.synonym-search",{"title":598,"path":599,"stem":600,"children":601,"page":55},"AI","/workspace/ai","20.workspace/50.ai",[602,606,611],{"title":603,"path":604,"stem":605,"children":-1},"AI Features Summary","/workspace/ai/overview","20.workspace/50.ai/00.overview",{"title":607,"path":608,"stem":609,"tags":610,"children":-1},"Requesting Work from the Local AI","/workspace/ai/ai-work","20.workspace/50.ai/10.ai-work",[368],{"title":612,"path":613,"stem":614,"children":-1},"Using External AI","/workspace/ai/external-ai","20.workspace/50.ai/20.external-ai",{"title":616,"path":617,"stem":618,"children":619,"page":55},"Webspace","/webspace","40.webspace",[620,624,628,632,636,640,645,649,653,657,661,690],{"title":621,"path":622,"stem":623,"children":-1},"What is WebSpace?","/webspace/overview","40.webspace/00.overview",{"title":625,"path":626,"stem":627,"children":-1},"Deploying a Website","/webspace/website-release","40.webspace/10.website-release",{"title":629,"path":630,"stem":631,"children":-1},"Create a schema file (.sfn)","/webspace/create-database","40.webspace/20.create-database",{"title":633,"path":634,"stem":635,"children":-1},"Build APIs and deploy a database","/webspace/api-overview","40.webspace/24.api-overview",{"title":637,"path":638,"stem":639,"children":-1},"Checking the Frontend Sample","/webspace/frontend-example","40.webspace/26.frontend-example",{"title":641,"path":642,"stem":643,"tags":644,"children":-1},"Building an Internal Team Web Service","/webspace/internal-webservice","40.webspace/32.internal-webservice",[368],{"title":646,"path":647,"stem":648,"children":-1},"Building a Publicly Accessible Web Service","/webspace/external-webservice","40.webspace/34.external-webservice",{"title":650,"path":651,"stem":652,"children":-1},"Import and export SQL","/webspace/sql-converter","40.webspace/42.sql-converter",{"title":654,"path":655,"stem":656,"children":-1},"Developer Tip 2: Code Converter","/webspace/code-converter","40.webspace/44.code-converter",{"title":658,"path":659,"stem":660,"children":-1},"Performance and scaling","/webspace/performance","40.webspace/48.performance",{"title":662,"path":663,"stem":664,"children":665,"page":55},"Webspace Management","/webspace/admin","40.webspace/50.admin",[666,670,674,678,682,686],{"title":667,"path":668,"stem":669,"children":-1},"Get started with WebSpace administration","/webspace/admin/overview","40.webspace/50.admin/00.overview",{"title":671,"path":672,"stem":673,"children":-1},"Operations","/webspace/admin/operations","40.webspace/50.admin/10.operations",{"title":675,"path":676,"stem":677,"children":-1},"Workspace access","/webspace/admin/workspace-access","40.webspace/50.admin/20.workspace-access",{"title":679,"path":680,"stem":681,"children":-1},"API & site security","/webspace/admin/api-site-security","40.webspace/50.admin/30.api-site-security",{"title":683,"path":684,"stem":685,"children":-1},"Services and capacity","/webspace/admin/service-capacity","40.webspace/50.admin/40.service-capacity",{"title":687,"path":688,"stem":689,"children":-1},"Deployment management and frontend releases","/webspace/admin/deployments","40.webspace/50.admin/50.deployments",{"title":691,"path":692,"stem":693,"children":694,"page":55},"Try WebSpace","/webspace/examples","40.webspace/60.examples",[695,699,703,708,713],{"title":696,"path":697,"stem":698,"children":-1},"WebSpace examples","/webspace/examples/overview","40.webspace/60.examples/00.overview",{"title":700,"path":701,"stem":702,"children":-1},"Build a real-time Gomoku game","/webspace/examples/realtime-gomoku","40.webspace/60.examples/20.realtime-gomoku",{"title":704,"path":705,"stem":706,"tags":707,"children":-1},"Build a resource board from folder files","/webspace/examples/folder-board","40.webspace/60.examples/30.folder-board",[91],{"title":709,"path":710,"stem":711,"tags":712,"children":-1},"Build a shared monster raid","/webspace/examples/monster-raid","40.webspace/60.examples/40.monster-raid",[91],{"title":714,"path":715,"stem":716,"tags":717,"children":-1},"Deploy an AI support chat sample","/webspace/examples/ai-support-chat","40.webspace/60.examples/50.ai-support-chat",[91],{"title":719,"path":720,"stem":721,"children":722,"page":55},"Using plugin","/plugin","50.plugin",[723,727,744,788,806,836],{"title":724,"path":725,"stem":726,"children":-1},"Plugin Overview","/plugin/overview","50.plugin/00.overview",{"title":728,"path":729,"stem":730,"children":731,"page":55},"Calendar","/plugin/calendar","50.plugin/10.calendar",[732,736,740],{"title":733,"path":734,"stem":735,"children":-1},"Calendar Introduction","/plugin/calendar/overview","50.plugin/10.calendar/00.overview",{"title":737,"path":738,"stem":739,"children":-1},"Creating, Editing, and Deleting Events","/plugin/calendar/create-event","50.plugin/10.calendar/10.create-event",{"title":741,"path":742,"stem":743,"children":-1},"Checking Activity History","/plugin/calendar/file-activity","50.plugin/10.calendar/40.file-activity",{"title":745,"path":746,"stem":747,"children":748,"page":55},"Email","/plugin/email","50.plugin/20.email",[749,753,756,760,764,768,772,776,780,784],{"title":750,"path":751,"stem":752,"children":-1},"Email Introduction","/plugin/email/overview","50.plugin/20.email/00.overview",{"title":157,"path":754,"stem":755,"children":-1},"/plugin/email/setfn-email-setting","50.plugin/20.email/05.setfn-email-setting",{"title":757,"path":758,"stem":759,"children":-1},"Connect an External Email Account","/plugin/email/external-email","50.plugin/20.email/07.external-email",{"title":761,"path":762,"stem":763,"children":-1},"Basic Email Functionality","/plugin/email/email-basic","50.plugin/20.email/10.email-basic",{"title":765,"path":766,"stem":767,"children":-1},"Composing and Sending Email","/plugin/email/email-compose","50.plugin/20.email/20.email-compose",{"title":769,"path":770,"stem":771,"children":-1},"Attaching Files","/plugin/email/email-attachment","50.plugin/20.email/30.email-attachment",{"title":773,"path":774,"stem":775,"children":-1},"Mail Folder Management","/plugin/email/email-folders","50.plugin/20.email/40.email-folders",{"title":777,"path":778,"stem":779,"children":-1},"Automatic Email Classification","/plugin/email/email-auto-classify","50.plugin/20.email/50.email-auto-classify",{"title":781,"path":782,"stem":783,"children":-1},"Email File Archiving and Sharing","/plugin/email/email-open-in-space","50.plugin/20.email/60.email-open-in-space",{"title":785,"path":786,"stem":787,"children":-1},"Email Security","/plugin/email/email-security","50.plugin/20.email/70.email-security",{"title":789,"path":790,"stem":791,"children":792,"page":55},"Workflow","/plugin/workflow","50.plugin/30.workflow",[793,797,802],{"title":794,"path":795,"stem":796,"children":-1},"Workflow Introduction","/plugin/workflow/overview","50.plugin/30.workflow/00.overview",{"title":798,"path":799,"stem":800,"tags":801,"children":-1},"Creating a New Workflow","/plugin/workflow/new-workflow","50.plugin/30.workflow/10.new-workflow",[368],{"title":803,"path":804,"stem":805,"children":-1},"Checking Execution History","/plugin/workflow/execution-history","50.plugin/30.workflow/20.execution-history",{"title":807,"path":808,"stem":809,"children":810,"page":55},"Pinetuning (AI learning)","/plugin/fine-tuning","50.plugin/40.fine-tuning",[811,816,820,824,828,832],{"title":812,"path":813,"stem":814,"tags":815,"children":-1},"Fine-tuning Introduction","/plugin/fine-tuning/overview","50.plugin/40.fine-tuning/00.overview",[368],{"title":817,"path":818,"stem":819,"children":-1},"Preprocessing Training Data","/plugin/fine-tuning/pre-processing","50.plugin/40.fine-tuning/10.pre-processing",{"title":821,"path":822,"stem":823,"children":-1},"Training","/plugin/fine-tuning/training","50.plugin/40.fine-tuning/20.training",{"title":825,"path":826,"stem":827,"children":-1},"Evaluation","/plugin/fine-tuning/evaluation","50.plugin/40.fine-tuning/30.evaluation",{"title":829,"path":830,"stem":831,"children":-1},"Chat Test","/plugin/fine-tuning/chat-test","50.plugin/40.fine-tuning/40.chat-test",{"title":833,"path":834,"stem":835,"children":-1},"Export","/plugin/fine-tuning/export","50.plugin/40.fine-tuning/50.export",{"title":837,"path":838,"stem":839,"children":840,"page":55},"EDC (data collection)","/plugin/edc","50.plugin/50.edc",[841,845,849,853],{"title":842,"path":843,"stem":844,"children":-1},"EDC Introduction","/plugin/edc/overview","50.plugin/50.edc/00.overview",{"title":846,"path":847,"stem":848,"children":-1},"Data Entry, Audit Trail","/plugin/edc/data-entry","50.plugin/50.edc/10.data-entry",{"title":850,"path":851,"stem":852,"children":-1},"Builder","/plugin/edc/builder","50.plugin/50.edc/20.builder",{"title":854,"path":855,"stem":856,"children":-1},"User/Site Settings","/plugin/edc/account","50.plugin/50.edc/30.account",{"title":858,"path":859,"stem":860,"children":861,"page":55},"FAQ","/faq","99.FAQ",[862,866,870,874,878,882,886],{"title":863,"path":864,"stem":865,"children":-1},"SetFN vs Cloud Services Comparison","/faq/comparison-cloud","99.FAQ/10.comparison-cloud",{"title":867,"path":868,"stem":869,"children":-1},"SetFN vs NAS Comparison","/faq/comparison-nas","99.FAQ/20.comparison-nas",{"title":871,"path":872,"stem":873,"children":-1},"Security Policy","/faq/security-policy","99.FAQ/30.security-policy",{"title":875,"path":876,"stem":877,"children":-1},"Why Is SetFN Fast","/faq/why-fast","99.FAQ/40.why-fast",{"title":879,"path":880,"stem":881,"children":-1},"License FAQ","/faq/license-faq","99.FAQ/50.license-faq",{"title":883,"path":884,"stem":885,"children":-1},"AI Features FAQ","/faq/ai-faq","99.FAQ/60.ai-faq",{"title":887,"path":888,"stem":889,"children":-1},"Troubleshooting Guide","/faq/troubleshooting","99.FAQ/70.troubleshooting",{"title":891,"path":892,"stem":893,"children":894,"page":55},"Applied (draft)","/draft","draft",[895,899,903,907,911,915,919,923,927,931,935,939,943],{"title":896,"path":897,"stem":898,"children":-1},"Example 1. Building an Introduction Page","/draft/static-intro","draft/05.static-intro",{"title":900,"path":901,"stem":902,"children":-1},"Example 2. Building a Notice Board","/draft/public-notice-board","draft/07.public-notice-board",{"title":904,"path":905,"stem":906,"children":-1},"Example 3. Building a Coffee Chat Booking System","/draft/coffee-chat-booking","draft/08.coffee-chat-booking",{"title":908,"path":909,"stem":910,"children":-1},"Example 4. Building a Leave Request System","/draft/leave-request","draft/09.leave-request",{"title":912,"path":913,"stem":914,"children":-1},"Example 5. Building Real-Time Team Chat","/draft/team-chat","draft/10.team-chat",{"title":916,"path":917,"stem":918,"children":-1},"Example 6. Building a Job Application Intake","/draft/client-submission","draft/11.client-submission",{"title":920,"path":921,"stem":922,"children":-1},"Example 7. Building an Issue Tracker with Team and Level Conditions","/draft/crm-basic","draft/12.crm-basic",{"title":924,"path":925,"stem":926,"children":-1},"Example 8. Building a Status Filter and Stats Summary Screen","/draft/crm-search-filter","draft/13.crm-search-filter",{"title":928,"path":929,"stem":930,"children":-1},"Example 9. Building Real-Time Community Chat with Moderation","/draft/community-moderation","draft/14.community-moderation",{"title":932,"path":933,"stem":934,"children":-1},"Example 10. Building a Real-Time Attendance Check / Poll","/draft/attendance-poll","draft/15.attendance-poll",{"title":936,"path":937,"stem":938,"children":-1},"Example 11. Building a Debate Battle","/draft/debate-battle","draft/16.debate-battle",{"title":940,"path":941,"stem":942,"children":-1},"Example 13. Building an Announcement Read Receipt","/draft/announcement-read","draft/18.announcement-read",{"title":944,"path":945,"stem":946,"children":-1},"Example 14. Building an Inventory Management System","/draft/inventory-management","draft/19.inventory-management",{"title":948,"path":949,"stem":950,"children":951,"page":55},"SJAUTO","/sjauto","sjauto",[952,956,960],{"title":953,"path":954,"stem":955,"children":-1},"Access the Administrator Page","/sjauto/admin-page-access","sjauto/00.admin-page-access",{"title":957,"path":958,"stem":959,"children":-1},"Sign Up and Sign In","/sjauto/signup","sjauto/10.signup",{"title":961,"path":962,"stem":963,"children":-1},"AI Chat Files","/sjauto/ai-chat-file","sjauto/ai-chat-file",{"id":965,"title":704,"body":966,"cover":1690,"description":1691,"extension":1692,"image":1690,"meta":1693,"navigation":1695,"path":705,"seo":1696,"stem":706,"tags":1706,"thumbnail":1690,"__hash__":1707},"docs_en/40.webspace/60.examples/30.folder-board.md",{"type":967,"value":968,"toc":1681},"minimal",[969,973,982,987,1003,1014,1024,1028,1047,1109,1112,1183,1218,1222,1256,1260,1263,1412,1434,1437,1532,1538,1559,1563,1573,1579,1591,1595,1646,1652,1656,1677],[970,971,704],"h1",{"id":972},"build-a-resource-board-from-folder-files",[974,975,976,977,981],"p",{},"This example stores Markdown documents and images in ",[978,979,980],"code",{},"books/guide",", then uses Webspace to provide a file list and the selected file's contents. The folder remains the source of the resources, so you do not need to copy each document into a database.",[983,984,986],"h2",{"id":985},"before-you-begin","Before you begin",[988,989,990,994,1000],"ul",{},[991,992,993],"li",{},"You need permission to deploy schemas and APIs.",[991,995,996,997,999],{},"Prepare the files to publish in ",[978,998,980],{},".",[991,1001,1002],{},"Set the endpoint's read permission for the intended audience.",[974,1004,1005,1006,1009,1010,1013],{},"This example serves only ",[978,1007,1008],{},".md"," and ",[978,1011,1012],{},".png"," files and does not scan subdirectories.",[1015,1016,1022],"pre",{"className":1017,"code":1019,"language":1020,"meta":1021},[1018],"language-text","books/\n└── guide/\n    ├── getting-started.md\n    ├── permissions.md\n    └── permissions.png\n","text","",[978,1023,1019],{"__ignoreMap":1021},[983,1025,1027],{"id":1026},"configure-a-directory-endpoint","Configure a directory endpoint",[974,1029,1030,1031,1034,1035,1038,1039,1042,1043,1046],{},"This example uses ",[978,1032,1033],{},"guide"," as the ",[978,1036,1037],{},"Database identifier",", ",[978,1040,1041],{},"assets"," as the table name, and ",[978,1044,1045],{},"content"," as the custom path.",[1048,1049,1050,1056,1065,1070,1080,1088,1099,1106],"ol",{},[991,1051,1052,1053,999],{},"Open the schema file and select ",[978,1054,1055],{},"API Build",[991,1057,1058,1059,1061,1062,999],{},"On the ",[978,1060,1041],{}," table, select ",[978,1063,1064],{},"Add static file API",[991,1066,1067,1068,1046],{},"Enter ",[978,1069,1045],{},[991,1071,1072,1073,1076,1077,999],{},"Under ",[978,1074,1075],{},"Source type",", select ",[978,1078,1079],{},"Folder list · file content",[991,1081,1072,1082,1085,1086,999],{},[978,1083,1084],{},"Choose folder",", choose ",[978,1087,980],{},[991,1089,1090,1091,1009,1093,1095,1096,999],{},"Add ",[978,1092,1008],{},[978,1094,1012],{}," under ",[978,1097,1098],{},"Allowed extensions",[991,1100,1101,1102,1105],{},"Enable ",[978,1103,1104],{},"Include subfolders"," only if you want to serve subdirectories. Leave it disabled for this example.",[991,1107,1108],{},"Configure the endpoint permission for the board's intended audience.",[974,1110,1111],{},"The resulting static-file contract is:",[1015,1113,1117],{"className":1114,"code":1115,"language":1116,"meta":1021,"style":1021},"language-json shiki shiki-themes github-light github-dark monokai","{\n  \"mode\": \"directory\",\n  \"extensions\": [\".md\", \".png\"],\n  \"recursive\": false\n}\n","json",[978,1118,1119,1128,1145,1165,1177],{"__ignoreMap":1021},[1120,1121,1124],"span",{"class":1122,"line":1123},"line",1,[1120,1125,1127],{"class":1126},"sMOD_","{\n",[1120,1129,1131,1135,1138,1142],{"class":1122,"line":1130},2,[1120,1132,1134],{"class":1133},"s-m8C","  \"mode\"",[1120,1136,1137],{"class":1126},": ",[1120,1139,1141],{"class":1140},"sCZoN","\"directory\"",[1120,1143,1144],{"class":1126},",\n",[1120,1146,1148,1151,1154,1157,1159,1162],{"class":1122,"line":1147},3,[1120,1149,1150],{"class":1133},"  \"extensions\"",[1120,1152,1153],{"class":1126},": [",[1120,1155,1156],{"class":1140},"\".md\"",[1120,1158,1038],{"class":1126},[1120,1160,1161],{"class":1140},"\".png\"",[1120,1163,1164],{"class":1126},"],\n",[1120,1166,1168,1171,1173],{"class":1122,"line":1167},4,[1120,1169,1170],{"class":1133},"  \"recursive\"",[1120,1172,1137],{"class":1126},[1120,1174,1176],{"class":1175},"s7F3e","false\n",[1120,1178,1180],{"class":1122,"line":1179},5,[1120,1181,1182],{"class":1126},"}\n",[974,1184,1185,1188,1189,1191,1192,1195,1196,1199,1200,1203,1204,1207,1208,1210,1211,1213,1214,1217],{},[978,1186,1187],{},"mode"," is either ",[978,1190,405],{}," for one file or ",[978,1193,1194],{},"directory"," for a folder. ",[978,1197,1198],{},"extensions"," is the allowlist of file extensions that the endpoint can return. When ",[978,1201,1202],{},"recursive"," is ",[978,1205,1206],{},"false",", the list contains only files directly under ",[978,1209,980],{},". Set ",[978,1212,1202],{}," to ",[978,1215,1216],{},"true"," to serve files in subdirectories as well.",[983,1219,1221],{"id":1220},"deploy-the-api","Deploy the API",[1048,1223,1224,1231,1244,1250],{},[991,1225,1226,1227,1230],{},"In the fixed deployment bar at the bottom of the screen, select ",[978,1228,1229],{},"Deploy"," to expand the panel upward. This first selection does not deploy the API.",[991,1232,1067,1233,1095,1235,1237,1238,1009,1241,999],{},[978,1234,1033],{},[978,1236,1037],{},", then review ",[978,1239,1240],{},"Storage engine mode",[978,1242,1243],{},"Client deployment path",[991,1245,1246,1247,1249],{},"Select ",[978,1248,1229],{}," again inside the expanded panel.",[991,1251,1252,1253,999],{},"After deployment, verify the listing at ",[978,1254,1255],{},"/api/web/guide/assets/content",[983,1257,1259],{"id":1258},"load-the-file-list","Load the file list",[974,1261,1262],{},"A request to the directory endpoint without a file parameter returns a JSON listing.",[1015,1264,1266],{"className":1114,"code":1265,"language":1116,"meta":1021,"style":1021},"{\n  \"items\": [\n    {\n      \"name\": \"getting-started.md\",\n      \"path\": \"getting-started.md\",\n      \"size\": 1842,\n      \"mimeType\": \"text/markdown; charset=utf-8\",\n      \"modifiedAt\": \"2026-10-02T09:30:00Z\",\n      \"url\": \"/api/web/guide/assets/content?file=getting-started.md\"\n    }\n  ],\n  \"total\": 3,\n  \"offset\": 0,\n  \"limit\": 20\n}\n",[978,1267,1268,1272,1280,1285,1297,1308,1321,1334,1347,1358,1364,1370,1383,1396,1407],{"__ignoreMap":1021},[1120,1269,1270],{"class":1122,"line":1123},[1120,1271,1127],{"class":1126},[1120,1273,1274,1277],{"class":1122,"line":1130},[1120,1275,1276],{"class":1133},"  \"items\"",[1120,1278,1279],{"class":1126},": [\n",[1120,1281,1282],{"class":1122,"line":1147},[1120,1283,1284],{"class":1126},"    {\n",[1120,1286,1287,1290,1292,1295],{"class":1122,"line":1167},[1120,1288,1289],{"class":1133},"      \"name\"",[1120,1291,1137],{"class":1126},[1120,1293,1294],{"class":1140},"\"getting-started.md\"",[1120,1296,1144],{"class":1126},[1120,1298,1299,1302,1304,1306],{"class":1122,"line":1179},[1120,1300,1301],{"class":1133},"      \"path\"",[1120,1303,1137],{"class":1126},[1120,1305,1294],{"class":1140},[1120,1307,1144],{"class":1126},[1120,1309,1311,1314,1316,1319],{"class":1122,"line":1310},6,[1120,1312,1313],{"class":1133},"      \"size\"",[1120,1315,1137],{"class":1126},[1120,1317,1318],{"class":1175},"1842",[1120,1320,1144],{"class":1126},[1120,1322,1324,1327,1329,1332],{"class":1122,"line":1323},7,[1120,1325,1326],{"class":1133},"      \"mimeType\"",[1120,1328,1137],{"class":1126},[1120,1330,1331],{"class":1140},"\"text/markdown; charset=utf-8\"",[1120,1333,1144],{"class":1126},[1120,1335,1337,1340,1342,1345],{"class":1122,"line":1336},8,[1120,1338,1339],{"class":1133},"      \"modifiedAt\"",[1120,1341,1137],{"class":1126},[1120,1343,1344],{"class":1140},"\"2026-10-02T09:30:00Z\"",[1120,1346,1144],{"class":1126},[1120,1348,1350,1353,1355],{"class":1122,"line":1349},9,[1120,1351,1352],{"class":1133},"      \"url\"",[1120,1354,1137],{"class":1126},[1120,1356,1357],{"class":1140},"\"/api/web/guide/assets/content?file=getting-started.md\"\n",[1120,1359,1361],{"class":1122,"line":1360},10,[1120,1362,1363],{"class":1126},"    }\n",[1120,1365,1367],{"class":1122,"line":1366},11,[1120,1368,1369],{"class":1126},"  ],\n",[1120,1371,1373,1376,1378,1381],{"class":1122,"line":1372},12,[1120,1374,1375],{"class":1133},"  \"total\"",[1120,1377,1137],{"class":1126},[1120,1379,1380],{"class":1175},"3",[1120,1382,1144],{"class":1126},[1120,1384,1386,1389,1391,1394],{"class":1122,"line":1385},13,[1120,1387,1388],{"class":1133},"  \"offset\"",[1120,1390,1137],{"class":1126},[1120,1392,1393],{"class":1175},"0",[1120,1395,1144],{"class":1126},[1120,1397,1399,1402,1404],{"class":1122,"line":1398},14,[1120,1400,1401],{"class":1133},"  \"limit\"",[1120,1403,1137],{"class":1126},[1120,1405,1406],{"class":1175},"20\n",[1120,1408,1410],{"class":1122,"line":1409},15,[1120,1411,1182],{"class":1126},[974,1413,1414,1415,1418,1419,1422,1423,1426,1427,1009,1430,1433],{},"Use ",[978,1416,1417],{},"name"," as the list label and ",[978,1420,1421],{},"url"," when the reader selects a file. ",[978,1424,1425],{},"total"," is the full result count, while ",[978,1428,1429],{},"offset",[978,1431,1432],{},"limit"," describe the returned page.",[974,1435,1436],{},"The endpoint supports these listing queries:",[1438,1439,1440,1456],"table",{},[1441,1442,1443],"thead",{},[1444,1445,1446,1450,1453],"tr",{},[1447,1448,1449],"th",{},"Query",[1447,1451,1452],{},"Example",[1447,1454,1455],{},"Purpose",[1457,1458,1459,1475,1490,1504,1518],"tbody",{},[1444,1460,1461,1467,1472],{},[1462,1463,1464],"td",{},[978,1465,1466],{},"q",[1462,1468,1469],{},[978,1470,1471],{},"q=permission",[1462,1473,1474],{},"Search file names.",[1444,1476,1477,1482,1487],{},[1462,1478,1479],{},[978,1480,1481],{},"order",[1462,1483,1484],{},[978,1485,1486],{},"order=name:asc",[1462,1488,1489],{},"Sort by name in ascending order.",[1444,1491,1492,1496,1501],{},[1462,1493,1494],{},[978,1495,1481],{},[1462,1497,1498],{},[978,1499,1500],{},"order=modifiedAt:desc",[1462,1502,1503],{},"Show recently modified files first.",[1444,1505,1506,1510,1515],{},[1462,1507,1508],{},[978,1509,1429],{},[1462,1511,1512],{},[978,1513,1514],{},"offset=20",[1462,1516,1517],{},"Skip a number of files.",[1444,1519,1520,1524,1529],{},[1462,1521,1522],{},[978,1523,1432],{},[1462,1525,1526],{},[978,1527,1528],{},"limit=20",[1462,1530,1531],{},"Set the number of files to return.",[1015,1533,1536],{"className":1534,"code":1535,"language":1020,"meta":1021},[1018],"GET /api/web/guide/assets/content?q=permission&order=modifiedAt:desc&offset=0&limit=20\n",[978,1537,1535],{"__ignoreMap":1021},[974,1539,1540,1541,1543,1544,1546,1547,1549,1550,1203,1552,1555,1556,1558],{},"When ",[978,1542,1432],{}," is omitted, the endpoint returns 50 items. The maximum is 200 per request. For a larger folder, check ",[978,1545,1425],{}," and increase ",[978,1548,1429],{}," to request the next page. The default ",[978,1551,1481],{},[978,1553,1554],{},"name:asc",", and ",[978,1557,1466],{}," accepts up to 256 characters.",[983,1560,1562],{"id":1561},"display-the-selected-document","Display the selected document",[974,1564,1565,1566,1568,1569,1203,1571,999],{},"Pass a relative path from the listing in the ",[978,1567,405],{}," query to retrieve that file. A relative path to a file in a subdirectory is accepted only when ",[978,1570,1202],{},[978,1572,1216],{},[1015,1574,1577],{"className":1575,"code":1576,"language":1020,"meta":1021},[1018],"GET /api/web/guide/assets/content?file=getting-started.md\n",[978,1578,1576],{"__ignoreMap":1021},[974,1580,1581,1582,1584,1585,1587,1588,1590],{},"Render ",[978,1583,1008],{}," responses with a Markdown renderer and use a ",[978,1586,1012],{}," response URL as an image source. Prefer the listing's ",[978,1589,1421],{}," instead of assembling paths in the client so endpoint path changes are easier to handle.",[983,1592,1594],{"id":1593},"notes","Notes",[988,1596,1597,1607,1610,1616,1619,1626,1636,1643],{},[991,1598,1599,1600,1602,1603,1009,1605,999],{},"Add only formats you intend to publish to ",[978,1601,1198],{},". This example allows ",[978,1604,1008],{},[978,1606,1012],{},[991,1608,1609],{},"You can configure up to 32 extensions.",[991,1611,1612,1613,1615],{},"Hidden files and folders whose names begin with a dot (",[978,1614,999],{},"), and symbolic links, are not served by listing or file requests.",[991,1617,1618],{},"A relative path cannot leave the configured source folder.",[991,1620,1621,1622,1625],{},"The same endpoint ACL applies to the listing and file contents. Set ",[978,1623,1624],{},"login: false"," explicitly for a public endpoint; for a member endpoint, also verify the required role, level, and team conditions.",[991,1627,1628,1629,1631,1632,1635],{},"To calculate an exact ",[978,1630,1425],{}," and sorted result, the server scans up to 2,000 files and directories. Entries later excluded as hidden or by the extension filter still count toward this limit. If the scan exceeds the limit, the server returns ",[978,1633,1634],{},"413"," and no partial listing.",[991,1637,1638,1639,1642],{},"After adding or editing a file, verify that ",[978,1640,1641],{},"modifiedAt"," and the displayed content are updated.",[991,1644,1645],{},"When rendering Markdown as HTML, configure the renderer so scripts and unsafe markup are not accepted.",[1647,1648,1649],"warning",{},[974,1650,1651],{},"At deployment, SetFN verifies that the deploying user can view and download the publishing folder and every currently exposed descendant. A file added to the publishing root after deployment is not rechecked against its source ACL individually; it follows the endpoint ACL. Use a dedicated publishing folder and restrict who can add files to it.",[983,1653,1655],{"id":1654},"related-documentation","Related documentation",[988,1657,1658,1665,1671],{},[991,1659,1660],{},[1661,1662,1664],"a",{"href":1663},"../api-overview","Build and deploy an API and database",[991,1666,1667],{},[1661,1668,1670],{"href":1669},"../frontend-example","Review the frontend sample",[991,1672,1673],{},[1661,1674,1676],{"href":1675},"../website-release","Publish a website",[1678,1679,1680],"style",{},"html pre.shiki code .sMOD_, html code.shiki .sMOD_{--shiki-default:#24292E;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}html pre.shiki code .s-m8C, html code.shiki .s-m8C{--shiki-default:#005CC5;--shiki-default-font-style:inherit;--shiki-dark:#79B8FF;--shiki-dark-font-style:inherit;--shiki-sepia:#66D9EF;--shiki-sepia-font-style:italic}html pre.shiki code .sCZoN, html code.shiki .sCZoN{--shiki-default:#032F62;--shiki-dark:#9ECBFF;--shiki-sepia:#CFCFC2}html pre.shiki code .s7F3e, html code.shiki .s7F3e{--shiki-default:#005CC5;--shiki-dark:#79B8FF;--shiki-sepia:#AE81FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html.sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}",{"title":1021,"searchDepth":1130,"depth":1147,"links":1682},[1683,1684,1685,1686,1687,1688,1689],{"id":985,"depth":1130,"text":986},{"id":1026,"depth":1130,"text":1027},{"id":1220,"depth":1130,"text":1221},{"id":1258,"depth":1130,"text":1259},{"id":1561,"depth":1130,"text":1562},{"id":1593,"depth":1130,"text":1594},{"id":1654,"depth":1130,"text":1655},null,"Learn how to use the Webspace directory static-file API to publish a list and the contents of resources stored in books/guide.","md",{"slug":1694},"/webspace/examples/folder-board/",true,{"title":1697,"description":1698,"ogType":1699,"twitterCard":1700,"keywords":1701},"Build a resource board from folder files | Webspace examples","List Markdown documents and images from a folder as JSON and display the selected file in a resource board.","article","summary_large_image",[1702,1703,1704,1705],"Webspace folder board","static-file API","Markdown resource board","SetFN",[91],"9oDkDsNQhyHqpqwQdWO8rzP0-if164BuQSMcCM3L1fI",[1709,1710],{"title":700,"path":701,"stem":702,"children":-1},{"title":709,"path":710,"stem":711,"children":-1},{"title":704,"filename":1712,"content":1713},"folder-board","# Build a resource board from folder files\r\n\r\nThis example stores Markdown documents and images in `books/guide`, then uses Webspace to provide a file list and the selected file's contents. The folder remains the source of the resources, so you do not need to copy each document into a database.\r\n\r\n## Before you begin\r\n\r\n- You need permission to deploy schemas and APIs.\r\n- Prepare the files to publish in `books/guide`.\r\n- Set the endpoint's read permission for the intended audience.\r\n\r\nThis example serves only `.md` and `.png` files and does not scan subdirectories.\r\n\r\n```text\r\nbooks/\r\n└── guide/\r\n    ├── getting-started.md\r\n    ├── permissions.md\r\n    └── permissions.png\r\n```\r\n\r\n## Configure a directory endpoint\r\n\r\nThis example uses `guide` as the `Database identifier`, `assets` as the table name, and `content` as the custom path.\r\n\r\n1. Open the schema file and select `API Build`.\r\n2. On the `assets` table, select `Add static file API`.\r\n3. Enter `content` as the custom path.\r\n4. Under `Source type`, select `Folder list · file content`.\r\n5. Under `Choose folder`, choose `books/guide`.\r\n6. Add `.md` and `.png` under `Allowed extensions`.\r\n7. Enable `Include subfolders` only if you want to serve subdirectories. Leave it disabled for this example.\r\n8. Configure the endpoint permission for the board's intended audience.\r\n\r\nThe resulting static-file contract is:\r\n\r\n```json\r\n{\r\n  \"mode\": \"directory\",\r\n  \"extensions\": [\".md\", \".png\"],\r\n  \"recursive\": false\r\n}\r\n```\r\n\r\n`mode` is either `file` for one file or `directory` for a folder. `extensions` is the allowlist of file extensions that the endpoint can return. When `recursive` is `false`, the list contains only files directly under `books/guide`. Set `recursive` to `true` to serve files in subdirectories as well.\r\n\r\n## Deploy the API\r\n\r\n1. In the fixed deployment bar at the bottom of the screen, select `Deploy` to expand the panel upward. This first selection does not deploy the API.\r\n2. Enter `guide` under `Database identifier`, then review `Storage engine mode` and `Client deployment path`.\r\n3. Select `Deploy` again inside the expanded panel.\r\n4. After deployment, verify the listing at `/api/web/guide/assets/content`.\r\n\r\n## Load the file list\r\n\r\nA request to the directory endpoint without a file parameter returns a JSON listing.\r\n\r\n```json\r\n{\r\n  \"items\": [\r\n    {\r\n      \"name\": \"getting-started.md\",\r\n      \"path\": \"getting-started.md\",\r\n      \"size\": 1842,\r\n      \"mimeType\": \"text/markdown; charset=utf-8\",\r\n      \"modifiedAt\": \"2026-10-02T09:30:00Z\",\r\n      \"url\": \"/api/web/guide/assets/content?file=getting-started.md\"\r\n    }\r\n  ],\r\n  \"total\": 3,\r\n  \"offset\": 0,\r\n  \"limit\": 20\r\n}\r\n```\r\n\r\nUse `name` as the list label and `url` when the reader selects a file. `total` is the full result count, while `offset` and `limit` describe the returned page.\r\n\r\nThe endpoint supports these listing queries:\r\n\r\n| Query | Example | Purpose |\r\n| --- | --- | --- |\r\n| `q` | `q=permission` | Search file names. |\r\n| `order` | `order=name:asc` | Sort by name in ascending order. |\r\n| `order` | `order=modifiedAt:desc` | Show recently modified files first. |\r\n| `offset` | `offset=20` | Skip a number of files. |\r\n| `limit` | `limit=20` | Set the number of files to return. |\r\n\r\n```text\r\nGET /api/web/guide/assets/content?q=permission&order=modifiedAt:desc&offset=0&limit=20\r\n```\r\n\r\nWhen `limit` is omitted, the endpoint returns 50 items. The maximum is 200 per request. For a larger folder, check `total` and increase `offset` to request the next page. The default `order` is `name:asc`, and `q` accepts up to 256 characters.\r\n\r\n## Display the selected document\r\n\r\nPass a relative path from the listing in the `file` query to retrieve that file. A relative path to a file in a subdirectory is accepted only when `recursive` is `true`.\r\n\r\n```text\r\nGET /api/web/guide/assets/content?file=getting-started.md\r\n```\r\n\r\nRender `.md` responses with a Markdown renderer and use a `.png` response URL as an image source. Prefer the listing's `url` instead of assembling paths in the client so endpoint path changes are easier to handle.\r\n\r\n## Notes\r\n\r\n- Add only formats you intend to publish to `extensions`. This example allows `.md` and `.png`.\r\n- You can configure up to 32 extensions.\r\n- Hidden files and folders whose names begin with a dot (`.`), and symbolic links, are not served by listing or file requests.\r\n- A relative path cannot leave the configured source folder.\r\n- The same endpoint ACL applies to the listing and file contents. Set `login: false` explicitly for a public endpoint; for a member endpoint, also verify the required role, level, and team conditions.\r\n- To calculate an exact `total` and sorted result, the server scans up to 2,000 files and directories. Entries later excluded as hidden or by the extension filter still count toward this limit. If the scan exceeds the limit, the server returns `413` and no partial listing.\r\n- After adding or editing a file, verify that `modifiedAt` and the displayed content are updated.\r\n- When rendering Markdown as HTML, configure the renderer so scripts and unsafe markup are not accepted.\r\n\r\n::warning\r\nAt deployment, SetFN verifies that the deploying user can view and download the publishing folder and every currently exposed descendant. A file added to the publishing root after deployment is not rechecked against its source ACL individually; it follows the endpoint ACL. Use a dedicated publishing folder and restrict who can add files to it.\r\n::\r\n\r\n## Related documentation\r\n\r\n- [Build and deploy an API and database](../24.api-overview.md)\r\n- [Review the frontend sample](../26.frontend-example.md)\r\n- [Publish a website](../10.website-release.md)\n",1791199130572]