Run Thinkfree Office on your computer
Self-host a complete Thinkfree Office runtime directly on your own computer and immediately test Word, Cell, and Show documents. The single-container image includes WebOffice, its document and filter servers, MongoDB, Redis, the NSLOCAL adapter, and a small file browser. Only the license and, when persistence is needed, local data directories are mounted from the host.
The image is published as thinkfree/thinkfree-office-single-container-for-trial:17.0.0 in a private Docker Hub
repository. Sign in with an authorized account or organization access token before pulling it.
Requirements
- The latest Docker release. Install Docker for your operating system.
- A valid Thinkfree Office trial or commercial license file. Request a free 30-day Docker trial with the form below.
- At least 2 CPU cores and 4 GB memory for evaluation
- A host directory containing the documents you want to open
Request a trial license
Enter your work email and company name. The request always uses the Docker package and Ubuntu 22.04 build; no additional information is collected. After a successful request, check your email for the license and download instructions.
Request a Thinkfree Office license
The license and download instructions will be sent to your work email.
Personal email domains such as Gmail, Naver, Daum, Yahoo, and QQ are not accepted. The form sends only your email and company name; package and OS values are fixed above.
Start with local documents
The license is mounted as one read-only file. The document directory is mounted at /root/docs, the fixed root used by
the NSLOCAL adapter.
Place the issued license.tfl file in a host directory, then replace /absolute/path/license.tfl below with its absolute path.
docker run -d --name thinkfree-office \
-p 8080:80 \
--cpus=2 \
--memory=4g \
--shm-size=1g \
--mount type=bind,src=/absolute/path/license.tfl,dst=/opt/thinkfree/license/license.dat,readonly \
--mount type=bind,src=/absolute/path/documents,dst=/root/docs \
thinkfree/thinkfree-office-single-container-for-trial:17.0.0
Wait until the container reports healthy:
docker ps --filter name=thinkfree-office
docker logs -f thinkfree-office
curl --fail http://localhost:8080/cloud-office/
Open these pages after startup:
| Page | URL |
|---|---|
| NSLOCAL file browser | http://localhost:8080/nslocal/ |
| WebOffice service | http://localhost:8080/cloud-office/ |
Browse NSLOCAL
Open http://localhost:8080/nslocal/. The browser starts at the mounted /root/docs directory and supports:
- directory navigation and directory creation;
- file upload, download, and deletion;
- opening DOC, DOCX, ODT, XLS, XLSX, ODS, PPT, PPTX, and ODP files in WebOffice.
Click a supported document name to open the correct editor in a new tab. The file browser has no sign-in screen, so do
not expose /nslocal/ directly to the public Internet. Restrict it with an ALB/Ingress source IP allowlist or a private network.
The file browser also exposes small same-origin APIs that can be useful in local developer tools:
GET /nslocal/api/list?path=presentations
GET /nslocal/api/download?path=presentations/demo.pptx
PUT /nslocal/api/file?path=presentations/demo.pptx
DELETE /nslocal/api/file?path=presentations/demo.pptx
POST /nslocal/api/directory JSON: {"path":"presentations/2026"}
The default upload limit is 100MB per file. A reverse proxy in front of the container must allow the same request size.
Paths are relative to /root/docs. Absolute paths and .. traversal are rejected.
Build a document-open URL
Use the Cloud Office open endpoint with the NSLOCAL adapter:
http://localhost:8080/cloud-office/api/nslocal/{DOCUMENT_PATH}/open
?app={EDITOR_MODE}
&user_id={USER_ID}
&docId={UNIQUE_DOCUMENT_ID}
Choose the editor mode from the document type:
| Documents | app value |
|---|---|
| DOC, DOCX, ODT | WRITE_EDITOR |
| XLS, XLSX, ODS | CALC_EDITOR |
| PPT, PPTX, ODP | SHOW_EDITOR |
Encode every path segment as UTF-8 URL data, but preserve / between directories. docId identifies the editing session;
generate a unique, URL-safe value for a new session instead of using a user-supplied filesystem path directly.
Example for /root/docs/contracts/제안서.docx:
http://localhost:8080/cloud-office/api/nslocal/contracts/%EC%A0%9C%EC%95%88%EC%84%9C.docx/open?app=WRITE_EDITOR&user_id=local-user&docId=contract-2026-001
JavaScript helper:
const editorMode = {
doc: "WRITE_EDITOR", docx: "WRITE_EDITOR", odt: "WRITE_EDITOR",
xls: "CALC_EDITOR", xlsx: "CALC_EDITOR", ods: "CALC_EDITOR",
ppt: "SHOW_EDITOR", pptx: "SHOW_EDITOR", odp: "SHOW_EDITOR",
};
export function createOfficeUrl(baseUrl, documentPath, userId = "local-user") {
// Encode each filename/directory independently so nested paths still work.
const encodedPath = documentPath.split("/").map(encodeURIComponent).join("/");
const extension = documentPath.split(".").pop().toLowerCase();
const app = editorMode[extension];
if (!app) throw new Error(`Unsupported document type: ${extension}`);
// A new ID creates an independent editing session for this open request.
const docId = crypto.randomUUID().replaceAll("-", "");
const query = new URLSearchParams({app, user_id: userId, docId});
return `${baseUrl}/cloud-office/api/nslocal/${encodedPath}/open?${query}`;
}
Optional persistence
Without mounts, container changes disappear when the container is removed. Preserve long-lived state by mounting these paths:
| Container path | Data |
|---|---|
/root/docs | NSLOCAL source and saved documents |
/data/db | MongoDB product configuration and adapter data |
/data/redis | Redis session snapshots |
/root/weboffice/logs | WebOffice and application logs |
/root/weboffice/hncLog | document filter logs |
For production, pin an immutable image version, keep the license read-only, configure TLS and probes, preserve MongoDB and document volumes, and limit access to administrative and NSLOCAL endpoints.