Zum Hauptinhalt springen
Echtzeit-Radar & Feeds
Alle RSS Feeds ➔
👥 Community & Social
•
IT Security NachrichtenBetrüger phishen mit vermeintlicher Reisebestätigung - IT-Markt(24.09.2026 um 23:41 Uhr)
••
Sicherheitslücken (CVE)IT Security News Daily Summary 2026-09-24(24.09.2026 um 23:55 Uhr)
•
Sicherheitslücken (CVE)IT Security News Roundup: 2026-09-24(24.09.2026 um 23:57 Uhr)
•
Sicherheitslücken (CVE)IT Security News Hourly Summary 2026-09-25 00h : 9 posts(25.09.2026 um 00:00 Uhr)
•••
IT NachrichtenMicrosoft puts Brad Smith in charge of communications(25.09.2026 um 00:08 Uhr)
•••
IT Security NachrichtenBetrüger phishen mit vermeintlicher Reisebestätigung - IT-Markt(24.09.2026 um 23:41 Uhr)
••
Sicherheitslücken (CVE)IT Security News Daily Summary 2026-09-24(24.09.2026 um 23:55 Uhr)
•
Sicherheitslücken (CVE)IT Security News Roundup: 2026-09-24(24.09.2026 um 23:57 Uhr)
•
Sicherheitslücken (CVE)IT Security News Hourly Summary 2026-09-25 00h : 9 posts(25.09.2026 um 00:00 Uhr)
•••
IT NachrichtenMicrosoft puts Brad Smith in charge of communications(25.09.2026 um 00:08 Uhr)
••
Intelligence View
⚡ tsecurity.de Intelligence

I Was Tired of Uploading PDFs… So I Built My Own Tool

I didn't start by writing code. I started with a simple frustration. Every time I needed to split a PDF, the process felt wrong. Upload file → wait → download → hope nothing breaks. And the bigger issue: Why am I uploading my files at a…

0
↗ Quelle (dev.to)
Reagiere als Erste:r — dein Feedback zählt!

I didn't start by writing code. I started with a simple frustration. Every time I needed to split a PDF, the process felt wrong.



Upload file → wait → download → hope nothing breaks.



And the bigger issue:




Why am I uploading my files at all?




That didn't sit right with me, especially when dealing with sensitive files. Some of these PDFs contain sensitive data. Invoices, contracts, internal docs…



Things that shouldn’t leave my machine.



So I wanted to see if I could build a tool that runs entirely in the browser, keeping data private and the UX instantaneous.




The Breaking Point




One day I was working on a small SaaS idea that needed basic PDF processing.



Nothing fancy. Just:




  • Split pages

  • Extract a few sections



The first hurdle, how do you manipulate heavy PDF structures in a client-side environment? After testing a few libraries, I landed on pdf-lib.



import { PDFDocument } from "pdf-lib";



Why this choice?



Zero Backend: It runs natively in the browser environment.



Lightweight: Perfect for MVPs and fast-loading web apps.



Simple API: The mental model for copying and merging pages is very intuitive.







Defining the Input Logic




I wanted a UI that felt familiar to anyone who has ever hit "Print." Instead of complex checkboxes, I opted for a simple string input: 1, 2, 5-8.



The goal was to convert that string into a clean array of indices:



"1, 2, 5-8" → 0, 1, 4, 5, 6, 7.




Parsing Page Ranges




I wrote a small utility function to handle the string-to-array logic, ensuring it could handle both individual pages and ranges while filtering out duplicates via a Set.




export function parsePageRanges(input: string): number[] {
const pages = new Set<number>();

input.split(",").forEach((part) => {
const trimmed = part.trim();

if (trimmed.includes("-")) {
let [start, end] = trimmed.split("-").map(Number);
if (start > end) [start, end] = [end, start];

for (let i = start; i <= end; i++) {
pages.add(i - 1);
}
} else {
const num = Number(trimmed);
if (!isNaN(num)) pages.add(num - 1);
}
});

return [...pages];
}







Loading the PDF




Next, we need to get the file into a format pdf-lib understands. Using arrayBuffer() allows us to handle the file locally without any multi-part form uploads.




const bytes = file instanceof File ? await file.arrayBuffer() : file;
const pdf = await PDFDocument.load(bytes);
const totalPages = pdf.getPageCount();







Extracting and Exporting




This is where the "magic" happens. We create a blank PDF document, copy the selected pages from the source, and save it.




const indices = parsePageRanges(input);
const newPdf = await PDFDocument.create();

// Copy the selected pages from the source PDF
const copiedPages = await newPdf.copyPages(pdf, indices);

// Add them to the new document
copiedPages.forEach((p) => newPdf.addPage(p));

// Save and return the bytes
return await newPdf.save();







Pros




Building this small utility changed how I think about SaaS architecture.



Privacy is a Feature:

Users love knowing their files never touch a server.



Architecture over Infrastructure:

Sometimes the best "system" is the one you don't build. By avoiding a backend, I avoided costs, security risks, and scaling issues.



Browser Power:

Modern Web APIs and libraries are significantly more capable of heavy lifting than we often give them credit for.




Cons




Because the processing happens on the user's machine, it may tipically:



Memory Limits: Extremely large PDFs (think 500MB+) might crash a mobile browser.



Client Performance: A low-end device will process the split slower than a dedicated server.



However, for 95% of real-world use cases, the speed and privacy gains far outweigh these edge cases.




Result




This has become a PDF Splitter utility in my development.



If you're building a full-scale SaaS, an internal dashboard, or a quick MVP, remember: You might not need a backend for that.



Next time you're designing a feature, don't ask "How do I build this system?" Ask "Can I avoid building the system entirely?"

SOC Incident Playbook: Remote Code Execution (RCE) Defense
Syntax validiert (0 Fehler)
title: Detect Exploitation - I Was Tired of Uploading PDFs… So I Built My Own Tool
id: cfb3f0f8-f768-4bf8-904e-4b6120823220
status: experimental
description: Automatisch generierte SIEM-Erkennungsregel basierend auf CTI Intelligence
references:
  - https://tsecurity.de/
author: iShareStuff CTI Automated Detection Engine
date: 2026-09-25
logsource:
  category: network_connection
  product: any
detection:
  selection:
      CommandLine|contains:
        - 'exploit'
  condition: selection
falsepositives:
  - Legitime administrative Zugriffe oder Penetrationstests
level: high
tags:
  - attack.initial_access
Syntax validiert (0 Fehler)
rule CTI_Threat_Indicator {
    meta:
        author = "iShareStuff CTI Automated Detection Engine"
        date = "2026-09-25"
        description = "YARA Signature for "
    strings:
        $str = "I Was Tired of Uploading PDFs…" ascii wide
    condition:
        any of them
}
Syntax validiert (0 Fehler)
index=security sourcetype IN ("cisco:asa", "pan:traffic", "zeek_conn", "suricata", "WinEventLog:Security")
("I Was Tired of Uploading PDFs So I Built")
| stats count earliest(_time) as first_seen latest(_time) as last_seen by src_ip, dest_ip, dest_host, signature
| eval first_seen=strftime(first_seen, "%Y-%m-%d %H:%M:%S"), last_seen=strftime(last_seen, "%Y-%m-%d %H:%M:%S")
| sort - count
Syntax validiert (0 Fehler)
message: "*I Was Tired of Uploading PDFs So I Built*"
Syntax validiert (0 Fehler)
CommonSecurityLog
| where Message has "I Was Tired of Uploading PDFs So I Built"
| summarize EventCount = count(), FirstSeen = min(TimeGenerated), LastSeen = max(TimeGenerated) by SourceIP, DestinationIP, DestinationPort, Activity
| extend DetectionRule = "iShareStuff-CTI-Compiled"
| sort by EventCount desc
🎯
MITRE ATT&CK Matrix Navigator 14 Taktiken
Reconnaissance
-
Resource Development
-
Initial Access
Execution
Persistence
-
Privilege Escalation
Defense Evasion
Credential Access
-
Discovery
-
Lateral Movement
-
Collection
-
Command and Control
Exfiltration
-
Impact
tsecurity.de Cognitive Threat RAG
Fokus-Vektor:

Kognitive Analyse für identifizierte Bedrohung: Erhöhte Bedrohungslage im Bereich I Was Tired of Uploading PDFs… So I Buil.... Basierend auf 368k Vektor-Korrelationen werden sofortige Isolationsmaßnahmen für betroffene Endpunkte empfohlen.

🛡️ Angriffsfläche & Exposure

Netzwerk/Remote-Zugriff ohne Vorauthentifizierung möglich.

⚡ Empfohlene Sofortmaßnahmen
  • 1. Perimeter-Inspektion: Relevante Portfreigaben und exponierte Endpunkte unverzüglich scannen.
  • 2. Patch-Applikation: Hersteller-Hotfix einspielen oder betroffene Daemons in isolierte DMZ-Segmente überführen.
  • 3. Telemetrie & EDR-Alerts: Prozessaufrufe und Child-Processes auf anomale Shell-Spawns überwachen.
🔗 Semantisch verwandte Zero-Days MariaDB 11.7 VEC
Ähnliche Beiträge
🔍 Verwandte News

Auch interessante Nachrichten I Was Tired of Uploading PDFs… So I Built My Own Tool

Thematisch verwandte Begriffe: Tired, Uploading, PDFs, Built · 6 Treffer

Laden...

Videos werden geladen ...

Laden...

Beiträge werden geladen ...

Laden...

Videos werden geladen ...

Laden...

Beiträge werden geladen ...

Laden...

Videos werden geladen ...

Laden...

Beiträge werden geladen ...

Laden...

Videos werden geladen ...

Laden...

Beiträge werden geladen ...

Laden...

Videos werden geladen ...

Zum Aktualisieren ziehen
ZERO-DAY CVE-2026-87722 | Uncontrolled Resource Consumption (CWE-400 / CWE-1333) in regex search q…
Advisory →
tsecurity.de Icon
Offline-Lesen, Eilmeldungen & 0ms Ladezeit

Installiere tsecurity.de direkt auf deinen Home-Bildschirm für das ultimative Vollbild-Magazinerlebnis ohne Browser-Leisten.

Nächster Beitrag
Themen-Radar & Intelligence Matrix
Echtzeit-Taxonomie nach Angriffsvektoren & Plattformen

tsecurity.de Live Threat Radar

🔴 LIVE RADAR
MONITORING
AKTIV
CVE-DATENBANK
LIVE
🔍
Community Radar & Live Chat
Sentinel Bot online • Live-Stream
Dein Cluster: Security Explorer
Match:
lädt…
Verbindung zum Community-Stream wird aufgebaut...
Bearbeitungsmodus — Senden überschreibt deine Nachricht
Community-Puls — was gerade passiert
lädt…
Aktivitäten deiner Analysten
lädt…
Neues Thema oder Eilmeldung einreichen

Reiche interessante Links, Zero-Days oder Debatten ein. Die Community entscheidet per Upvote über die Veröffentlichung.

Heiß diskutierte Einreichungen
📂 Keine gespeicherten Artikel vorhanden.
Zurück Ziehen Vor
Links: vorheriger Artikel • Rechts: nächster Artikel • unten: schließen
News NIS-2 Frühwarnung Tier-1 Intel TTP ⏱️ 3 Min vor 10 Min
Artikeldaten werden geladen...
↗ Original-Quelle