01 — Product Vision¶
Purpose¶
Define what QCObjects is, who it serves, and the principles every future decision MUST be judged against. This is the top of the authority chain: when specs conflict, the vision wins.
Source: QCObjects README (identity, principals, features, PWA adoption),
pinned at tag v2.5.142
(https://github.com/QCObjects/QCObjects/blob/v2.5.142/README.md).
Definitions below are authoritative; the README may be summarized in the future.
Scope¶
Covers the product identity across qcobjects (core), qcobjects-sdk,
qcobjects-cli, and app templates. Excludes release scheduling (see
15-unified-vision-v3.md).
Identity¶
- Name: QCObjects = Quick Components and Objects. The Q means Quick.
- Tagline: "An open-source framework that empowers full-stack developers to make micro-services and micro-frontends into an N-Tier architecture."
- Thesis: front-end and back-end coded together with a common syntax in pure
JavaScript. Cross-browser, cross-platform, cross-frame. No TypeScript, no
transpiler required to run; pure JavaScript with zero code dependencies.
Transpilers are NOT required but ARE allowed: apps MAY be authored in
TypeScript (templates ship
build:ts), and the framework itself is now authored natively in TypeScript (see 03-core-framework § TypeScript posture) with first-party type declarations. - Standard basis: ECMAScript® 2020 Language Specification
(ECMA-262). The
Classfactory (capital C) is the cross-browser declaration helper; recent versions ALSO accept native ESclass/extends+neweverywhere the factory works (see 03-core-framework § Native interop) — new code SHOULD prefer native syntax. - Interop: designed to compose with CSS frameworks (Foundation, Bootstrap) and mobile frameworks (PhoneGap, Onsen UI).
Principals (normative design laws, 0–25)¶
The framework was built on these principals. A proposal that violates one MUST justify the violation explicitly or be rejected.
- Type in JavaScript to code a JavaScript application.
- Everything is an object.
- Every object has a definition.
- On the front-end, any object can be stacked into the DOM or Virtual-DOM without re-declaring its definition.
- Every object has a body.
- A class SHOULD be the main definition of an object.
- A class SHOULD be easy to type as an object itself.
- Code SHOULD organise easily into packages.
- Code SHOULD scaffold cleanly into a clean architecture.
- A component is an entity with an object representation and a tag declaration; its content MUST be fillable remotely and locally. Its body is normally a stacked DOM element instance.
- A component can attach/detach from the DOM without losing functionality.
- A service call can be extended to scaffold its functionality.
- Packages MUST be importable remotely.
- Scaffolding MUST control server-side savings (no unnecessary remote calls) without boilerplate repetition.
- N-Tier applications MUST be codeable in a single language/syntax.
- Any template syntax/language MUST be applicable to a component.
- An already-represented HTML tag MUST NOT need duplicate instance definitions.
- The HTML shell stays clean; tag behaviour binds without affecting HTML syntax.
- Execution order MUST be readable from the code; component rendering MUST expose execution control in as many layers as needed.
- A layered pattern (MVC/MVCC) MUST be present for every component, whether or not every layer is explicitly defined.
- Component behaviour MUST NOT be determined by its rendering process.
- The DOM is split into a subjacent tree of attached elements: the QCObjects
Nested Components Stack (
global.componentsStack). - Component instances MUST be extendable with dynamic behaviour decoupled from the initial declaration.
- Simultaneous visual effects/animations MUST apply easily to any DOM element.
- Effects MUST be controllable from CSS or JavaScript without hurting performance.
- Behaviour MUST be controllable into-the-box and out-of-the-box.
Main features (binding catalogue)¶
- Built-in & custom templates for PWA and AMP.
- Revolutionary UI effects (see 04-sdk effects catalogue).
- Breakthrough backend micro-services (see 02-architecture).
- Objects- & Components-driven architecture; front-end + back-end full-stack.
- Recursive routing for components; built-in nested components management.
- Fully integrated MVC (Model, View, Controller); Dynamic Data Objects.
- N-Tier architecture concepts; one-step install (textfield / navigate-home).
PWA adopted features (normative)¶
- Prevent render-blocking resources: implemented via the
Packagefactory — imports resolve through packages, not blocking script tags. - On-demand resource load: visual resources inside a component render only
when the component builds itself; every component hangs on
global.componentsStack(instance + subcomponents tree); rebuilds reload resources on demand. - Lazy image loading (since 2.1.251):
lazy-srcattribute on<img>inside components; preloader insrc, real image inlazy-src; Intersection Observer API when available; omitlazy-srcfor normal loading.
Community & sustainability ( pointers, not norms)¶
- Demos: PWA live demo app (deployed at newapp.qcobjects.dev), Foundation/Materialize/raw-CSS samples, canvas manipulation example (see spec 07).
- DevBlog (Hashnode), explainer video, Product Hunt, CII Best Practices badge.
- Sponsorship/donations via the README links; Contributor Covenant
(
CODE_OF_CONDUCT.md); contributions perCONTRIBUTING.md.
Normative (umbrella)¶
- QCObjects MUST remain a full-stack framework for micro-services and micro-frontends in an N-Tier architecture — not a single-layer UI library.
- The platform MUST preserve three sovereign guarantees:
- No vendor lock-in — apps run on own infrastructure with own config.
- Local-first execution — routing, rendering, and orchestration work without calling vendor clouds.
- Metadata-driven behavior —
config.jsonis the source of truth; code MUST NOT hardcode credentials, paths, or routing. - Secrets and environment values MUST be injected via
$ENV(VAR)/$config(key)placeholders, never committed literally. - Developer experience MUST stay "one CLI in, running app out":
scaffold → serve (HTTP/2) → build → publish, all through
qcobjects-cli. - Every new capability SHOULD ship as a decoupled, keyword-discovered package (handler, server adapter, component set) rather than a core dependency.
Verification¶
- Any feature proposal cites which guarantee it strengthens and which principal (0–25) it obeys.
grep -r "process.env" src/in core repos returns no direct credential reads outside the$ENV()resolver.