hackmdio / hackmdio/codimd

[Bug] Emoji triggers PDF-export crash and restarts container (CodiMD 2.6.0)

Open
#1,932 3 comments 1 reaction 0 assignees View on GitHub
Dominant language
JavaScript
Stars
10.1k
Forks
1.1k
PR merge metrics
No merged PRs in 30d

Description

## Describe the bug
Exporting a note to **PDF** in CodiMD 2.6.0 crashes PhantomJS whenever the note contains certain emoji characters, which restarts the whole container.

## To Reproduce
1. Create or edit a note.
2. Insert any emoji (e.g. 😀).
3. Click **Export → PDF**.
4. The request hangs and the container restarts.

## Expected behavior
* A PDF should be generated successfully.
* The service should remain online.

## Actual behavior
* PDF generation fails.
* `docker logs` show **PhantomJS** crashing with `SIGFPE`.
* The CodiMD container restarts automatically.

## Environment
| Item | Value |
|-----------------|---------------------------------------|
| **CodiMD ver.** | 2.6.0 |
| **Deployment** | docker-compose |
| **Node ver.** | 16.20.2 (image default) |
| **Base OS** | Debian Buster |
| **PDF engine** | `markdown-pdf` + PhantomJS |

## docker-compose excerpt (masked)

click to expand

```yaml
services:
codimd:
image: /hackmdio/hackmd:2.6.0
environment:
CMD_URL_PATH: codimd
CMD_DOMAIN:
CMD_PROTOCOL_USESSL: "true"
QT_QPA_PLATFORM: ""
# Database
CMD_DB_URL: postgres://codimd:@codimd_db/codimd
# Misc
CMD_EMAIL: "false"
CMD_PLANTUML_SERVER: https:///plantuml
CMD_ALLOW_ANONYMOUS: "false"
CMD_ALLOW_ANONYMOUS_EDITS: "false"
CMD_CSP_ENABLE: "false"
````

## Logs (full excerpt)

```text
2025-07-09T06:13:04.445Z info: - - [09/Jul/2025:06:13:04 +0000] "GET /me HTTP/1.1" 304 - "https:///codimd/ixLMZtInSNiOnrbOkQ-Q_w" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36 Edg/138.0.0.0"
2025-07-09T06:13:06.517Z info: - - [09/Jul/2025:06:13:06 +0000] "GET /uploads/upload_845dbee74d2337302b91fb126a4691db.png HTTP/1.1" 200 32405 "https:///codimd/ixLMZtInSNiOnrbOkQ-Q_w" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36 Edg/138.0.0.0"
2025-07-09T06:13:20.968Z info: deserializeUser: c35f23dd-2732-46b7-9283-15b14eac234b
2025-07-09T06:13:21.478Z error: uncaughtException: Command failed: /home/hackmd/app/node_modules/phantomjs-prebuilt/lib/phantom/bin/phantomjs /home/hackmd/app/node_modules/markdown-pdf/phantom/render.js /tmp/tmp-.html /tmp/tmp-.pdf /home/hackmd/app /home/hackmd/app/node_modules/markdown-pdf/runnings.js /home/hackmd/app/node_modules/markdown-pdf/css/pdf.css /home/hackmd/app/node_modules/highlight.js/styles/github-gist.css A4 portrait 2cm 0 10000
PhantomJS has crashed. Please read the bug reporting guide at
and file a bug report.
Error: Command failed: /home/hackmd/app/node_modules/phantomjs-prebuilt/lib/phantom/bin/phantomjs /home/hackmd/app/node_modules/markdown-pdf/phantom/render.js /tmp/tmp-.html /tmp/tmp-.pdf /home/hackmd/app /home/hackmd/app/node_modules/markdown-pdf/runnings.js /home/hackmd/app/node_modules/markdown-pdf/css/pdf.css /home/hackmd/app/node_modules/highlight.js/styles/github-gist.css A4 portrait 2cm 0 10000
PhantomJS has crashed. Please read the bug reporting guide at
and file a bug report.
at ChildProcess.exithandler (node:child_process:402:12)
at ChildProcess.emit (node:events:513:28)
at maybeClose (node:internal/child_process:1100:16)
at Socket. (node:internal/child_process:458:11)
at Socket.emit (node:events:513:28)
at Pipe. (node:net:301:12)
2025-07-09T06:13:21.481Z error: Process will exit now.
Info: try to connect to tcp://codimd_db in port 5432
2025/07/09 06:13:22 portchecker.go:56: dial tcp codimd_db:5432: connect: connection success
```

## Possible cause / context

* Matches [https://github.com/hajareshyam/pdf-creator-node/issues/45](https://github.com/hajareshyam/pdf-creator-node/issues/45) — PhantomJS cannot render certain emoji/Unicode glyphs.
* Removing all emoji lets the export succeed → strong evidence of an encoding issue.
* PhantomJS is unmaintained; CodiMD relies on it via `markdown-pdf`.

## Potential solutions

1. **Upgrade to CodiMD 3.x** (if it has moved to a Chromium/Puppeteer backend).
2. Replace PhantomJS with **Puppeteer**/**Playwright** in a custom build.
3. Test latest `phantomjs-prebuilt` patch to confirm whether the crash persists.

## Help wanted

* Can maintainers reproduce this crash with an emoji-containing note?
* Is there an official plan to migrate away from PhantomJS?
* Any patch or workaround would be greatly appreciated.

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.