Skip to content

Commit 328533c

Browse files
authored
Merge pull request #12 from reeshabh90/reeshabh-web-changes
Website changes as per audit doc. Release blog added
2 parents af5aba7 + f675bb6 commit 328533c

34 files changed

Lines changed: 2248 additions & 1140 deletions
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
---
2+
title: DocWire SDK 2026.05.25
3+
authors: krzysztof
4+
tags: [release, license, content-type]
5+
---
6+
The latest Docwire release 2026.05.25 has two substantive changes.
7+
8+
### License: GPLv2 → AGPLv3
9+
DocWire SDK moves from GPLv2 to the GNU Affero General Public License v3.0.
10+
The practical differences matter. AGPLv3 closes the "SaaS loophole" — under GPLv2, a company could run DocWire as a networked service without releasing their source code. AGPLv3 requires that network users also receive source. Beyond that, AGPLv3 includes explicit patent grants protecting users from litigation by contributors, is compatible with Apache License 2.0 which broadens ecosystem integration, and uses more internationally enforceable legal language.
11+
For internal tooling, research, and open-source projects: nothing changes. For proprietary networked services, AGPLv3 is not compatible with closed-source deployment under its open-source terms. DocWire is dual-licensed — a commercial license is available for organizations that need to deploy without AGPLv3 obligations
12+
### Content Type Detection: Heuristic Pipeline
13+
Content type detection is where document processing pipelines fail quietly. The symptom is wrong output or silent failures; the cause is usually a file that doesn't match what libmagic expects — wrong extension, missing metadata, or a non-seekable network stream.
14+
This release introduces specialized heuristic detectors for images (BMP, WEBP) and ZIP-based containers (OOXML, ODF formats — DOCX, XLSX, PPTX). The approach: check local file headers in the first 4KB before falling back to deep inspection. This specifically addresses detection failures on non-seekable streams with libmagic 5.47+, where the previous approach regressed.
15+
Two additional fixes come with this: MIME type normalization now standardizes legacy types returned by libmagic to modern IANA standards (e.g. text/xml → application/xml), and when multiple MIME types have identical confidence scores, the result is now alphabetically deterministic rather than platform-dependent.
16+
Test Infrastructure
17+
The monolithic api_tests.cpp has been split into focused files (core_tests.cpp, error_tests.cpp, log_tests.cpp, etc.), and all unit tests now run from a single docwire_tests binary. The practical effect is significantly reduced overhead during full test cycles under Valgrind.
18+
19+
[Full release notes](https://github.com/docwire/docwire/releases/tag/2026.05.25)

docusaurus.config.js

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,9 +121,28 @@ const config = {
121121
],
122122
},
123123
footer: {
124+
logo: {
125+
alt: 'DocWire SDK',
126+
src: 'img/LogoFrame_Black.png',
127+
srcDark: 'img/LogoFrame_White.png',
128+
href: '/',
129+
width: 120,
130+
},
124131
links: [
125132
{
126133
items: [
134+
{
135+
label: 'Use Cases',
136+
to: '/showcases',
137+
},
138+
{
139+
label: 'Commercial Licence',
140+
to: '/contact-us?subject=Commercial+Licence+Enquiry',
141+
},
142+
{
143+
label: 'LTS Agreements',
144+
to: '/contact-us?subject=LTS+Agreement+Enquiry',
145+
},
127146
{
128147
label: 'Privacy Policy',
129148
to: '/privacy',
@@ -143,7 +162,7 @@ const config = {
143162
],
144163
},
145164
],
146-
copyright: `© DocWire SDK<br/SILVERCODERS Ltd.`,
165+
copyright: `<p class="footer__tagline">The data processing foundation for teams who cannot afford to guess.</pDocWire SDK &nbsp;·&nbsp; © Silvercoders Ltd &nbsp;·&nbsp; © DocWire LLC &nbsp;·&nbsp; All rights reserved.`,
147166
},
148167
prism: {
149168
theme: lightCodeTheme,

src/containers/CTA/CTA.jsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ function CTA() {
77
<div className='docwire__cta-background_banner'>
88
<div className='docwire__cta-content'>
99
<h3>Public Releases</h3>
10-
<p className="text-lead">Download the latest release and start building with our powerful SDK. Available under GPLv2 for open source, with commercial options for closed-source projects.</p>
10+
<p className="text-lead">Download the latest release and start building with our powerful SDK. Available under AGPLv3 for open source, with commercial options for closed-source projects.</p>
1111
</div>
1212
</div>
1313
<a href="https://github.com/docwire/docwire/releases" target="_blank" rel="noreferrer" className="docwire__cta-button button-pill">View Releases</a>
Lines changed: 99 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,28 @@
11
import './form.css'
2-
import {useState} from "react";
2+
import { useState, useEffect } from "react";
3+
import { useLocation } from "@docusaurus/router";
34
import emailjs from '@emailjs/browser'
45

6+
/*
7+
subject → Reason option value mapping.
8+
Matches the query params set in SectionCTA and the footer links.
9+
*/
10+
const SUBJECT_MAP = {
11+
"Commercial+Licence+Enquiry": "License",
12+
"Commercial Licence Enquiry": "License",
13+
"LTS+Agreement+Enquiry": "Support",
14+
"LTS Agreement Enquiry": "Support",
15+
"Demo": "Demo",
16+
"Pricing": "Pricing",
17+
"SDK+Questions": "SDK Questions",
18+
"SDK Questions": "SDK Questions",
19+
"Support": "Support",
20+
"Other": "Other",
21+
};
22+
523
function Form() {
24+
const location = useLocation();
25+
626
const [formValues, setFormValues] = useState({
727
reason: "",
828
name: "",
@@ -11,66 +31,96 @@ function Form() {
1131
});
1232

1333
const [isFormVisible, setIsFormVisible] = useState(true);
14-
const [State, setState] = useState("")
34+
const [State, setState] = useState("");
35+
36+
// Pre-select Reason from ?subject= query param
37+
useEffect(() => {
38+
const params = new URLSearchParams(location.search);
39+
const subject = params.get("subject");
40+
if (subject) {
41+
const mapped = SUBJECT_MAP[subject] || SUBJECT_MAP[decodeURIComponent(subject)] || "";
42+
if (mapped) {
43+
setFormValues((prev) => ({ ...prev, reason: mapped }));
44+
}
45+
}
46+
}, [location.search]);
1547

1648
const handleChange = (event) => {
17-
const {name, value} = event.target;
18-
setFormValues({...formValues, [name]: value});
49+
const { name, value } = event.target;
50+
setFormValues({ ...formValues, [name]: value });
1951
};
2052

2153
function handleOnSubmit(e) {
22-
e.preventDefault()
23-
setIsFormVisible(false)
24-
emailjs.sendForm('service_vxi20hi',
54+
e.preventDefault();
55+
setIsFormVisible(false);
56+
emailjs.sendForm(
57+
'service_vxi20hi',
2558
'template_m1jh747',
26-
e.target, '-4RMv_gPIISLilkg8').then(res => {
27-
console.log(res)
28-
setState("success")
59+
e.target,
60+
'-4RMv_gPIISLilkg8'
61+
).then(res => {
62+
console.log(res);
63+
setState("success");
2964
}).catch(err => {
30-
setState("fail")
31-
console.log(err)
32-
})
65+
setState("fail");
66+
console.log(err);
67+
});
3368
}
3469

35-
3670
return (
3771
<>
38-
{isFormVisible ?
39-
(
40-
<form id="email-form" name="email-form" method="POST" action="" onSubmit={handleOnSubmit}>
41-
<h2>I want to ask about...</h2>
42-
<select id="Reason" name="Reason" className="select text-ui" value={formValues.reason}
43-
onChange={e => setFormValues({...formValues, reason: e.target.value})}>
44-
<option value="" disabled={!!formValues.reason}>Select one...</option>
45-
<option value="Demo">Demo</option>
46-
<option value="License">License</option>
47-
<option value="Pricing">Pricing</option>
48-
<option value="SDK Questions">SDK Questions</option>
49-
<option value="Support">Support</option>
50-
<option value="Other">Other</option>
51-
</select>
52-
<input type="text" id="name" name="name" className="input text-ui" maxLength="256" placeholder="Name"
53-
onChange={handleChange} required/>
54-
<input type="email" id="email" name="email" className="input text-ui" maxLength="256"
55-
placeholder="Email" onChange={handleChange} required/>
56-
<textarea id="message" name="message" className="textarea text-ui" placeholder="Your message ..."
57-
onChange={handleChange} required/>
58-
<input type="submit" value="Send request" className="submitButton button-pill"
59-
disabled={State === "loading"}/>
60-
61-
</form>
62-
) : (
63-
<div className="FormAccepted">
64-
<p className="AcceptedParagraph text-ui">
65-
{State === "success" ?
66-
"Message has been sent :)" :
67-
State === "fail" ? "Something went wrong. Please try again later."
68-
: "Sending..."}
69-
</p>
70-
</div>
71-
)}
72+
{isFormVisible ? (
73+
<form id="email-form" name="email-form" method="POST" action="" onSubmit={handleOnSubmit}>
74+
<h2>I want to ask about...</h2>
75+
<select
76+
id="Reason"
77+
name="Reason"
78+
className="select text-ui"
79+
value={formValues.reason}
80+
onChange={e => setFormValues({ ...formValues, reason: e.target.value })}
81+
>
82+
<option value="" disabled={!!formValues.reason}>Select one...</option>
83+
<option value="Demo">Demo</option>
84+
<option value="License">License</option>
85+
<option value="Pricing">Pricing</option>
86+
<option value="SDK Questions">SDK Questions</option>
87+
<option value="Support">Support</option>
88+
<option value="Other">Other</option>
89+
</select>
90+
<input
91+
type="text" id="name" name="name"
92+
className="input text-ui" maxLength="256" placeholder="Name"
93+
onChange={handleChange} required
94+
/>
95+
<input
96+
type="email" id="email" name="email"
97+
className="input text-ui" maxLength="256" placeholder="Email"
98+
onChange={handleChange} required
99+
/>
100+
<textarea
101+
id="message" name="message"
102+
className="textarea text-ui" placeholder="Your message ..."
103+
onChange={handleChange} required
104+
/>
105+
<input
106+
type="submit" value="Send request"
107+
className="submitButton button-pill"
108+
disabled={State === "loading"}
109+
/>
110+
</form>
111+
) : (
112+
<div className="FormAccepted">
113+
<p className="AcceptedParagraph text-ui">
114+
{State === "success"
115+
? "Message has been sent :)"
116+
: State === "fail"
117+
? "Something went wrong. Please try again later."
118+
: "Sending..."}
119+
</p>
120+
</div>
121+
)}
72122
</>
73-
)
123+
);
74124
}
75125

76126
export default Form;

0 commit comments

Comments
 (0)