CaptchaAPI
privacy CAPTCHA · EUProof-of-work CAPTCHA, GDPR-first. No tracking, no Google. Ships with its own Laravel package and WordPress plugin.
vladislav@rajtik:~$ whoami
Senior PHP / Laravel Engineer
available now for new contracts
vladislav@rajtik:~$ cat about.md
vladislav@rajtik:~$ ls projects/
Proof-of-work CAPTCHA, GDPR-first. No tracking, no Google. Ships with its own Laravel package and WordPress plugin.
Issue invoices over a clean REST API. Built for developers who'd rather call an endpoint than click through accounting software.
Passive-tree & build-diff tooling for Path of Exile 2. GGPK parsing published as npm packages under @poe2-toolkit.
A Czech-language blog where I write about Laravel and day-to-day backend engineering.
vladislav@rajtik:~$ cat packages.json --published
ships across 3 ecosystems: Composer · WordPress.org · npm
vladislav@rajtik:~$ cat captchaapi/laravel src/Rules/ValidCaptcha.php
final class ValidCaptcha implements ValidationRule
{
public function validate(string $attribute, mixed $value, Closure $fail): void
{
// Fortify runs the validator twice in one request. The response is
// single-use server-side, so the second verify would reject a visitor
// who already passed. Memoize a success per request, short-circuit it.
if ($this->isMemoized($memoKey)) {
return;
}
try {
$response = Http::asJson()->withToken($secret)
->timeout(Captchaapi::verifyTimeout())
->post(Captchaapi::verifyUrl(), ['response' => $value]);
} catch (ConnectionException) {
$this->whenUnavailable($fail); // outage -> fail policy, no retry
return;
}
if ($response->serverError()) { // a 5xx is our fault, not the user's
$this->whenUnavailable($fail);
return;
}
$response->json('success') === true
? $this->memoize($memoKey)
: $fail($this->rejectionMessage());
}
} vladislav@rajtik:~$ git log --oneline --career
vladislav@rajtik:~$ cat stack.txt
vladislav@rajtik:~$ contact --now
vladislav@rajtik:~$ cv --download
vladislav@rajtik:~$