BLADE for Oracle Communications · Open source
Integrate your app into the Oracle Communications stack.
Oracle Communications runs the call. BLADE is the layer that lets a capability the stack doesn't have plug straight into that call: your service, another vendor's, or a system the customer already runs, woven into the live call instead of bolted on beside it.
Shipped artifacts across 130 unique packages — every WAR, EAR and JAR audited package by package.
Production SIP services out of the box: registrar, proxy, balancer, transfer, hold, queue, presence, analytics, access control.
Browser-based admin tools, deployed as one EAR in one step. No SSH session required.
A custom enterprise routing application: subclass the framework's iRouter base, override two factory methods, done.
Why Vorpal exists
The features OCCAS doesn't have, added without leaving it
OCCAS decides the call. A contact center needs a great deal that OCCAS was never meant to do. BLADE makes OCCAS an integration point: reach into the systems the customer already runs, chain in another vendor's application, or plug in a capability the stack lacks, all woven into the live call rather than bolted on beside it.
Reach into the systems already running
REST, LDAP and database connectors, circuit-broken so a slow backend never drags the call into a timeout. Look up the caller, score the risk, pull the account, mid-call.
Chain in another application
The application router branches on anything in the message and hands the call to another SIP application, yours or a third party's, then takes it back. Build one service out of many parts.
Bring your own media
The media layer is the Java standard, JSR-309, so any compliant media server plugs into the call the same way. Gryphon is ours; a customer is never locked to it.
What gets integrated is whatever the contact center already runs: speech, transcription and translation; identity, verification and fraud scoring; CRM lookups and agent screen-pop; recording, archival and compliance; analytics and workforce systems; chatbots and self-service front doors. The customer chooses the vendor. BLADE brings it into the live call.
What ships
A framework, a router, and the services you were going to write anyway
BLADE is not a stack you assemble. Every module below builds from one Maven reactor and deploys into an existing OCCAS domain.
The core idea under all of it: a whole call is one readable, top-to-bottom method, not logic scattered across a dozen handlers. That is also why dropping in a third party is cheap. You add it to the flow, not to a maze.
Before · a call across scattered handlers
public class B2buaServlet extends SipServlet {
protected void doInvite(SipServletRequest alice) {
SipSession bob = linkNewSession(alice);
alice.getSession().setAttribute("peer", bob);
bob.setAttribute("alice", alice); // breadcrumb
createOutbound(bob, alice).send();
}
protected void doSuccessResponse(SipServletResponse res) {
SipSession bob = res.getSession();
SipServletRequest alice =
(SipServletRequest) bob.getAttribute("alice");
bob.setAttribute("bobResponse", res); // breadcrumb
alice.createResponse(res.getStatus()).send();
}
protected void doAck(SipServletRequest ack) {
SipSession bob =
(SipSession) ack.getSession().getAttribute("peer");
SipServletResponse res =
(SipServletResponse) bob.getAttribute("bobResponse");
res.createAck().send(); // breadcrumb
}
// ...plus doBye(), doCancel(), doErrorResponse(),
// doProvisionalResponse(). Every attribute saved
// and restored by hand, in order.
}
After · one BLADE callflow, anything drops in
public class B2buaCallflow extends Callflow {
public void process(SipServletRequest aliceRequest) {
SipServletRequest bobRequest =
createRequest(aliceRequest);
sendRequest(bobRequest, (bobResponse) -> {
SipServletResponse aliceResponse =
createResponse(aliceRequest, bobResponse);
sendResponse(aliceResponse, (aliceAck) -> {
SipServletRequest bobAck =
createAcknowledgement(bobResponse, aliceAck);
sendAcknowledgement(bobAck, bobResponse);
});
});
}
}
// The call is a straight line. Slot a lookup, a
// vendor, or a media step in wherever you need it.
Lambda callflows
Express entire SIP conversations as readable, top-to-bottom code. B2BUA, proxy and transfer patterns ship ready to extend.
JSON-driven configuration
Dynamic config with JSON Schema validation and hot reload over JMX. No restart to change behavior.
SIP-aware logging
Structured logs that render sequence diagrams, with per-application log files and ANSI color in the terminal.
SDP model
A real parse/serialize SDP object model, plus RFC 3264 hold, mute and resume in framework.v3.media.
Circuit-broken lookups
REST, LDAP and JDBC enrichment with breakers, so a flaky backend stops dragging calls through timeouts.
Analytics
Call detail records and multi-tenant analytics — one database serving many customers, each seeing only its own calls.
FSMAR — Finite State Machine Application Router
Chain applications together into sophisticated services. Route on any data in the message — headers, JSON, XML, SDP, regex captures — with templated destinations like sip:${To.user}@proxy. Routing state survives cluster failover.
iRouter — universal config-driven proxy
A two-phase enrichment-then-routing pipeline, edited entirely in the Configurator. Connectors run off the container thread; the routing decision is re-dispatched onto a SIP thread. Prints as a dial-plan report.
Visual flow editing
Draw the router as a diagram, simulate a route, replay a captured call over it, and watch a live heat overlay of where real traffic is going. Publish straight to the running cluster.
Proxy Balancer
Selection strategies, endpoint health tracking, a geographic map and a live operations console with round-trip times, history and counters.
Proxy-Registrar
services/proxy-registrar
A small, elegant SIP proxy-registrar.
iRouter
services/irouter
Universal config-driven SIP proxy.
Proxy-Balancer
services/proxy-balancer
Load balancing with endpoint health.
ACL
services/acl
Allow or deny calls through the system.
Proxy-Block
services/proxy-block
Rule-based call blocking and rejection.
Queue
services/queue
Call queuing and distribution.
Transfer
services/transfer
REFER-based blind and attended transfer.
Hold
services/hold
Music and media on hold.
Presence
services/presence
Maintains endpoint state.
TPCC
services/tpcc
Third-party call control.
Options
services/options
Controls SIP OPTIONS behavior.
Analytics
services/analytics
CDRs and multi-tenant reporting.
Test UAC — load generator
CPS and concurrent-call modes with a REST API for start, stop and status. 1000+ calls per second from a single node.
Test UAS — configurable server
Response status, delay and duration set per call over REST or straight from SIP URI parameters, with error-map routing.
Scenario-driven test console
An enterprise SIP test suite you drive from the browser — together the UAC and UAS replace SIPp for production performance tuning.
Test B2BUA
A worked B2BUA example to copy from when you start your own application.
Operations
Operate it from a browser, not an SSH session
Twelve admin applications deploy to the WebLogic AdminServer behind a single portal and a single login. Every one of them is a skinny WAR — no third-party JAR ships inside it.
/blade/configurator
Configurator
Every service's configuration edited through forms generated live from its JSON Schema — version history, validation, guided dropdowns for known keys, one-click publish to the running cluster. No restarts.
/blade/flow
Flow
Draw the FSMAR routing plan as a diagram, run the route simulator against it, replay a real call, and watch a live heat overlay of production traffic. Exports real SVG and a printable routing plan.
/blade/tuning
Tuning
OCCAS, WebLogic and JVM tuning with one-click Recommended presets encoding high-CPS heuristics, a read-only Health Check that flags latency-killing misconfigurations, and JDK 21 low-pause GC set up correctly.
/blade/callflow
Trace
Follow a single call through every application that touched it, rendered as a sequence diagram rather than a haystack of log lines.
/blade/logs
Logs
Tail every node in the cluster from one page, with per-server minimum severity set from the Tuning app.
/blade/api
API Explorer
Live-discovered, deep-linkable OpenAPI documentation for every running service, alongside a browsable Javadoc site with generated UML class diagrams.
Also in the portal: CRUD editor, file management with versioned backups, analytics administration with one-click JMS provisioning, and printable reports from the Tuning, Balancer, Trace, iRouter and Flow apps.
Carrier-grade
Built for the night the backend goes down
BLADE runs in clustered, 1000+ CPS deployments where every node operates independently. There are no singletons and no single point of failure — by design, not by configuration.
- Graceful overload drain. When an engine is overloaded it tells the load balancer to stop sending new calls; in-flight calls finish undisturbed.
- Circuit breakers on REST, LDAP and database lookups — and the NOC gets exactly one SNMP trap down and one up per outage, not a trap storm.
- NMS-ready monitoring using the standard MIB your operations team already has.
- Predictable, bounded pause times from a low-pause GC configuration the Tuning app sets up for you.
- State that survives the node. Callflow and routing state both serialize, so a failed engine costs you nothing visible.
// 1. Engine crosses its load threshold.
engine.load > threshold
// 2. BLADE signals the balancer — new calls stop.
OPTIONS → 503 Service Unavailable
Retry-After: 0
// 3. Calls already up are never touched.
inFlight → continue to completion
// 4. Load falls; the engine advertises itself again.
OPTIONS → 200 OK
// One SNMP trap down. One up. Nothing in between.
Security
Scan-clean by design, not by patch
The entire dependency tree was audited package by package. Legacy libraries were removed outright rather than patched around.
One place to patch
Application WARs carry only BLADE code. Every third-party library lives in one centrally-managed shared library, so a single bump patches the whole fleet at once.
Minimal attack surface
Sites with strict scanning policies can run headless: config auto-publish with no UI, no servlets, no login page. Nothing to probe.
Locked down by default
Changes go live only by explicit operator action. File editing is deny-by-default whitelist with path-traversal guards and automatic versioned backups.
Exact-origin CORS
Allowlist only — wildcards are intentionally unsupported. Not a setting you can get wrong in a hurry.
Credentials can't leak
Four independent safeguards stop a password being committed by accident. Environment configuration files never ship in the repository.
Air-gap friendly
Zero CDN dependencies anywhere in the admin tier. Everything an operator loads is served by your own domain.
Zero known vulnerabilities across all 34 shipped artifacts and 130 unique packages, verified against CVE databases current as of the dependency audit. Rescan before you rely on it — see SECURITY.md.
Deployment
Four tiers, one command
One environment file is the single source of truth — admin URL, per-tier
WebLogic targets, engine node list, application allowlist. Then
./deploy.sh <env> does the whole domain in dependency-safe order.
Shared library
blade-shared — every third-party JAR, deployed once to both the AdminServer and the cluster.
Application router
The FSMAR fat JAR, dropped into the OCCAS approuter/ directory. Engine-tier restart.
Admin applications
Skinny WARs to the AdminServer, behind one portal and one login page.
Services
Individual service WARs to the OCCAS cluster — the engine tier that actually handles calls.
# One-time: install the OCCAS JARs from $MW_HOME
$ ./bootstrap.sh
# Build. Platform is detected from $MW_HOME.
$ ./build.sh production
# Sanity-check the whole environment first
$ ./deploy.sh production --dry-run
# shared → fsmar → admin → services, in order
$ ./deploy.sh production
# ...or just one tier
$ ./deploy.sh production services
Targets OCCAS 8.0 through 8.3 (JDK 8, 11, 17 and 21). Switch platforms by
re-pointing $MW_HOME — no edits to build configuration.
In production
Thirteen years in the making
- SCALE Tested against the largest healthcare call center in North America.
- CRITICAL 911 traffic from a nationwide satellite-radio provider passes through BLADE.
- CARRIER Going into deployment at a top-three global carrier.
- SUPPORT Backed by a 300-consultant systems integrator and an enterprise platform sales organization.
Customer names are withheld by agreement. Prospective customers: we will put you on a call with a working architect who runs it.
One example, ours · built on BLADE
Our own plug-in: in-network media and voice AI
Gryphon is the plug-in Vorpal built through the same JSR-309 seam any vendor uses: an in-network media server with voice AI, on the OCI Arm hardware the calls already run on, with the audio never leaving the network. It is one example of what fits into the Oracle stack, and a customer is never locked to it.
Concurrent media streams per node, zero RTP loss, first audio under 60 ms. Anchor, play, record, DTMF and N-party mix, standards-compliant JSR-309.
To rehome a live call when a media server dies: callers lose about 20 ms of sound. Control-plane loss reattaches in ~150 ms with no gap at all.
Equal-error rate of the in-network deepfake detector, scored inline on 100% of calls on Arm cores, measured on the In-the-Wild corpus at the telephony band.
The voice models are int8 on Ampere Arm cores, the same silicon the media server runs on. No NVIDIA fleet, and the audio never leaves the network.
Your audio never leaves the network
Every cloud voice-AI ships call audio to an API. Gryphon runs the models on the box the call already flows through. For healthcare, finance and government that is a procurement gate, not a feature.
It can act on the call
Because BLADE owns the SIP leg, Gryphon can transfer, whisper, barge, mute or conference-in mid-call, on a spoken command or a risk score. Cloud AI listens beside the call. Gryphon is in it.
No GPU fleet
Audio is integer math, and so is quantized inference. The models run int8 on Ampere Arm cores, the same silicon the media server uses. The part that sounds exotic is the part that makes it cheap.
On-net agents
Several tiny agents share one call
The models are small enough to stack. On one live call the ears transcribe while the caller is still talking, four attendants share the floor each in its own voice, and the scam detector scores the audio every second. The model is the mouth and the ears, never the brain: a deterministic layer keeps deciding.
- Small enough to stack: several agents on one call, and 128 conversations on a single node.
- Live on real PSTN calls since August, floor-arbitrated so agents take turns and yield when you talk over them.
- All on Arm CPU cores. No GPU anywhere, and the audio never leaves the node.
// On one live call, at once:
ears (ASR) → int8 · ~7 streams / core
understanding → 0.5B · int4 · 4 cores · ~250 ms
intent → 23 MB embedding · ~10 ms
voice (TTS) → live · ~100 ms / sentence
scam score → 1.6 MB int8
// Four attendants share the floor. A node holds 128.
Headline proof point
A scam detector that lives where the call flows
The synthetic-voice detector is not a cloud call-out. It is a 1.6 MB int8 model scoring the caller's audio in-process, on every call, on the media box's own Arm cores. It costs about 3% of one core per call. When a score crosses the line, the application already owns the SIP leg, so it can whisper the agent, barge, or drop.
- 9.55% EER on In-the-Wild at the telephony band, 0.11 points off a teacher model 200 times its size.
- Inline on 100% of calls as Tier 1; a heavier model (7.19% EER) confirms only the calls Tier 1 flags.
- A signal, not a verdict. Gryphon fuses it with signaling and provenance; your application decides.
// Tier 1: inline, every call, on the media box.
w2mid.int8.onnx → 1.55M params · 1.6 MB int8
In-the-Wild EER → 9.55% (8 kHz telephony)
cost → ~3% of one core / call
// A risk score is a signal. The app owns the call.
score > threshold → whisper · barge · transfer · drop
// Tier 2: heavier model, only on flagged calls.
In-the-Wild EER → 7.19%
Every number here was measured on Vorpal's own OCI Arm rig, none projected, and the detector runs in the call path today. It is live in Ashburn. Call it.
On the roadmap
What the callflow model unlocks next
The same properties that make callflows readable — straight-line code, state that serializes itself, a router that can branch on anything in the message — make the next generation of call handling tractable.
Verified and branded calling
STIR/SHAKEN attestation and Rich Call Data. Verify on inbound INVITE and surface the verified name and logo into the callflow as session attributes any downstream application can read; sign and attach per-call RCD on outbound. Sign-on-INVITE is a callflow, which is exactly why this is straightforward here and static everywhere else.
More in-network intelligence
The same media tap that carries the scam detector carries the next models: live translation and captioning, sentiment and escalation, compliance keyword monitoring. Each rides the pipeline Gryphon already runs, scored on the box, the audio still never leaving.
Read the code. It's the whole pitch.
BLADE is MIT licensed and public. Clone it, point $MW_HOME at your
OCCAS install, and have a callflow running this afternoon.