@wenathlan/cobaia 2.0.155 → 2.0.159
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.dev.vars.example +3 -0
- package/.dockerignore +41 -0
- package/.env.example +9 -0
- package/.gitattributes +36 -0
- package/.nvmrc +1 -0
- package/App.tsx +4 -4
- package/CHANGELOG.md +10 -0
- package/Dockerfile +4 -1
- package/README.md +5 -0
- package/SECURITY.md +27 -0
- package/acceptableusepolicy.md +9 -0
- package/authors.md +16 -0
- package/biome.jsonc +3 -3
- package/bugreport.md +16 -0
- package/bun.lock +156 -32
- package/cla.md +9 -0
- package/cli.ts +114 -0
- package/cobaia.csproj +22 -0
- package/cobaia.gemspec +14 -0
- package/cobaia.java +16 -0
- package/codeofconduct.md +9 -0
- package/content.ts +2 -2
- package/contributing.md +9 -0
- package/copyright.md +7 -0
- package/db.ts +2 -2
- package/disclaimer.md +7 -0
- package/docs/features.md +58 -0
- package/docs/monetization.md +61 -0
- package/eula.md +7 -0
- package/exportcontrol.md +17 -0
- package/governance.md +9 -0
- package/notice.md +7 -0
- package/package.json +21 -14
- package/pnpm-workspace.yaml +41 -20
- package/pnpmboot.package-lock.json +157 -0
- package/pnpmboot.package.json +6 -0
- package/pom.xml +29 -0
- package/privacypolicy.md +9 -0
- package/pullrequesttemplate.md +13 -0
- package/{Sol → sol}/Sol.tsx +2 -2
- package/{Sol → sol}/apps/apps.tsx +1 -1
- package/{Sol → sol}/blog/blog.tsx +1 -1
- package/{Sol → sol}/home/home.tsx +2 -2
- package/{Sol → sol}/intro/intro.tsx +1 -1
- package/{Sol → sol}/legal/legal.tsx +1 -1
- package/{Sol → sol}/notfound/notfound.tsx +1 -1
- package/{Sol → sol}/pricing/pricing.tsx +1 -1
- package/{Sol → sol}/shell/Shell.tsx +1 -1
- package/{Sol → sol}/sol.css +7 -0
- package/{Sol → sol}/support/support.tsx +1 -1
- package/{Sol → sol}/wingets/index.ts +1 -1
- package/support.md +7 -0
- package/termsandconditions.md +9 -0
- package/termsofuse.md +9 -0
- package/tests/sandboxmodality.test.ts +4 -4
- package/thirdpartynotices.md +7 -0
- package/trademarkpolicy.md +7 -0
- package/tsconfig.json +1 -1
- package/vite.config.ts +3 -3
- package/vitest.config.ts +2 -2
- package/docs/.gitkeep +0 -0
- /package/{Sol → sol}/wingets/IntroFooter.tsx +0 -0
- /package/{Sol → sol}/wingets/IntroPlans.tsx +0 -0
- /package/{Sol → sol}/wingets/IntroSplash.tsx +0 -0
- /package/{Sol → sol}/wingets/ShellAdsslot.tsx +0 -0
- /package/{Sol → sol}/wingets/ShellBrand.tsx +0 -0
package/cobaia.csproj
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
<Project Sdk="Microsoft.NET.Sdk">
|
|
2
|
+
<PropertyGroup>
|
|
3
|
+
<TargetFrameworks>netstandard2.0;netstandard2.1</TargetFrameworks>
|
|
4
|
+
<AssemblyName>cobaia</AssemblyName>
|
|
5
|
+
<RootNamespace>cobaia</RootNamespace>
|
|
6
|
+
<PackageId>cobaia</PackageId>
|
|
7
|
+
<Version>2.0.159</Version>
|
|
8
|
+
<Authors>wenathlan</Authors>
|
|
9
|
+
<Description>Distribution package containing the cobaia documentation set and the tests directory. cobaia is the monetization surface — the plans, the support rails and the honest advertisement slots.</Description>
|
|
10
|
+
<PackageLicenseExpression>GPL-3.0-only</PackageLicenseExpression>
|
|
11
|
+
<PackageProjectUrl>https://github.com/wenathlan/devthink</PackageProjectUrl>
|
|
12
|
+
<RepositoryUrl>https://github.com/wenathlan/devthink</RepositoryUrl>
|
|
13
|
+
<PackageReadmeFile>README.md</PackageReadmeFile>
|
|
14
|
+
<PackageRequireLicenseAcceptance>false</PackageRequireLicenseAcceptance>
|
|
15
|
+
<EnableDefaultCompileItems>false</EnableDefaultCompileItems>
|
|
16
|
+
</PropertyGroup>
|
|
17
|
+
<ItemGroup>
|
|
18
|
+
<None Include="README.md" Pack="true" PackagePath="/" />
|
|
19
|
+
<None Include="docs/**/*" Pack="true" PackagePath="contentFiles/any/any/docs/" />
|
|
20
|
+
<None Include="tests/**/*" Pack="true" PackagePath="contentFiles/any/any/tests/" />
|
|
21
|
+
</ItemGroup>
|
|
22
|
+
</Project>
|
package/cobaia.gemspec
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
Gem::Specification.new do |spec|
|
|
2
|
+
spec.name = "cobaia"
|
|
3
|
+
spec.version = ENV.fetch("COBAIA_VERSION", "2.0.159")
|
|
4
|
+
spec.authors = ["wenathlan"]
|
|
5
|
+
spec.email = ["support@users.noreply.github.com"]
|
|
6
|
+
spec.summary = "The cobaia documentation and tests envelope (the monetization surface — the plans, the support rails and the honest advertisement slots)."
|
|
7
|
+
spec.description = "Distributes the cobaia documentation set and the tests directory as one Ruby gem. cobaia is the monetization surface — the plans, the support rails and the honest advertisement slots."
|
|
8
|
+
spec.homepage = "https://github.com/wenathlan/devthink"
|
|
9
|
+
spec.license = "GPL-3.0-only"
|
|
10
|
+
spec.required_ruby_version = ">= 3.1"
|
|
11
|
+
spec.files = Dir["README.md", "docs/**/*", "tests/**/*"]
|
|
12
|
+
spec.metadata["source_code_uri"] = "https://github.com/wenathlan/devthink"
|
|
13
|
+
spec.metadata["homepage_uri"] = spec.homepage
|
|
14
|
+
end
|
package/cobaia.java
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
package io.github.wenathlan.cobaia;
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* The cobaia version envelope carrier.
|
|
5
|
+
*
|
|
6
|
+
* <p>The carrier answers the lowercase file name doctrine (the technical name {@code cobaia}
|
|
7
|
+
* while the class keeps the presentation name {@code Cobaia}); the class drops the public
|
|
8
|
+
* modifier so the java file name rule holds — the envelope carries the version constant the
|
|
9
|
+
* metadata lockstep stamps, the registry lanes never compile it.
|
|
10
|
+
*/
|
|
11
|
+
final class Cobaia {
|
|
12
|
+
/** The version of the cobaia envelope (the six-distribution completeness wave). */
|
|
13
|
+
public static final String VERSION = "2.0.159";
|
|
14
|
+
private Cobaia() {
|
|
15
|
+
}
|
|
16
|
+
}
|
package/codeofconduct.md
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# Cobaia code of conduct
|
|
2
|
+
|
|
3
|
+
Copyright (C) 2026 devthink, nathlan, iakadion, nathu filho, allan neris, andraneris, and contributors.
|
|
4
|
+
|
|
5
|
+
The Cobaia community follows a respectful, inclusive and technically constructive standard. Participants communicate in good faith, explain technical concerns with evidence, respect different backgrounds and experience levels, and protect private information.
|
|
6
|
+
|
|
7
|
+
Unacceptable conduct includes harassment, discrimination, threats, deliberate disclosure of private information, malicious interference, impersonation, spam, and behavior that violates applicable law or the project policies.
|
|
8
|
+
|
|
9
|
+
Project maintainers may moderate discussions, remove harmful content, or restrict participation when necessary. Reports should be sent through the repository security or support channels, with private disclosure used for security-sensitive matters.
|
package/content.ts
CHANGED
|
@@ -116,7 +116,7 @@ export const seedPosts: readonly blogpost[] = [
|
|
|
116
116
|
"The whole family fits the static hosting free tiers — the only fixed cost is the domains. How ten deployable sites stay on a US$15 a month floor.",
|
|
117
117
|
body: [
|
|
118
118
|
"Every application in the DevThink family builds down to the same shape: one html file, one stylesheet and a handful of hashed bundles at the app root. There is no server to keep warm, no container to babysit and no database bill attached to the public surface. The whole family fits the free tiers of the usual static hosts, so the only fixed cost of the operation is the domains — about US$15 a month.",
|
|
119
|
-
"That number is the budget the family was designed against. The applications share one engine: the sandbox runner and the storage layer live as library-grade modules and get assembled per deploy, so a fix made once lands on every site that imports it. Nothing is provisioned per site beyond the deploy itself. A new application is a folder in the monorepo with the same skeleton as its siblings — config files at the root, the theme in
|
|
119
|
+
"That number is the budget the family was designed against. The applications share one engine: the sandbox runner and the storage layer live as library-grade modules and get assembled per deploy, so a fix made once lands on every site that imports it. Nothing is provisioned per site beyond the deploy itself. A new application is a folder in the monorepo with the same skeleton as its siblings — config files at the root, the theme in sol/, pure logic modules beside them and tests in the tests folder.",
|
|
120
120
|
"The trade-offs are real. Static sites cannot hold state, so the public surface of every app stores nothing on the visitor machine: no cookies, no accounts, no tracking. The pieces that genuinely need a backend — the AI gateway, the storage clones — run as separate deploy units on their own free tiers, and the sites talk to them over plain https with no credentials embedded anywhere.",
|
|
121
121
|
"The accounting stays honest. US$15 a month is the floor, not the ceiling: a gateway that outgrows its free tier, or a storage clone that needs a persistent disk, moves the number. But the design keeps the moving parts few and every cost on a line item you can read. Ten working tools for the price of two coffees, and the bill never surprises anyone.",
|
|
122
122
|
],
|
|
@@ -129,7 +129,7 @@ export const seedPosts: readonly blogpost[] = [
|
|
|
129
129
|
excerpt:
|
|
130
130
|
"A page is a folder, an anchor and one stylesheet. The token set and the flat tree that keep ten sites feeling like one family.",
|
|
131
131
|
body: [
|
|
132
|
-
"Every site in the family carries the same skeleton. A page is a folder directly under
|
|
132
|
+
"Every site in the family carries the same skeleton. A page is a folder directly under sol/, named after the page, with an anchor file of the same name inside it. Components sit loose beside the anchor, infrastructure lives in a single shell folder and the whole theme styles from one stylesheet. There are no deeper folders. The rule sounds rigid until you maintain ten sites with it — then it is the only reason they stay consistent.",
|
|
133
133
|
"The theme runs on a fixed token set tuned against the trylle ruler: a near-black canvas, ink at #fafafa, eight surface steps from #171717 to #484848 and exactly one accent per application. Hairlines are the ink color mixed down to five and ten percent. Shadows are rings — a one-pixel outline plus doubling blur layers — instead of diffuse glows. Motion is capped at 150 milliseconds for micro-interactions on one shared cubic-bezier curve, and only transform and opacity ever animate.",
|
|
134
134
|
"Each application keeps its own signal color: the sandbox engine wears tan, the gateway violet, the game platform coral, the video studio rose. The site you are reading uses the amber sun the whole family shares. One accent per screen, spent on actions and state, never on decoration — the ninety-ten rule. Everything else stays gray on gray: the hierarchy comes from the surface ladder and the typography, not from color.",
|
|
135
135
|
"The constraints do the work. Because every token, radius, easing and spacing step is shared, a component copied between applications lands looking correct. Because the tree is flat, an audit is a directory listing. And because the stylesheet is one file, the entire design system of a site can be reviewed in a single pass. Ten sites feel like one family because, structurally, they are one.",
|
package/contributing.md
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# Contributing to Cobaia
|
|
2
|
+
|
|
3
|
+
Copyright (C) 2026 devthink, nathlan, iakadion, nathu filho, allan neris, andraneris, and contributors.
|
|
4
|
+
|
|
5
|
+
Cobaia welcomes contributions that improve the monetization surface, its plan catalog and ad slots, the documentation, the tests and the security posture. Contributions are licensed under GPL-3.0-only unless a different compatible arrangement is agreed in writing before acceptance.
|
|
6
|
+
|
|
7
|
+
A pull request should explain the change, include focused verification, preserve the root-first architecture and avoid credentials, private data or generated artifacts. Security vulnerabilities must use the private process in `SECURITY.md` rather than a public issue.
|
|
8
|
+
|
|
9
|
+
Maintainers may review, request changes, decline or merge a contribution. No contributor is required to transfer exclusive ownership of their work merely to submit a pull request.
|
package/copyright.md
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
# Cobaia copyright notice
|
|
2
|
+
|
|
3
|
+
Copyright (C) 2026 devthink, nathlan, iakadion, nathu filho, allan neris, andraneris, and contributors.
|
|
4
|
+
|
|
5
|
+
The Cobaia source code and original documentation are distributed under the GNU General Public License version 3.0 only. The complete license text is kept in the repository `LICENSE` file (the saddle seat carries the family copy) and must be distributed with covered copies.
|
|
6
|
+
|
|
7
|
+
Copyright ownership remains with the respective authors and contributors. Copyright ownership does not remove the rights granted by GPL-3.0-only. The Cobaia name, logos and other marks are covered separately by `trademarkpolicy.md`.
|
package/db.ts
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* tables over HTTPS (GET/POST /api/v1/onboarding); no server route lives
|
|
9
9
|
* here.
|
|
10
10
|
*/
|
|
11
|
-
import { openStorageLane } from "@wenathlan/vault/
|
|
11
|
+
import { openStorageLane } from "@wenathlan/vault/storage";
|
|
12
12
|
import { LABEL_MANIFEST, LABEL_REVISION } from "./labels";
|
|
13
13
|
|
|
14
14
|
/** the correlated tables the runtime keeps (the family sync contract names). */
|
|
@@ -24,7 +24,7 @@ export const db = lane.db;
|
|
|
24
24
|
export const { execute, queryAll, queryOne } = lane;
|
|
25
25
|
|
|
26
26
|
/** the parameter types the helpers bind (re-exported seat of the lane). */
|
|
27
|
-
export type { SqlParam } from "@wenathlan/vault/
|
|
27
|
+
export type { SqlParam } from "@wenathlan/vault/storage";
|
|
28
28
|
|
|
29
29
|
const SCHEMA = `
|
|
30
30
|
CREATE TABLE IF NOT EXISTS onboarding_states (
|
package/disclaimer.md
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
# Cobaia disclaimer
|
|
2
|
+
|
|
3
|
+
Copyright (C) 2026 devthink, nathlan, iakadion, nathu filho, allan neris, andraneris, and contributors.
|
|
4
|
+
|
|
5
|
+
Cobaia is provided under GPL-3.0-only and without warranty to the maximum extent permitted by law. The project does not guarantee availability, correctness, security, compatibility, performance or fitness for a particular purpose.
|
|
6
|
+
|
|
7
|
+
Operators remain responsible for reviewing source code, configuring integrations, protecting credentials, validating outputs and complying with the terms of connected services. Nothing in this disclaimer removes rights or obligations established by GPL-3.0-only.
|
package/docs/features.md
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# cobaia features
|
|
2
|
+
|
|
3
|
+
the real feature list of the cobaia content site, extracted from the code: every item below exists in the app root logics or the Sol theme.
|
|
4
|
+
|
|
5
|
+
## plans
|
|
6
|
+
|
|
7
|
+
- three mrr plans: free at us$0, pro at us$5 and studio at us$19 per month, placeholder prices until the billing platform decision lands (stripe payment links or paddle)
|
|
8
|
+
- honest checkout state: a configured plan href renders a live anchor, an empty one renders the disabled button with the note checkout not configured yet
|
|
9
|
+
- plan lookup: planbyid answers one plan of the table by its stable id (free, pro, studio)
|
|
10
|
+
- plan prose in the label store: every plan sentence (name, billing period, blurb, features) answers from labels.ts; only the billing values ride checkoutlinks.ts
|
|
11
|
+
- intro plans zone: the intro page renders the same offer from the one checkoutlinks table, the studio plan leading raised
|
|
12
|
+
- what the money covers: the pricing section states the us$15 a month floor of domains and free static hosting and that the applications stay ad free
|
|
13
|
+
- billing webhook walk lane: the plan-checkout workload lane is declared in sandboxmodality.ts for the billing webhook work when it lands, secrets server side
|
|
14
|
+
|
|
15
|
+
## ads
|
|
16
|
+
|
|
17
|
+
- reserved slot registry: one slot per content page, home display at 728/90, apps in-feed at 3/1, blog in-article at 3/1, keyed by page folder name
|
|
18
|
+
- honest ad container: a fixed aspect-ratio box on a hairline well, visibly labeled advertisement, rendering the empty note ad slot not configured yet while no slot id is set, so the page never shifts when a real unit arrives
|
|
19
|
+
- script rule: no ad network script lives in the repository; the adsense or equivalent loader is injected after network approval through the deploy environment only
|
|
20
|
+
- slot liveness check: adsslotlive answers whether a reserved slot carries a real network id
|
|
21
|
+
- ad free surfaces: the pricing, support and legal pages carry no ad slot; nothing that asks for money or discloses policy sits beside an advertisement
|
|
22
|
+
- ads slot lane: the ads-slot workload lane is declared for the reserved slots and the rotation decision the deploy answers before the render
|
|
23
|
+
|
|
24
|
+
## content
|
|
25
|
+
|
|
26
|
+
- content lane: the pages read the live rows the platform gateway serves over GET /api/v1/ui/content and fall back to the manifest seed in content.ts, so the interface never blanks
|
|
27
|
+
- content kinds: the lane serves posts, roster, plans, supportlinks, ads.slots, ads.label and ads.empty, each row an ordinal and a json payload
|
|
28
|
+
- live load discipline: one fetch per session against the configured base (VITE_CATALOG_URL) with a 4 second abort window; any failure keeps the seed answering
|
|
29
|
+
- useContent mount hook: a store-riding page loads the live rows once per mount and re-renders when they land, with no first-paint flash
|
|
30
|
+
- update blog: three seed posts with full bodies (ten sites one engine, one css one tree, no backend no tracking), the index sorted newest first and each post carrying date, tags, excerpt, body and the honest word count
|
|
31
|
+
- app directory: the ten deploy units of the family, each card carrying the one-line role declared in its own devthink.toml and its spec accent
|
|
32
|
+
- label store: every interface string rides the label manifest at revision 4, read through the typed accessors label and labelfill, seeded into the store with translated rows protected from overwrite
|
|
33
|
+
- label seed lane: the label-seed workload lane is declared for the manifest walk the sqlite vault carries
|
|
34
|
+
|
|
35
|
+
## support
|
|
36
|
+
|
|
37
|
+
- two support channels: github sponsors and ko-fi, both presented as zero platform fee, read from the supportlinks record
|
|
38
|
+
- honest channel state: an unconfigured channel renders the disabled button with the note link not configured yet, never a fake link
|
|
39
|
+
- other ways to help: the section lists the public issue tracker, writing about the tools and linking the directory
|
|
40
|
+
- invalid traffic policy: the site states no ad clicking, no traffic exchange, no bots, because automated traffic against an ad surface kills the ad account and the domain reputation
|
|
41
|
+
- support strip on home: the landing carries the support call before the reserved ad slot
|
|
42
|
+
|
|
43
|
+
## ui
|
|
44
|
+
|
|
45
|
+
- one shared shell: the sticky acrylic nav with the active section indicator and the worked footer carrying the family row, the same surface at the direct url and inside the os power clip
|
|
46
|
+
- routes: home on the bare root, apps, pricing, support, blog, legal inside the shell, the bare intro at /intro and the catch-all 404
|
|
47
|
+
- intro splash: the akash opening with the mark spring, name rise and role fade, skippable by click, tap or key, honoring reduced motion and writing nothing to the visitor machine
|
|
48
|
+
- brand mark: the drawn beaker svg in the dark amber gradient, the only seat of the identity accent, with a gentle hover tilt
|
|
49
|
+
- home landing: left-aligned hero, the three steps (engine, static, honest), the four-card featured directory preview and the support strip
|
|
50
|
+
- legal page: the privacy policy and terms with clause leads, disclosing the advertising plan and the analytics rule
|
|
51
|
+
- notfound page: the 404 answer inside the site chrome with the way out to home and the directory
|
|
52
|
+
- window captions: the shell carries the minimize, maximize and close caption labels for the os window seat
|
|
53
|
+
- wouter routing on the declared vite base: deep links resolve against the pages subpath the build declaration owns
|
|
54
|
+
- static deploys: netlify, vercel and cloudflare workers configs at the app root, plus robots.txt and sitemap.xml for the crawlers
|
|
55
|
+
|
|
56
|
+
## Dependencies
|
|
57
|
+
|
|
58
|
+
- synchronized dependency union — the eleven family apps share one dependency tree: identical `dependencies`, `devDependencies` and `peerDependencies` (same keys, same versions, nothing removed, highest semver wins on conflicts) and one `engines` catalog with node as maestro and the V 0.5.2 seat as catalog annotation (@family wave/depssync).
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# cobaia monetization surface
|
|
2
|
+
|
|
3
|
+
cobaia is the public monetization surface of the devthink family: the content site that carries the mrr plan table, the support channels and the honest advertisement slots while the ten family applications stay clean.
|
|
4
|
+
|
|
5
|
+
## overview
|
|
6
|
+
|
|
7
|
+
- a plain content site with no entry gate and no onboarding flow: every page is public and the home renders directly on the bare root
|
|
8
|
+
- one window shell (header, footer) wraps every content route; the intro page mounts bare at /intro outside the chrome
|
|
9
|
+
- every plan href and support href ships empty until the owner configures billing; the interface renders honest empty states instead of dead links
|
|
10
|
+
- no ad network script is committed: the loader enters only after network approval, injected through the deploy environment
|
|
11
|
+
- zero tracking: no cookies, no local storage, no analytics beacons, no keys committed
|
|
12
|
+
- build tooling: vite static build, wouter router on the declared vite base, vitest suites, biome formatting
|
|
13
|
+
|
|
14
|
+
## module inventory
|
|
15
|
+
|
|
16
|
+
the pure logics at the app root, each one a typed accessor over the content lane:
|
|
17
|
+
|
|
18
|
+
- adsconfig.ts: the honest ad slot registry. exports the adsslot type (slotid, format, ratio), the fixed label advertisement, the empty note ad slot not configured yet, the reserved slots per page (home display 728/90, apps in-feed 3/1, blog in-article 3/1) and the readers adsslotfor and adsslotlive
|
|
19
|
+
- checkoutlinks.ts: the typed billing accessor. checkoutlinks answers the plan table, supportlinks the support channel record, isconfigured tests an href, planbyid finds one plan by id (free, pro, studio). only billing values ride here; the plan prose answers from the label store
|
|
20
|
+
- content.ts: the content law. section 1 holds the manifest seed (seedPosts, seedRoster, seedPlans, seedSupportLinks, seedAdsSlots, seedAdsLabel, seedAdsEmpty); section 2 holds the live loader (loadcontent over GET /api/v1/ui/content), the accessors contenttable and contentvalue (live rows first, seed fallback) and the useContent mount hook
|
|
21
|
+
- posts.ts: the blog accessor. posts answers the post table, postindex sorts it newest first, postwords counts the honest word total of one body
|
|
22
|
+
- roster.ts: the family directory accessor. roster answers the ten deploy units with slug, accent and one-line role, in rail order with the os first
|
|
23
|
+
- db.ts: the self-hosted sqlite runtime (better-sqlite3 through the vault storagelane). keeps the onboarding_states and labels tables with prepared, parameterized statements only
|
|
24
|
+
- familyurl.ts: the family address book. familyurl resolves one sibling deploy unit to the relative url ../slug/ with the trailing slash, so the family links both ways
|
|
25
|
+
- labels.ts: the copy law. the english manifest (LABEL_MANIFEST, revision 4) carries every interface string keyed by page.widget.key; label and labelfill read it; seedLabels mirrors the rows into the browser label store
|
|
26
|
+
- sandboxmodality.ts: the workload lane declaration. mirrors the three lanes cobaia owns in the family catalog (plan-checkout, ads-slot, label-seed) and reads the COBAIA_SANDBOX_LANE seat (local, join, or a pinned modality id)
|
|
27
|
+
- capacitor.config.ts, vite.config.ts, vitest.config.ts: the mobile conversion config, the static build and the test runner configs at the app root
|
|
28
|
+
|
|
29
|
+
## data layer
|
|
30
|
+
|
|
31
|
+
- the sqlite runtime opens one storage lane on the app-owned file cobaia.db (wal, foreign keys, patient locks) through openStorageLane of @wenathlan/vault
|
|
32
|
+
- every statement is prepared and bound; no sql is assembled by string concatenation
|
|
33
|
+
- the boot ddl is idempotent and mirrors schema.prisma, the documentation of record: the tables exist after the first open
|
|
34
|
+
- onboarding_states holds the entry-flow flags per visitor (introseen, onboardingseen) with a seen-wins upsert; the platform gateway serves the same flags over /api/v1/onboarding
|
|
35
|
+
- labels holds the interface copy store: id, text, revision, translated. the boot seed ingests the english manifest and never overwrites a translated row
|
|
36
|
+
- the content rows (posts, roster, plans, supportlinks, ads.slots, ads.label, ads.empty) live in the site store and answer over the platform gateway at GET /api/v1/ui/content; the manifest seed in content.ts is the fallback the offline static build reads
|
|
37
|
+
- the browser never imports db.ts: better-sqlite3 cannot ride the static bundle, so the browser pulls the live rows over the internal api (base from VITE_CATALOG_URL, 4 second abort window, one load per session)
|
|
38
|
+
- the vitest suites (adsconfig, checkoutlinks, familyurl, posts, sandboxmodality) pin the module contracts: the slot registry, the placeholder prices, the empty hrefs and the plan prose keys
|
|
39
|
+
|
|
40
|
+
## sol subapps
|
|
41
|
+
|
|
42
|
+
the theme surface, one folder per page, mounted by the theme anchor sol/Sol.tsx on wouter:
|
|
43
|
+
|
|
44
|
+
- home: the landing. left-aligned hero, the three steps (engine, static, honest), a four-card directory preview reading the one roster table (devthink, saddle, vault, cadria), the support strip and the reserved ad slot at the end of the content
|
|
45
|
+
- apps: the directory. one card per deploy unit with the honest role and the deep link through familyurl, closed by the in-feed ad slot
|
|
46
|
+
- pricing: the plan table. three honest plans (free, pro, studio), a configured href renders a live anchor, an empty one the disabled button plus the note checkout not configured yet, and the money section explains the us$15 a month floor. no ad slot on this page
|
|
47
|
+
- support: the support channels. github sponsors and ko-fi cards with the same configured-or-honest rule, the other ways to help section and the invalid traffic line. no ad slot on this page
|
|
48
|
+
- blog: the update blog. the sorted index and the full bodies of the posts as real articles with date, word count and tags in the meta line, closed by the in-article ad slot
|
|
49
|
+
- legal: the privacy policy and the terms. discloses the advertising plan (labeled reserved slots, third-party cookies only once a network is live) and the analytics rule (none by default). no ad slot on this page
|
|
50
|
+
- intro: the bare presentation page. the akash splash (plays per visit, writes nothing, skips on click, tap or key), the plans zone reading the one checkoutlinks table, the door panes and the footer doors
|
|
51
|
+
- notfound: the 404 answer inside the site chrome
|
|
52
|
+
- shell: the one chrome. the sticky acrylic nav with the active section indicator, the footer carrying the family row through familyurl, and the embedded contract that renders the same surface inside the devthink os power clip
|
|
53
|
+
- wingets: the shared components (IntroSplash, IntroPlans, IntroFooter, ShellAdsslot, ShellBrand) re-exported through one index surface
|
|
54
|
+
|
|
55
|
+
## family integration
|
|
56
|
+
|
|
57
|
+
- the roster mirrors the ten deploy units: devthink the os, saddle the sandbox, forge the execution clone, foundry the complete clone, vault the storage clone, getry the ai workspace, cadria the video and image studio, debonair the audio daw, stealthhead the fps game platform, argan the dns toolkit, each with its spec section 12 accent
|
|
58
|
+
- familyurl resolves every sibling one level above this deploy unit, so the directory links out and every sibling footer links back
|
|
59
|
+
- the label store rides the shared vault labelstore; the sqlite lane rides the shared vault storagelane, the same mechanism the storage clone keeps
|
|
60
|
+
- the deploy targets are static: netlify, vercel and cloudflare workers configs sit at the app root beside robots.txt and sitemap.xml; the capacitor mobile lane renders the same web bundle
|
|
61
|
+
- the package identity is @wenathlan/cobaia inside the devthink monorepo; the devthink.toml declares the app role and the seven pages (home, pricing, support, apps, legal, blog, notfound)
|
package/eula.md
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
# Cobaia end user license notice
|
|
2
|
+
|
|
3
|
+
Copyright (C) 2026 devthink, nathlan, iakadion, nathu filho, allan neris, andraneris, and contributors.
|
|
4
|
+
|
|
5
|
+
Cobaia source code, scripts and covered binaries are licensed under the GNU General Public License version 3.0 only. The repository `LICENSE` file (the saddle seat carries the family copy) controls the copyright license and grants the permissions described there.
|
|
6
|
+
|
|
7
|
+
This notice does not add a proprietary restriction to GPL-licensed code. Separate terms may apply to a hosted service, a third-party provider, a trademark, or data supplied by an operator. Those terms cannot remove rights granted by the GPL for the covered source code.
|
package/exportcontrol.md
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
COBAIA - EXPORT CONTROL NOTICE
|
|
2
|
+
Version 1.0, August 2026
|
|
3
|
+
|
|
4
|
+
Copyright (C) 2026 devthink, nathlan, iakadion, nathu filho, allan neris, andraneris, and contributors. Licensed under GPL-3.0-only.
|
|
5
|
+
Project: cobaia
|
|
6
|
+
|
|
7
|
+
Project Cobaia is open-source software under GPL-3.0-only. Export,
|
|
8
|
+
re-export and sanctions laws may still apply to a particular operator,
|
|
9
|
+
destination, service or use case.
|
|
10
|
+
|
|
11
|
+
You agree not to export, re-export, or transfer Project cobaia to any
|
|
12
|
+
prohibited destination, entity, or person, or for any prohibited end-use.
|
|
13
|
+
|
|
14
|
+
Operators are responsible for checking applicable rules before
|
|
15
|
+
transferring source, binaries, credentials or data across borders.
|
|
16
|
+
|
|
17
|
+
END OF EXPORT CONTROL NOTICE
|
package/governance.md
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# Cobaia governance
|
|
2
|
+
|
|
3
|
+
Copyright (C) 2026 devthink, nathlan, iakadion, nathu filho, allan neris, andraneris, and contributors.
|
|
4
|
+
|
|
5
|
+
Cobaia is maintained as the public monetization surface of the family, an open-source project under GPL-3.0-only. The repository owner coordinates releases, security response, release approvals and provider integrations. Contributors retain copyright in their contributions unless a separate written agreement states otherwise.
|
|
6
|
+
|
|
7
|
+
Changes should include focused reasoning, tests where practical, documentation for public behavior, and review of security-sensitive workflows. Release artifacts must be traceable to repository source and generated by the documented automation.
|
|
8
|
+
|
|
9
|
+
Technical governance is recorded in the repository plans and workflow files. This document describes project responsibility and does not override the GPL or a contributor's applicable rights.
|
package/notice.md
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
# Cobaia notice
|
|
2
|
+
|
|
3
|
+
Copyright (C) 2026 devthink, nathlan, iakadion, nathu filho, allan neris, andraneris, and contributors.
|
|
4
|
+
|
|
5
|
+
Cobaia is open-source software licensed under the GNU General Public License version 3.0 only. The source code, generated artifacts and documentation may include work from third-party projects; each third-party component remains subject to its own license.
|
|
6
|
+
|
|
7
|
+
The project name and logos are trademarks of their respective owner. The trademark policy does not restrict rights granted by GPL-3.0-only to the source code.
|
package/package.json
CHANGED
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wenathlan/cobaia",
|
|
3
3
|
"packageManager": "pnpm@12.3.4",
|
|
4
|
-
"version": "2.0.
|
|
4
|
+
"version": "2.0.159",
|
|
5
5
|
"description": "cobaia is the monetization surface of the wenathlan family: the content site that carries the plans, the support rails and the honest advertisement slots while the family apps stay clean; the name is provisional until the owner picks the official one",
|
|
6
|
+
"bin": {
|
|
7
|
+
"cobaia": "./cli.ts"
|
|
8
|
+
},
|
|
6
9
|
"type": "module",
|
|
7
10
|
"repository": {
|
|
8
11
|
"type": "git",
|
|
@@ -26,22 +29,23 @@
|
|
|
26
29
|
"@fontsource-variable/inter": "^5.3.0",
|
|
27
30
|
"@fontsource-variable/jetbrains-mono": "^5.3.0",
|
|
28
31
|
"@fontsource-variable/outfit": "^5.3.0",
|
|
29
|
-
"@hono/node-server": "^2.1.
|
|
32
|
+
"@hono/node-server": "^2.1.6",
|
|
30
33
|
"@libsql/client": "^0.18.0",
|
|
31
34
|
"@prisma/adapter-libsql": "^7.10.1",
|
|
32
35
|
"@prisma/client": "^7.10.1",
|
|
33
|
-
"@wenathlan/cadria": "
|
|
34
|
-
"@wenathlan/debonair": "
|
|
35
|
-
"@wenathlan/devthink": "
|
|
36
|
-
"@wenathlan/getry": "
|
|
37
|
-
"@wenathlan/saddle": "
|
|
38
|
-
"@wenathlan/
|
|
36
|
+
"@wenathlan/cadria": "~2.0.155",
|
|
37
|
+
"@wenathlan/debonair": "~2.0.155",
|
|
38
|
+
"@wenathlan/devthink": "~2.0.154",
|
|
39
|
+
"@wenathlan/getry": "~2.0.155",
|
|
40
|
+
"@wenathlan/saddle": "~2.0.155",
|
|
41
|
+
"@wenathlan/argan": "~2.0.155",
|
|
42
|
+
"@wenathlan/vault": "~2.0.155",
|
|
39
43
|
"better-sqlite3": "^13.0.3",
|
|
40
44
|
"drizzle-orm": "^0.45.4",
|
|
41
|
-
"gsap": "^3.15.
|
|
45
|
+
"gsap": "^3.15.1",
|
|
42
46
|
"hono": "^4.13.16",
|
|
43
47
|
"ink": "^7.1.1",
|
|
44
|
-
"lucide-react": "^1.
|
|
48
|
+
"lucide-react": "^1.68.0",
|
|
45
49
|
"motion": "^12.43.0",
|
|
46
50
|
"react": "^19.3.1",
|
|
47
51
|
"react-devtools-core": "^8.0.0",
|
|
@@ -51,7 +55,7 @@
|
|
|
51
55
|
"z-ai-web-dev-sdk": "^0.0.18"
|
|
52
56
|
},
|
|
53
57
|
"devDependencies": {
|
|
54
|
-
"@biomejs/biome": "^2.6.
|
|
58
|
+
"@biomejs/biome": "^2.6.5",
|
|
55
59
|
"@capacitor/android": "^8.6.0",
|
|
56
60
|
"@capacitor/cli": "^8.6.0",
|
|
57
61
|
"@capacitor/core": "^8.6.0",
|
|
@@ -120,7 +124,7 @@
|
|
|
120
124
|
"hono": "^4.13.16",
|
|
121
125
|
"input-otp": "^1.5.0",
|
|
122
126
|
"jsdom": "26.1.0",
|
|
123
|
-
"lucide-react": "^1.
|
|
127
|
+
"lucide-react": "^1.68.0",
|
|
124
128
|
"mysql2": "^3.24.6",
|
|
125
129
|
"nanoid": "^6.0.2",
|
|
126
130
|
"next-themes": "^0.4.6",
|
|
@@ -158,7 +162,7 @@
|
|
|
158
162
|
},
|
|
159
163
|
"engines": {
|
|
160
164
|
"bare": "^1.18.0",
|
|
161
|
-
"bun": "^1.4.
|
|
165
|
+
"bun": "^1.4.4",
|
|
162
166
|
"cargo": ">=1.85.0",
|
|
163
167
|
"chrome": "^16.0.912",
|
|
164
168
|
"cnpm": "^9.4.0",
|
|
@@ -171,7 +175,7 @@
|
|
|
171
175
|
"iojs": "^1.0.0",
|
|
172
176
|
"java": ">=17",
|
|
173
177
|
"node": ">=26.13.0 <27",
|
|
174
|
-
"npm": "^12.1
|
|
178
|
+
"npm": "^12.2.1",
|
|
175
179
|
"pnpm": "^12.6.0",
|
|
176
180
|
"python": ">=3.11.0",
|
|
177
181
|
"rust": ">=1.85.0",
|
|
@@ -181,6 +185,9 @@
|
|
|
181
185
|
"vscode": "^1.118.0",
|
|
182
186
|
"yarn": "^4.17.1"
|
|
183
187
|
},
|
|
188
|
+
"peerDependencies": {
|
|
189
|
+
"playwright": "^1.63.0"
|
|
190
|
+
},
|
|
184
191
|
"overrides": {
|
|
185
192
|
"body-parser": "^2.4.0",
|
|
186
193
|
"fast-uri": "^3.1.9",
|
package/pnpm-workspace.yaml
CHANGED
|
@@ -12,26 +12,34 @@ overrides:
|
|
|
12
12
|
esbuild: ^0.28.2
|
|
13
13
|
deepmerge-ts: ^8.0.0
|
|
14
14
|
mysql2: ^3.23.1
|
|
15
|
+
postcss-selector-parser: ^7.1.6
|
|
15
16
|
|
|
16
17
|
# the freshly published security fixes install before they age: pnpm 12
|
|
17
18
|
# verifies the supply-chain age by default and these four corrections ride
|
|
18
19
|
# the exclusion so the family heals now, not after the waiting window.
|
|
20
|
+
# the native build law (the node 26 v8 gate): ssh2's optional c++ binding
|
|
21
|
+
# speaks the removed v8 context api (GetIsolate), so the gyp lottery dies
|
|
22
|
+
# here in the seat pnpm 12 reads - the pure-js engine answers the lanes
|
|
23
|
+
# and no install ever compiles the broken binding.
|
|
24
|
+
neverBuiltDependencies:
|
|
25
|
+
- ssh2
|
|
26
|
+
|
|
19
27
|
minimumReleaseAgeExclude:
|
|
20
28
|
- body-parser@2.4.0
|
|
21
29
|
- fast-uri@3.1.9
|
|
22
30
|
- follow-redirects@1.16.1
|
|
23
31
|
- zod@4.6.6
|
|
24
|
-
- '@biomejs/biome@2.6.3 || 2.6.4'
|
|
25
|
-
- '@biomejs/cli-android-arm64@2.6.3 || 2.6.4'
|
|
26
|
-
- '@biomejs/cli-android-x64@2.6.3 || 2.6.4'
|
|
27
|
-
- '@biomejs/cli-darwin-arm64@2.6.3 || 2.6.4'
|
|
28
|
-
- '@biomejs/cli-darwin-x64@2.6.3 || 2.6.4'
|
|
29
|
-
- '@biomejs/cli-linux-arm64-musl@2.6.3 || 2.6.4'
|
|
30
|
-
- '@biomejs/cli-linux-arm64@2.6.3 || 2.6.4'
|
|
31
|
-
- '@biomejs/cli-linux-x64-musl@2.6.3 || 2.6.4'
|
|
32
|
-
- '@biomejs/cli-linux-x64@2.6.3 || 2.6.4'
|
|
33
|
-
- '@biomejs/cli-win32-arm64@2.6.3 || 2.6.4'
|
|
34
|
-
- '@biomejs/cli-win32-x64@2.6.3 || 2.6.4'
|
|
32
|
+
- '@biomejs/biome@2.6.3 || 2.6.4 || 2.6.5'
|
|
33
|
+
- '@biomejs/cli-android-arm64@2.6.3 || 2.6.4 || 2.6.5'
|
|
34
|
+
- '@biomejs/cli-android-x64@2.6.3 || 2.6.4 || 2.6.5'
|
|
35
|
+
- '@biomejs/cli-darwin-arm64@2.6.3 || 2.6.4 || 2.6.5'
|
|
36
|
+
- '@biomejs/cli-darwin-x64@2.6.3 || 2.6.4 || 2.6.5'
|
|
37
|
+
- '@biomejs/cli-linux-arm64-musl@2.6.3 || 2.6.4 || 2.6.5'
|
|
38
|
+
- '@biomejs/cli-linux-arm64@2.6.3 || 2.6.4 || 2.6.5'
|
|
39
|
+
- '@biomejs/cli-linux-x64-musl@2.6.3 || 2.6.4 || 2.6.5'
|
|
40
|
+
- '@biomejs/cli-linux-x64@2.6.3 || 2.6.4 || 2.6.5'
|
|
41
|
+
- '@biomejs/cli-win32-arm64@2.6.3 || 2.6.4 || 2.6.5'
|
|
42
|
+
- '@biomejs/cli-win32-x64@2.6.3 || 2.6.4 || 2.6.5'
|
|
35
43
|
- '@types/node@26.6.6'
|
|
36
44
|
- '@capacitor/android@8.6.0'
|
|
37
45
|
- '@capacitor/cli@8.6.0'
|
|
@@ -40,13 +48,13 @@ minimumReleaseAgeExclude:
|
|
|
40
48
|
- '@opencode-ai/sdk@1.19.5'
|
|
41
49
|
- react-resizable-panels@4.15.1 || 4.15.2 || 4.15.3 || 4.16.0 || 4.16.1 || 4.17.0 || 4.18.0
|
|
42
50
|
- '@types/google.maps@3.66.9'
|
|
43
|
-
- lucide-react@1.64.0 || 1.65.0 || 1.66.0 || 1.67.0
|
|
51
|
+
- lucide-react@1.64.0 || 1.65.0 || 1.66.0 || 1.67.0 || 1.68.0
|
|
44
52
|
- '@fluentui/react-icons@2.0.345'
|
|
45
|
-
- '@wenathlan/vault@2.0.152 || 2.0.153 || 2.0.154 || 2.0.155 || 2.1.8'
|
|
53
|
+
- '@wenathlan/vault@2.0.152 || 2.0.153 || 2.0.154 || 2.0.155 || 2.0.156 || 2.1.8'
|
|
46
54
|
- hono@4.13.16
|
|
47
|
-
- '@wenathlan/cadria@2.0.154 || 2.0.155 || 2.1.8'
|
|
48
|
-
- '@wenathlan/debonair@2.0.154 || 2.0.155 || 2.1.8'
|
|
49
|
-
- '@wenathlan/getry@2.0.154 || 2.0.155'
|
|
55
|
+
- '@wenathlan/cadria@2.0.154 || 2.0.155 || 2.0.156 || 2.1.8'
|
|
56
|
+
- '@wenathlan/debonair@2.0.154 || 2.0.155 || 2.0.156 || 2.1.8'
|
|
57
|
+
- '@wenathlan/getry@2.0.154 || 2.0.155 || 2.0.156'
|
|
50
58
|
- '@tailwindcss/node@4.3.4'
|
|
51
59
|
- '@tailwindcss/oxide-android-arm64@4.3.4'
|
|
52
60
|
- '@tailwindcss/oxide-darwin-arm64@4.3.4'
|
|
@@ -68,15 +76,28 @@ minimumReleaseAgeExclude:
|
|
|
68
76
|
- '@vitest/spy@5.1.0'
|
|
69
77
|
- tailwindcss@4.3.4
|
|
70
78
|
- vitest@5.1.0
|
|
71
|
-
- '@wenathlan/saddle@2.0.154 || 2.0.155 || 2.1.8'
|
|
72
|
-
- '@wenathlan/devthink@2.0.154 || 2.0.155'
|
|
79
|
+
- '@wenathlan/saddle@2.0.154 || 2.0.155 || 2.0.156 || 2.1.8'
|
|
80
|
+
- '@wenathlan/devthink@2.0.154 || 2.0.155 || 2.0.156 || 2.1.7'
|
|
81
|
+
- '@wenathlan/argan@2.0.155'
|
|
82
|
+
- gsap@3.15.1
|
|
73
83
|
# the pnpm settings live here since pnpm 12 (the package.json pnpm field is
|
|
74
84
|
# no longer read, and onlyBuiltDependencies died in pnpm 11 — the map below
|
|
75
|
-
# is allowBuilds).
|
|
76
|
-
#
|
|
85
|
+
# is allowBuilds). THE 2.0.155 BUILDS GATE HEAL: the four-entry map froze
|
|
86
|
+
# the container install (ERR_PNPM_IGNORED_BUILDS on cpu-features, pnpm,
|
|
87
|
+
# protobufjs and ssh2 — every build-carrying package the tree holds must
|
|
88
|
+
# answer the map, true or false, or the frozen install refuses), so the
|
|
89
|
+
# map rides the complete forge form: ssh2 answers false on purpose (the
|
|
90
|
+
# native accelerator refuses the runner node, the pure js fallback carries
|
|
91
|
+
# the line) and pnpm answers false the same way; everything else builds.
|
|
77
92
|
allowBuilds:
|
|
78
93
|
'@prisma/engines': true
|
|
94
|
+
'@tailwindcss/oxide': true
|
|
79
95
|
better-sqlite3: true
|
|
96
|
+
cpu-features: true
|
|
80
97
|
esbuild: true
|
|
98
|
+
pnpm: false
|
|
81
99
|
prisma: true
|
|
100
|
+
protobufjs: true
|
|
101
|
+
ssh2: false
|
|
102
|
+
workerd: true
|
|
82
103
|
dangerouslyAllowAllBuilds: false
|