Website profiles · Technology insights · Alternatives

brm.io

Projects and other things by @liabru · Matter.js · matchHeight · Fractal Gears · Kwyjibo · more

No paid content found
Visit website
Profile views 19 Outbound visits 47 Normal
code by @liabru · senior software engineer — product, web & front-end developer · london Full homepage screenshot

At a glance

Category
Development
Language
English
Paid-content signal
No paid content foundObserved
Registered
2014
Hosting
Google LLCInferred
HTTPS certificate trusted
PassedObserved
Last updated

Website review

This review may include AI-generated content and is not individually verified. Domain, certificate and other facts come from the observed data on this page.

What is brm.io?

brm.io is the personal project site of developer @liabru, a senior software engineer working in product, web, and front-end development in London. Rather than a company or a hosted service, it is a portfolio-style home for open-source libraries, browser experiments, and technical writing. The page lists work such as the Matter.js web physics engine, the matchHeight responsive equal-heights library, Fractal Gears, Kwyjibo real-time OCR, and a lighter theme for dat.gui.

What you'll find there

  • Libraries and tools you can adopt in your own projects, such as a physics engine for web animation and a utility for matching element heights in responsive layouts.
  • Experiments and demos, including generative animation and in-browser OCR, which are useful for seeing what is technically possible before committing to an approach.
  • Front-end writing, for example notes on Material Design typography in CSS, aimed at developers solving layout and styling problems.
  • Links out to code and contact, including GitHub and CodePen, so you can inspect source or follow the author's work.

Who it is for

The site suits front-end and creative developers looking for reusable JavaScript libraries, physics-based animation, or practical CSS techniques. Designers and technical leads may also find the demos helpful for judging feasibility. It is less relevant if you need a commercial product with support contracts, since the material is presented as an individual developer's projects.

How to use it

Start with the project that matches your immediate problem: a physics engine if you need realistic motion, or an equal-heights utility if you are fixing responsive card layouts. Check each project's own documentation and repository before adopting it, since maintenance and browser support will vary by project. If you want to compare the author's broader output or follow updates, the GitHub and CodePen profiles linked from the site are the practical next step.

What is Matter.js and how is it used?

Matter.js is a 2D rigid-body physics engine for the web, created by Liam Brummitt (@liabru) and listed on his personal site code by @liabru. It simulates gravity, collisions, friction, restitution and constraints in JavaScript, so objects in a page or canvas behave with plausible weight and momentum rather than following hand-authored animations. The site presents it simply as the "web physics engine," alongside the author's other projects such as matchHeight and Fractal Gears.

What it does

You define bodies — rectangles, circles, polygons or compound shapes — give them properties like mass and friction, add constraints such as springs or hinges, and let the engine step the simulation forward each frame. Because it handles the maths of contact and response, you can build interactive scenes without writing a collision solver yourself.

How it is typically used

  • Games and toys: stacking blocks, ragdolls, projectile puzzles, destructible structures.
  • Interactive interfaces: draggable objects, bouncing UI elements, playful loading screens.
  • Visualisations and art: generative motion pieces, particle-like scenes with real collisions.
  • Prototypes: testing whether a mechanic feels right before investing in a full engine or 3D approach.

It is commonly paired with a renderer — either Matter.js's own canvas renderer or a custom draw loop — and with a framework such as React or plain JavaScript for the surrounding UI.

Practical trade-offs

Choose Matter.js when Look elsewhere when
You want 2D physics with a small API and quick setup You need full 3D physics
Objects are simple shapes or compounds You need soft-body, fluid or cloth simulation
You want collisions and constraints, not photorealism You need a complete game engine with scenes, audio and asset pipelines

Performance depends on the number of bodies and how often you step the world; many small objects with continuous collision checks will cost more than a handful of large ones.

A concrete scenario

A developer building a puzzle game where the player drops shapes into a container can use Matter.js to handle stacking, tipping and settling, then read each body's position and angle to decide whether the level is solved. The physics does the hard part; the game logic stays simple.

Next step

Open the Matter.js documentation and run a minimal example: one ground body, one falling box, one render call. Once that runs, add a constraint and a mouse drag to feel how the engine behaves before committing to a larger design.

How does matchHeight help with responsive equal-height layouts?

matchHeight solves a specific, narrow problem: making a row of elements share the same height when their content naturally differs. On code by @liabru, it's listed alongside the author's other projects as a "responsive equal heights" library, which is the clearest signal of its intent — it recalculates and equalises heights as the viewport changes, rather than only at page load.

What it actually does for you

  • Equalises a group, not everything. You point it at a selector (typically a set of cards, columns or list items) and it makes every matched element as tall as the tallest one in that group. Independent groups stay independent, so one long card doesn't stretch an unrelated section.
  • Reacts to resizing. Because content reflows when the window narrows or widens, a one-off height fix goes stale. A responsive equal-heights library re-measures on resize, which is the main reason to use it instead of a single line of JavaScript.
  • Keeps the layout honest. The visual result is a clean baseline across a row, which matters most when cards contain variable text, tags or thumbnails.

When it's the right tool

Use it when your layout is row-based and you want equal heights within each row: pricing columns, product tiles, blog post summaries, dashboard widgets. It's a small, focused dependency rather than a full layout framework, so it fits projects that don't want to adopt a grid system just for this.

When to reach for CSS instead

Modern CSS handles many of these cases without JavaScript. If your cards sit in a flex row, align-items: stretch (the default) already equalises them. If they're in a grid, grid-auto-rows: 1fr or stretching grid items does the job. The trade-off:

Approach Best for Trade-off
Flexbox stretch Simple single-row card groups Wrapping rows equalise per line, which may or may not be what you want
CSS Grid with equal rows Predictable multi-row grids Requires the grid structure up front
matchHeight-style JS Rows built from floated or inline-block elements, or layouts you can't restructure Adds a script and a resize listener; heights are set after measurement

A concrete decision

If you're maintaining an older layout built on floats or inline-block, or you need equal heights across a row whose items wrap unpredictably, a JS equaliser is often the least invasive fix. If you're building fresh markup, try the CSS route first — it avoids the flash of unequal heights before the script runs, and it keeps working if JavaScript fails.

Next step: open the project page on code by @liabru, check the usage example against your own markup, and test it at a narrow width to confirm the re-measurement behaves as you expect.

What is Fractal Gears and what kind of generative animation does it create?

Fractal Gears is one of the generative animation experiments listed on code by @liabru. It sits alongside other motion and graphics projects such as Matter.js and Kwyjibo, but it is best understood as a creative-coding piece rather than a library or product: a self-contained visual experiment that produces animated, gear-like geometric motion.

Based on the name and the site's grouping of it as a "motion experiment," it most likely generates repeating, recursive gear shapes whose rotation and scaling create a fractal, hypnotic effect. That means the animation is procedural — the patterns are computed, not hand-drawn — and it plays continuously with nested or self-similar forms.

Who it suits

  • Developers and designers looking for inspiration for canvas or WebGL animation.
  • Anyone studying how simple rotation rules can produce complex, evolving motion.
  • People who enjoy generative art and want a short, visual demo rather than a tool.

How to use it Open the experiment on the site to watch it run, then view the page source or the author's related code links if you want to understand the technique. As a practical next step, note the motion principle — repeated rotation at different scales — and try reproducing a simplified version with a canvas loop. That exercise is more useful than copying the exact visuals.

One trade-off: like most generative experiments, it is meant to be watched and learned from, not integrated into production apps. If you need physics or layout behavior instead, the same site's Matter.js and matchHeight projects are the more practical starting points.

How does Kwyjibo perform real-time OCR?

Kwyjibo is listed on this site as a "Real-time OCR" project, but the page evidence does not describe its implementation, so the specific method it uses isn't stated here. What can be said is that the site positions it as an experiment alongside other browser-based demos, which suggests it runs in a web context rather than as a server-side document pipeline.

In practical terms, real-time OCR in a browser usually means capturing frames from a camera or canvas, converting them to a form a recognition engine can read, and running recognition repeatedly as new frames arrive. The trade-offs are latency versus accuracy: running on every frame gives faster feedback but costs more CPU and can produce flickering, unstable text, while running on a throttled interval or only when the image changes gives steadier results at the cost of responsiveness. A reader evaluating Kwyjibo should check whether it recognizes text continuously or on demand, how it handles low-contrast or rotated text, and whether processing happens locally in the browser or via a remote service.

If you want to understand the approach, the most reliable next step is to open the project from the site and test it with a known document, such as a printed page under ordinary room lighting, and watch how quickly the recognized text stabilizes. For background on the broader ecosystem, GitHub hosts the source and issue history for many OCR projects, and Tesseract.js demonstrates browser-based OCR you can compare against.

How can I contact or work with @liabru?

The site is the personal project hub of @liabru, a senior software engineer working on product, web and front-end development, based in London. It is a portfolio of code and experiments rather than a company or agency site, so the practical route to contact or collaborate is through the links listed on the page itself.

Ways to reach or work with @liabru

  • Contact link: The page includes a "contact" link among its main navigation items, alongside about, github and codepen. That is the intended starting point for enquiries.
  • GitHub: The page links to a GitHub profile, which is the natural place for code-level questions, bug reports and pull requests — particularly relevant given projects like Matter.js, a web physics engine.
  • CodePen: A CodePen profile is also listed, useful for discussing the front-end and animation experiments shown on the site, such as Fractal Gears.
  • About & work: The "About & work" and "About & Work →" sections describe his background and details, which is where to check before making a work enquiry.

What the portfolio suggests he works on

The listed projects span several areas, which helps frame what a collaboration might involve:

Project Area
Matter.js Web physics engine
matchHeight Responsive equal heights library
Fractal Gears Generative animation experiment
Kwyjibo Real-time OCR
Game physics from scratch Physics/game experiment
Material Design Typography in CSS CSS/typography
A lighter theme for dat gui Tooling/UI theming

Practical next step

If you have a specific proposal, lead with the project it relates to: a physics-engine bug or integration question belongs on GitHub, while a UI or animation collaboration is better raised through the contact link or CodePen. A short message naming the relevant project and the outcome you want will be easier to act on than a general "let's work together" note. For context on the open-source libraries mentioned, their repositories are the best place to confirm current maintenance and contribution guidelines.

Related questions

More questions →
What Does a Postal Code API Return? Fields, Formats, and Common Use Cases

A postal code API returns structured location data for a given ZIP Code or Canadian postal code. A typical response includes the code itself, city, state or province, county, latitude/longitude, and — where available — ZIP+4 detail. More complete services add time zone, area codes, boundary geometry, and demographic fields. You send a code (or an address), and the API sends back a machine-readable record you can store, validate, or display.

This article explains what those responses contain, how requests are usually shaped, and where postal code data fits into real applications.

First, clear up the word "code"

The keyword "code" is overloaded, and that causes real confusion for developers:

  • Postal code — the ZIP Code (U.S.) or postal code (Canada) that identifies a delivery area.
  • API key — the credential you use to authenticate your requests. It is not postal data.
  • Source code — the program you write to call the API.

When someone searches for "postal code API code," they usually want example request/response code for a postal code service. The rest of this article treats it that way.

What a postal code API actually returns

Response fields vary by provider and endpoint, but the core set is fairly consistent. A single-code lookup commonly returns:

Field Example Notes
Postal code 90210 The code you queried
City Beverly Hills May be one of several acceptable place names
State / Province CA Two-letter abbreviation
County Los Angeles Useful for tax, territory, and reporting logic
Latitude / Longitude 34.0901, -118.4065 Usually the centroid of the area
ZIP+4 90210-1234 Present only when a specific delivery segment is known
Time zone America/Los_Angeles Helps with scheduling and display
Area codes 310, 424 Regional phone context

Richer datasets add 90+ fields: boundaries, population, income, elevation, and more. You rarely need all of them — request only what your application uses.

A representative JSON response

{
  "postal_code": "90210",
  "city": "Beverly Hills",
  "state": "CA",
  "county": "Los Angeles",
  "latitude": 34.0901,
  "longitude": -118.4065,
  "timezone": "America/Los_Angeles",
  "area_codes": ["310", "424"]
}

XML responses carry the same information in tag form. Choose based on what your stack parses most easily; JSON is the common default.

Common request patterns

Most postal code APIs support four patterns. Knowing which one you need prevents wasted calls.

1. Lookup by code

You have a code and want its details. This is the simplest and fastest call.

GET /lookup?code=90210

2. Reverse lookup by address

You have a street address and want to confirm or complete the code. This is the pattern behind checkout address validation.

GET /validate?street=...&city=...&state=...

3. Radius search

You have a center point and want all codes within a distance. Useful for store locators and delivery zones.

GET /radius?code=90210&miles=10

4. Batch validation

You have a file of addresses and want them cleaned in bulk. Batch endpoints trade latency for throughput and usually have their own limits.

Handling missing and ambiguous matches

Real data is messy. Plan for these cases:

  • No match — the code doesn't exist or the address is malformed. Return a clear error rather than a silent empty object.
  • Multiple matches — a city name may map to several codes, or a code may span several acceptable city names. Decide whether to pick the primary or return a list.
  • Partial match — the street is valid but the ZIP+4 isn't. Fall back to the 5-digit code.
  • Stale data — codes are added, retired, and reassigned. Refresh your dataset on a regular schedule.

A practical rule: validate at the point of entry, store the normalized result, and never re-derive it later from raw user input.

Practical use cases

  • Checkout address validation — catch typos before shipping, reduce failed deliveries.
  • Shipping zone lookup — map a code to a zone, carrier route, or rate table.
  • Data enrichment — append county, coordinates, or demographics to existing records.
  • Store and service locators — radius search to find nearby branches or coverage areas.
  • Territory and tax logic — county and boundary data drive jurisdiction rules.

Licensing and data-source considerations

Postal code data originates with national authorities — USPS in the United States and Canada Post in Canada. Providers license and repackage it, which is why accuracy, update frequency, and field coverage differ between services. Before committing:

  • Confirm the data source and how often it refreshes.
  • Check whether ZIP+4 and boundary data are included or sold separately.
  • Review usage limits and whether batch processing is allowed.
  • Read the license terms for redistribution and storage.

Pricing and plan details change, so check the provider's current documentation rather than relying on secondhand figures.

Getting started

  1. Decide which request pattern you need (lookup, reverse, radius, or batch).
  2. Pick the fields you'll actually store.
  3. Write a small test call and inspect the raw response.
  4. Add error handling for no-match and ambiguous cases.
  5. Cache results where the same codes repeat.

A postal code API is ultimately a translation layer: you give it a code or an address, and it gives back structured location facts. Understand the fields, match them to your use case, and handle the messy edges — that's most of the work.

Website Overview

Limited stack disclosure and few obvious backend markers suggest a more restrained public footprint. That reduces easy fingerprinting clues but is not proof of overall security. An established domain and managed infrastructure suggest continuity of operations and may support dependable delivery, although neither guarantees service quality.

Domain and Registration

Registered in 2014, this domain has about 12 years of history. That suggests continuity, although ownership and purpose may have changed. Transfer-protection status is present, helping reduce the risk of unauthorized domain transfers. The registrar is Porkbun LLC, a widely used domain service provider. The domain uses the common .io extension, which is not an independent safety signal.

DNS and Email

The observed email authentication setup is incomplete: DMARC is missing. Nameservers are provided by porkbun.com, indicating managed DNS hosting. MX records point to the porkbun.com email service. No CNAME was found; the observed records resolve directly to addresses. TXT records include verification markers for Google. Such markers may also remain after a service stops being used.

TLS and Certificates

The certificate uses an RSA 2048-bit public key, offering broad client compatibility. The server supplied a complete certificate chain. No organization name is present in the certificate; the available fields are consistent with domain validation. The certificate was issued within the Google Trust Services cloud or CDN ecosystem. The certificate's total validity is about 90 days, consistent with a short renewal cycle.

HTTP and Browser Security

The checked browser-security headers were not detected, leaving fewer explicit browser-side safeguards. No X-Powered-By header was found, reducing one common source of backend fingerprinting information. No obvious internal addresses or debug information were found in the headers. The Server header contains the custom value Google Frontend. No explicit CDN or WAF marker was found in the response headers.

Technology Stack Analysis

No obvious technology stack is exposed. This may reflect restrained information disclosure, although the underlying technologies remain unknown.

Search and Social Sharing

The title has 88 characters and may be truncated in search results. Open Graph is partially configured; og:description is missing. Twitter Card metadata is configured. A meta description is present, with 95 characters. The observed directives allow indexing and link following.

Hosting and Email

DNSporkbun.com
HostingGoogle LLC
Emailporkbun.com
Approximate IP geolocation (inferred; a CDN or proxy may differ from the origin server) United States flagUnited States Inferred 216.239.32.21

Registration details

RDAP / WHOIS

RegistrarPorkbun LLC
Registered2014-02-06
Expires2028-02-06
Domain statusclientDeleteProhibited https://icann.org/epp#clientDeleteProhibited、clientTransferProhibited https://icann.org/epp#clientTransferProhibited
Nameserverscuritiba.ns.porkbun.com、fortaleza.ns.porkbun.com、maceio.ns.porkbun.com、salvador.ns.porkbun.com
DNSSECunsigned

DNS records

DNS

TypeNameValueTTLPriority
Abrm.io216.239.32.21600—
Abrm.io216.239.34.21600—
Abrm.io216.239.36.21600—
Abrm.io216.239.38.21600—
AAAAbrm.io2001:4860:4802:32::15600—
AAAAbrm.io2001:4860:4802:34::15600—
AAAAbrm.io2001:4860:4802:36::15600—
AAAAbrm.io2001:4860:4802:38::15600—
MXbrm.iofwd1.porkbun.com6001
MXbrm.iofwd2.porkbun.com6001
MXbrm.iofwd1.porkbun.com60010
MXbrm.iofwd2.porkbun.com60020
NSbrm.iocuritiba.ns.porkbun.com86400—
NSbrm.iofortaleza.ns.porkbun.com86400—
NSbrm.iomaceio.ns.porkbun.com86400—
NSbrm.iosalvador.ns.porkbun.com86400—
TXTbrm.iogoogle-site-verification=pbEPXOOKziIc4UHS1dmjQ3hKKNm2eBrA354Ml4nvvHU600—
TXTbrm.iov=spf1 include:_spf.porkbun.com ~all600—

TLS and certificates

TLS / SSL

AssessmentNormal configuration
Supported protocolsTLSv1.2、TLSv1.3
Negotiated protocolTLSv1.3
Certificate subjectbrm.io
IssuerGoogle Trust Services
Valid until2026-11-24T18:24 · Remaining when checked: 61 days
Verification detailsCertificate trust: Passed · Hostname match: Passed

HTTP response headers

HTTP

HeaderValue
content-typetext/html
cache-controlpublic, max-age=600
serverGoogle Frontend

Identified technologies

Technology stack: Unknown

Pages, Search and Sharing

Meta descriptionProjects and other things by @liabru · Matter.js · matchHeight · Fractal Gears · Kwyjibo · more
Canonical URLhttps://brm.io/
LanguageEnglish (default)
Twitter Cardsummary
googlebot-image 0 allowed · 1 disallowed
  • Disallow/
All bots 0 allowed · 10 disallowed
  • Disallow/img
  • Disallow/css
  • Disallow/js
  • Disallow/files
  • Disallow/fonts
  • Disallow/about
  • Disallow/info
  • Disallow/work
  • Disallow/matter-js-demo-master
  • Disallow/matter-js-docs-master

User reviews (0)

  • No reviews yet.