Compile LaTex & Typst into PDF with TypeTex

v1.5.0

Compile Typst and LaTeX documents to PDF via API. Send source code, get back a PDF.

3· 2.4k·8 current·8 all-time
Security Scan
VirusTotalVirusTotal
Benign
View report →
OpenClawOpenClaw
Benign
high confidence
Purpose & Capability
Name/description match the provided SKILL.md, examples, and OpenAPI: all show a public HTTP API that accepts source and returns a base64 PDF. No unrelated binaries or credentials are requested.
Instruction Scope
Instructions are narrowly scoped to POSTing document content (and optional auxiliary files, including base64-encoded binaries) to the documented endpoints and saving the returned PDF. Important privacy note: users must send full document contents (and any included files) to the external service — compilation logs (for LaTeX failures) may also be returned. The instructions do not ask the agent to read unrelated system files or secrets.
Install Mechanism
No install spec — instruction-only skill and example scripts only use Python requests. Nothing will be written to disk by an installer and no external archives are fetched by the skill itself.
Credentials
No environment variables, credentials, or config paths are requested. The lack of required secrets is consistent with the skill's stated 'no authentication required' API.
Persistence & Privilege
always is false and the skill does not request elevated or persistent system privileges. disable-model-invocation is false (normal), so an agent could call the API autonomously — acceptable given the skill's narrow scope.
Assessment
This skill is internally consistent, but it sends the full contents of any document and any auxiliary files to a public remote service. Before using it with sensitive documents, verify the service owner and privacy/security policy (the OpenAPI contact points at typetex.app vs the server host on modal.run suggest a third-party host), and avoid sending secrets or private data. If you need offline or private compilation, use a local compiler (Typst/Tectonic) instead. As a quick test, try compiling a non-sensitive sample document first to confirm expected behavior.

Like a lobster shell, security has layers — review code before you run it.

latestvk972d14jq0vm4xs8ap7658dhrh80b94t
2.4kdownloads
3stars
2versions
Updated 1mo ago
v1.5.0
MIT-0

Typst & LaTeX Compiler

Compile Typst (.typ) and LaTeX (.tex) documents to PDF using the TypeTex compilation API.

API Endpoint

Base URL: https://studio-intrinsic--typetex-compile-app.modal.run

Endpoints

Compile Typst

POST /public/compile/typst
Content-Type: application/json

Request Body:

{
  "content": "#set page(paper: \"a4\")\n\n= Hello World\n\nThis is a Typst document.",
  "main_filename": "main.typ",
  "auxiliary_files": {}
}

Response (Success):

{
  "success": true,
  "pdf_base64": "JVBERi0xLjQK..."
}

Response (Failure):

{
  "success": false,
  "error": "error: file not found: missing.typ"
}

Compile LaTeX

POST /public/compile/latex
Content-Type: application/json

Request Body:

{
  "content": "\\documentclass{article}\n\\begin{document}\nHello World\n\\end{document}",
  "main_filename": "main.tex",
  "auxiliary_files": {}
}

Response (Success):

{
  "success": true,
  "pdf_base64": "JVBERi0xLjQK..."
}

Response (Failure):

{
  "success": false,
  "error": "! LaTeX Error: Missing \\begin{document}.",
  "log_output": "This is pdfTeX..."
}

Health Check

GET /public/compile/health

Returns {"status": "ok", "service": "public-compile"} if the service is running.

Usage Examples

Simple Typst Document

import requests
import base64

response = requests.post(
    "https://studio-intrinsic--typetex-compile-app.modal.run/public/compile/typst",
    json={
        "content": """
#set page(paper: "a4", margin: 2cm)
#set text(font: "New Computer Modern", size: 11pt)

= My Document

This is a paragraph with *bold* and _italic_ text.

== Section 1

- Item 1
- Item 2
- Item 3
""",
        "main_filename": "main.typ"
    }
)

result = response.json()
if result["success"]:
    pdf_bytes = base64.b64decode(result["pdf_base64"])
    with open("output.pdf", "wb") as f:
        f.write(pdf_bytes)
    print("PDF saved to output.pdf")
else:
    print(f"Compilation failed: {result['error']}")

Simple LaTeX Document

import requests
import base64

response = requests.post(
    "https://studio-intrinsic--typetex-compile-app.modal.run/public/compile/latex",
    json={
        "content": r"""
\documentclass[11pt]{article}
\usepackage[margin=1in]{geometry}
\usepackage{amsmath}

\title{My Document}
\author{Author Name}

\begin{document}
\maketitle

\section{Introduction}

This is a LaTeX document with math: $E = mc^2$

\end{document}
""",
        "main_filename": "main.tex"
    }
)

result = response.json()
if result["success"]:
    pdf_bytes = base64.b64decode(result["pdf_base64"])
    with open("output.pdf", "wb") as f:
        f.write(pdf_bytes)
else:
    print(f"Compilation failed: {result['error']}")
    if result.get("log_output"):
        print(f"Log: {result['log_output']}")

Multi-File Project (Typst)

import requests
import base64

response = requests.post(
    "https://studio-intrinsic--typetex-compile-app.modal.run/public/compile/typst",
    json={
        "content": """
#import "template.typ": *

#show: project.with(title: "My Report")

= Introduction

#include "chapter1.typ"
""",
        "main_filename": "main.typ",
        "auxiliary_files": {
            "template.typ": """
#let project(title: none, body) = {
  set page(paper: "a4")
  set text(font: "New Computer Modern")

  align(center)[
    #text(size: 24pt, weight: "bold")[#title]
  ]

  body
}
""",
            "chapter1.typ": """
== Chapter 1

This is the first chapter.
"""
        }
    }
)

result = response.json()
if result["success"]:
    pdf_bytes = base64.b64decode(result["pdf_base64"])
    with open("report.pdf", "wb") as f:
        f.write(pdf_bytes)

Including Images

For binary files like images, base64-encode them:

import requests
import base64

# Read and encode an image
with open("figure.png", "rb") as f:
    image_base64 = base64.b64encode(f.read()).decode("utf-8")

response = requests.post(
    "https://studio-intrinsic--typetex-compile-app.modal.run/public/compile/typst",
    json={
        "content": """
#set page(paper: "a4")

= Document with Image

#figure(
  image("figure.png", width: 80%),
  caption: [A sample figure]
)
""",
        "main_filename": "main.typ",
        "auxiliary_files": {
            "figure.png": image_base64
        }
    }
)

Using curl

# Typst compilation
curl -X POST https://studio-intrinsic--typetex-compile-app.modal.run/public/compile/typst \
  -H "Content-Type: application/json" \
  -d '{
    "content": "#set page(paper: \"a4\")\n\n= Hello World\n\nThis is Typst.",
    "main_filename": "main.typ"
  }' | jq -r '.pdf_base64' | base64 -d > output.pdf

# LaTeX compilation
curl -X POST https://studio-intrinsic--typetex-compile-app.modal.run/public/compile/latex \
  -H "Content-Type: application/json" \
  -d '{
    "content": "\\documentclass{article}\n\\begin{document}\nHello World\n\\end{document}",
    "main_filename": "main.tex"
  }' | jq -r '.pdf_base64' | base64 -d > output.pdf

Supported Features

Typst

  • Full Typst language support
  • Multi-file projects with imports
  • Images (PNG, JPG, SVG)
  • Custom fonts (New Computer Modern, etc.)
  • Math equations
  • Tables and figures
  • Bibliography (using Hayagriva format)

LaTeX

  • Full TeX Live distribution via Tectonic
  • Multi-file projects (\input, \include)
  • BibTeX/BibLaTeX bibliography
  • Custom style files (.sty, .cls)
  • All standard packages (amsmath, graphicx, etc.)
  • TikZ/PGFPlots graphics
  • Images (PNG, JPG, PDF, EPS)

Error Handling

When compilation fails, the response includes:

  • success: false
  • error: Human-readable error message
  • log_output (LaTeX only): Full compilation log for debugging

Common errors:

  • Syntax errors: Check your source code for typos
  • Missing files: Ensure all imported/included files are in auxiliary_files
  • Package not found: Most common packages are available; contact support for additions
  • Timeout: Complex documents may timeout after 60 seconds

Rate Limits

  • No authentication required
  • Please be respectful of shared resources
  • For high-volume usage, contact support

Tips for Agents

  1. Always check success before accessing pdf_base64
  2. Parse errors to provide helpful feedback to users
  3. Use minimal documents when testing - complex documents take longer
  4. Cache results if compiling the same content multiple times
  5. Include all dependencies in auxiliary_files for multi-file projects

Related Resources

Comments

Loading comments...