RSSAmplifier

Andrew Wippler's Sketchpad · Sep 25, 2025

Helper Scripts

0
Sign in to vote or save

This page cannot be shown here. You can still read it on the original site — the toolbar below keeps your place in the directory.

I replaced OnlyOffice with Collabora in my lab. I was able to extend their WOPI example to produce a Minimum Viable Product . As it stands now, the software is feature complete for my use case. From there, I mount my data to my NFS storage and sync that folder with Dropbox. This lets me use a filebrowser for my currently in work documents. I can then access those contents from my reMarkable using…

I replaced OnlyOffice with Collabora in my lab. I was able to extend their WOPI example to produce a Minimum Viable Product</a>. As it stands now, the software is feature complete for my use case. From there, I mount my data to my NFS storage and sync that folder with Dropbox. This lets me use a filebrowser for my currently in work documents. I can then access those contents from my reMarkable</a> using the Dropbox integration. Unfortunately, the reMarkable reads PDFs and not docx. To combat this problem, I have created a nightly script to convert the files to PDF. This is easily packaged into a container and run as a kubernetes cronjob. Since my NFS storage is also a persistent volume claim, I can reuse the same ReadWriteMany mount for both my Waffle WOPI server and the wrapper script to libreoffice.</p>

The Script</h2>
#</span></span>!/usr/bin/env bash</span>
</span></span>set</span></span> -euo pipefail</span>
</span>
</span>#</span></span> Defaults: mounted /data directory</span>
</span></span>input_dir</span>=</span>"</span>$</span>{</span></span>1</span></span>:-</span></span>/data</span>}</span></span>"</span></span></span>
</span>output_dir</span>=</span>"</span>$</span>{</span></span>2</span></span>:-</span></span>$</span>input_dir</span></span></span>}</span></span>"</span></span></span>
</span>
</span>#</span></span> Ensure output directory exists</span>
</span></span>mkdir</span></span> -</span>p</span> "</span>$</span>output_dir</span></span>"</span></span></span>
</span>
</span>echo</span></span> "</span>Converting DOCX files from: $</span>input_dir</span></span>"</span></span></span>
</span>echo</span></span> "</span>Saving PDFs to: $</span>output_dir</span></span>"</span></span></span>
</span>
</span>#</span></span> Convert all .docx → .pdf</span>
</span></span>shopt</span></span> -s nullglob</span>
</span>files</span>=</span>(</span>"</span>$</span>input_dir</span></span>"</span></span>/*</span>.docx)</span>
</span>
</span>if</span> [</span> $</span>{</span></span>#</span></span>files[</span>@</span>]</span></span></span>}</span></span> -</span>eq</span> 0 ]</span></span>;</span> then</span>
</span>  echo</span></span> "</span>No .docx files found in $</span>input_dir</span></span>"</span></span></span>
</span>  exit</span></span> 0</span>
</span>fi</span>
</span>
</span>soffice</span></span> --</span>headless</span> --</span>convert-to</span> pdf:writer_pdf_Export --</span>outdir</span> "</span>$</span>output_dir</span></span>"</span></span> "</span>$</span>{</span></span>files[</span>@</span>]</span></span></span>}</span></span>"</span></span></span>
</span>echo</span></span> "</span>Conversion complete."</span></span></span>
</span></code></pre>

The Dockerfile</h2>
FROM</span> debian:bullseye-slim</span>
</span>
</span>#</span> Install LibreOffice (soffice)
</span></span>RUN </span>apt-get update && apt-get install -y libreoffice && rm -rf /var/lib/apt/lists/*
</span>
</span>#</span> Working directory for mounted data
</span></span>WORKDIR </span>/data
</span>
</span>#</span> Copy script
</span></span>COPY</span> convert.sh /usr/local/bin/convert.sh
</span>RUN </span>chmod +x /usr/local/bin/convert.sh
</span>
</span>#</span> Default entrypoint
</span></span>ENTRYPOINT </span>["</span>/usr/local/bin/convert.sh"</span></span>]
</span></code></pre>

The Cronjob</h2>
apiVersion</span></span>:</span> batch/v1</span>
</span>kind</span></span>:</span> CronJob</span>
</span>metadata</span></span>:</span>
</span>  name</span></span>:</span> remarkable-dropbox-helper</span>
</span>  namespace</span></span>:</span> collabora</span>
</span>spec</span></span>:</span>
</span>  concurrencyPolicy</span></span>:</span> Forbid</span>
</span>  failedJobsHistoryLimit</span></span>:</span> 1</span>
</span>  jobTemplate</span></span>:</span>
</span>    metadata</span></span>:</span>
</span>      name</span></span>:</span> remarkable-dropbox-helper</span>
</span>    spec</span></span>:</span>
</span>      template</span></span>:</span>
</span>        spec</span></span>:</span>
</span>          containers</span></span>:</span>
</span>          -</span> image</span></span>:</span> docker-domain/remarkable-dropbox-helper:latest</span>
</span>            command</span></span>:</span> [</span>"</span>convert.sh"</span></span>,</span> "</span>/data/editable"</span></span>]</span></span>
</span>            imagePullPolicy</span></span>:</span> Always</span>
</span>            name</span></span>:</span> remarkable-dropbox-helper</span>
</span>            volumeMounts</span></span>:</span>
</span>            -</span> mountPath</span></span>:</span> /data</span>
</span>              name</span></span>:</span> remarkable-dropbox-helper-pvc</span>
</span>          dnsPolicy</span></span>:</span> ClusterFirst</span>
</span>          imagePullSecrets</span></span>:</span>
</span>          -</span> name</span></span>:</span> regsecret</span>
</span>          restartPolicy</span></span>:</span> OnFailure</span>
</span>          terminationGracePeriodSeconds</span></span>:</span> 30</span>
</span>          volumes</span></span>:</span>
</span>          -</span> name</span></span>:</span> remarkable-dropbox-helper-pvc</span>
</span>            persistentVolumeClaim</span></span>:</span>
</span>              claimName</span></span>:</span> middleware-files-pvc</span>
</span>  schedule</span></span>:</span> '</span>@daily'</span></span>
</span>  timeZone</span></span>:</span> Europe/Helsinki</span>
</span>  successfulJobsHistoryLimit</span></span>:</span> 1</span>
</span>  suspend</span></span>:</span> false</span>
</span></code></pre>

Read on /2025-09-25-helper-scripts/

Comments

Nothing yet. Say the first thing.

    Sign in to join the conversation.