# auth/session.pyconstant time in both branchesfrom secrets import token_urlsafefrom argon2 import PasswordHasher, exceptionshasher = PasswordHasher( time_cost=3, memory_cost=65536, parallelism=4,)defverify(user, password: str) -> bool:"""An unknown user must cost the same as awrong password, or the timing leaks the answer.""" stored = user.password_hash if user else DUMMY_HASHtry: hasher.verify(stored, password)except exceptions.VerifyMismatchError:returnFalsereturn user is notNonedefissue_session(user, request) -> str: token = token_urlsafe(32) store.put( key=sha256(token), # never store the token itself user_id=user.id, ip=request.remote_addr, expires=now() + timedelta(hours=12), )return token# net/policy.tfdefault deny, then open what is neededresource"firewall_rule""deny_all" { direction = "ingress" priority = 65535 action = "deny"}resource"firewall_rule""allow_https" { source_ranges = ["0.0.0.0/0"] ports = [443] priority = 1000}
# auth/session.pyconstant time in both branchesfrom secrets import token_urlsafefrom argon2 import PasswordHasher, exceptionshasher = PasswordHasher( time_cost=3, memory_cost=65536, parallelism=4,)defverify(user, password: str) -> bool:"""An unknown user must cost the same as awrong password, or the timing leaks the answer.""" stored = user.password_hash if user else DUMMY_HASHtry: hasher.verify(stored, password)except exceptions.VerifyMismatchError:returnFalsereturn user is notNonedefissue_session(user, request) -> str: token = token_urlsafe(32) store.put( key=sha256(token), # never store the token itself user_id=user.id, ip=request.remote_addr, expires=now() + timedelta(hours=12), )return token# net/policy.tfdefault deny, then open what is neededresource"firewall_rule""deny_all" { direction = "ingress" priority = 65535 action = "deny"}resource"firewall_rule""allow_https" { source_ranges = ["0.0.0.0/0"] ports = [443] priority = 1000}
Constant-time authentication and a default-deny firewall policy.
Penetration testingZero-trust accessCisco and MikroTikLinux hardeningWeb and API developmentBackup and disaster recoveryDocker and KubernetesSIEM and monitoringISO 27001 readinessCI/CD pipelinesPenetration testingZero-trust accessCisco and MikroTikLinux hardeningWeb and API developmentBackup and disaster recoveryDocker and KubernetesSIEM and monitoringISO 27001 readinessCI/CD pipelines
Six disciplines, one accountable team.
Most companies buy their developer, their security auditor and their
network engineer from three different vendors, then own every gap between them. We cover
the whole stack, so nothing falls between the seams.
Software engineering
Web platforms, internal tools, APIs and automation, built to a specification you actually own. Clean architecture, readable code, tests where they earn their keep, and a repository handed over with documentation instead of a mystery.
Web appsREST and GraphQL APIsAutomationIntegrationsLegacy rescue
Cybersecurity
Authorised penetration testing, security audits and hardening. Findings are ranked by real business impact, with a fix plan your team can follow.
Networks designed on paper before anyone touches a cable: segmentation, routing, VPN, wireless and firewalls that stay understandable a year later.
LAN and WANFirewallsVPNWi-Fi design
Cloud and infrastructure
Linux servers, virtualisation, containers and deployment pipelines. Provisioned as code, monitored from day one, and backed up in a way that has actually been restored at least once, because an untested backup is a rumour rather than a recovery plan.
LinuxDockerCI/CDMonitoringBackup and DR
Managed IT
Day to day support, patching, asset tracking and a help desk that answers.
Help deskPatchingSLA
Consulting and compliance
Security policy, access reviews, ISO 27001 readiness and staff awareness training.
The people who build it are the people who secure it.
One team, end to end. The developer, the network engineer and the security reviewer sit in the same room, so a finding becomes a fix instead of a ticket that gets forwarded.
Vendor neutral. We are not resellers. We recommend what fits your budget and your team's skills, including the boring option when the boring option is right.
Plain-language reporting. Every audit and project ends with a document a non-technical director can act on and a technical lead can implement.
No lock-in. Credentials, source code, diagrams and runbooks are yours from day one, handed over rather than held hostage.
Four steps, no surprises.
Fixed scope before we start, weekly visibility while we build, and a
handover you can hold us to.
Assess
We map what exists (code, servers, network, access) and where the real risk sits. You get the findings even if you stop here.
Design
A written plan with scope, timeline and cost. Nothing starts until you have approved what done means.
Build and harden
We implement in reviewable increments. Security checks run alongside the build instead of arriving as an afterthought at the end.
Operate
Monitoring, patching and a named contact. Or a full handover with runbooks, if your team takes it from here.
Tell us what is keeping you up at night.
A short call, an honest read on the problem, and a written scope if it makes sense to work together. No obligation and no sales script.