Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
159 commits
Select commit Hold shift + click to select a range
80f1684
feat(report): on-brand build report with Motion explainer animations
faith-ogun Jul 2, 2026
91891c8
feat(analytics): north-star build instrumentation for FBC7 (#83)
faith-ogun Jul 2, 2026
9d89fe5
feat(blog): two Arduino SEO build guides (#20)
faith-ogun Jul 2, 2026
afa2168
style(brand): replace greeny-black ink with navy-black across the app
faith-ogun Jul 5, 2026
95fcef7
feat(blog): custom SVG build-guide illustrations + card-gap and LED f…
faith-ogun Jul 5, 2026
323d7ae
fix(blog): paint the card color-band as the card background, not a ch…
faith-ogun Jul 5, 2026
2160eec
feat(safety+monetization): child mode, first-build paywall, moderatio…
faith-ogun Aug 11, 2026
3db2c1e
feat(twin): public share page for a finished 3D build (#79)
faith-ogun Aug 11, 2026
fe82db5
fix(audit): repair broken 3D twin, dead live tutor, open AI endpoint,…
faith-ogun Aug 12, 2026
e0c3066
fix: close the live-session budget bypass and make deploy.sh actually…
faith-ogun Aug 13, 2026
d2b538b
fix(marketing): rebuild /build and /learn on real data, remove fabric…
faith-ogun Aug 13, 2026
a86fe08
fix(frontend): camera/mic leak, shared-device state, and auth routing…
faith-ogun Aug 13, 2026
2e59b5c
fix(legal): make the published policy describe what the product actua…
faith-ogun Aug 13, 2026
a810911
feat(achievements): count the nine metrics that were never tracked
faith-ogun Aug 13, 2026
dee2751
fix(legal): complete the controller identity and remove a dead contac…
faith-ogun Aug 13, 2026
b009734
fix(legal): name the data controller (sole trader, no postal address)
faith-ogun Aug 13, 2026
8ed415f
feat(mobile): scaffold the Ohmlet Expo app (#70)
faith-ogun Aug 22, 2026
6854107
chore(mobile): remove the scaffold's reset-project script
faith-ogun Aug 22, 2026
23aa05c
chore: gitignore FAITH.md (local task tracker, like HANDOFF.md)
faith-ogun Aug 22, 2026
6f3157f
feat(curriculum): serve the 142 lessons from the backend; mobile path…
faith-ogun Aug 22, 2026
3300c75
docs: iter 022 log; FAITH.md updated for the Apple decision
faith-ogun Aug 22, 2026
2b41e9c
chore(mobile): add react-native-web so the app previews in a browser
faith-ogun Aug 22, 2026
96fd60a
fix(mobile): downgrade to Expo SDK 54 so Expo Go opens the app on device
faith-ogun Aug 22, 2026
7ac29ae
feat(mobile): welcome, onboarding tour, and a real auth choice screen…
faith-ogun Aug 22, 2026
f7248be
feat(mobile): animated onboarding scenes (SVG + reanimated)
faith-ogun Aug 22, 2026
dab1642
feat(mobile): the lesson run loop — the core product loop (#70)
faith-ogun Aug 22, 2026
584de34
feat(mobile): real home screen and the live tutor (#70)
faith-ogun Aug 22, 2026
75c0c0b
feat(mobile): plans, entitlements, and the live-budget gate (#70)
faith-ogun Aug 22, 2026
41b9a7a
feat(mobile): achievements, community, 3D twin viewer, drawing steps …
faith-ogun Aug 22, 2026
d34e856
build(mobile): native development build runs on the iOS simulator
faith-ogun Aug 23, 2026
3dbec0c
feat(mobile): render every circuit diagram and the last four step types
faith-ogun Aug 23, 2026
18a5274
feat(community): count likes received, and stop faking the 3D twin
faith-ogun Aug 23, 2026
57451b7
feat(mobile): one honest motion on the welcome screen
faith-ogun Aug 23, 2026
97f8631
fix(backend): stop the live tutor blocking on itself, and close #18
faith-ogun Aug 23, 2026
8fb1890
feat(privacy): make erasure reach everything, and add account deletio…
faith-ogun Aug 23, 2026
c6ea667
feat(mobile): brand launch, setup questions, and two animations worth…
faith-ogun Aug 23, 2026
6be7d06
fix(mobile): back buttons that actually go back, and no phantom selec…
faith-ogun Aug 23, 2026
465c59c
fix(mobile): make Google sign-in work on a real iOS build
faith-ogun Aug 23, 2026
e9a6ee7
fix(mobile): Google sign-in rejected by Google, and a real app icon
faith-ogun Aug 23, 2026
238c274
feat(mobile): age assurance and the safety acknowledgement
faith-ogun Aug 23, 2026
c776308
feat: child mode on mobile, and make an iOS purchase actually grant a…
faith-ogun Aug 23, 2026
8acc1b7
feat(mobile): the app icon Faith supplied, prepared for the App Store
faith-ogun Aug 23, 2026
6eab5ee
feat(mobile): declare what the app collects, and confirm it does not …
faith-ogun Aug 23, 2026
6dae39d
feat: first-party analytics, so churn is answerable without a tracker
faith-ogun Aug 23, 2026
80f4ad2
feat(mobile): the simulator, and fix Google sign-in properly this time
faith-ogun Aug 23, 2026
de5f37d
feat(mobile): tab navigation, a real learning path, and safe-area insets
faith-ogun Aug 25, 2026
b96c21c
fix(mobile): drawn icons instead of emoji, and stop fading between tabs
faith-ogun Aug 25, 2026
384c59a
feat(mobile): rebuild the visual layer so it stops reading as a wiref…
faith-ogun Aug 25, 2026
4de6e05
fix(mobile): four defects the polish research found in my own code
faith-ogun Aug 25, 2026
c8b681f
feat(mobile): skeletons, a camera scrim, and what the research changed
faith-ogun Aug 25, 2026
d59275a
feat(mobile): give finishing a lesson a moment
faith-ogun Aug 25, 2026
c302dee
feat(hearts): make hearts an account resource that Pro and Max remove
faith-ogun Aug 25, 2026
8143166
fix(hearts): show nothing rather than a blank pill before hearts load
faith-ogun Aug 25, 2026
1fe4b9e
fix: three defects Faith found on the real app
faith-ogun Aug 25, 2026
cda2d91
feat(path): a unit is a winding path, not a list of twelve rows
faith-ogun Aug 25, 2026
fa3d53d
fix(deps): pin google-api-core — 2.35.0 breaks every Firestore call
faith-ogun Aug 25, 2026
b765e14
fix: the design notes, the plan switcher, and the community cold start
faith-ogun Aug 25, 2026
f9d35c1
fix(lesson): the crash in 42 of 142 lessons, plus shuffled options
faith-ogun Aug 25, 2026
e1b9203
feat(curriculum): 142 long lessons become 284 sessions; fix the batte…
faith-ogun Aug 25, 2026
ec83d28
feat(circuits): hit areas for six more diagrams, recovering 24 droppe…
faith-ogun Aug 25, 2026
33931bd
fix: the last 3 dropped questions, a countdown that counts, and real …
faith-ogun Aug 25, 2026
bc66ac9
feat(plans): the Pro tier illustration
faith-ogun Aug 25, 2026
8944828
feat(plans): the Max tier illustration
faith-ogun Aug 25, 2026
73aa101
feat(hearts): artwork for the moment a heart lands
faith-ogun Aug 25, 2026
de77cac
feat(path): real chest artwork on checkpoints
faith-ogun Aug 25, 2026
99f8ed1
fix: drawing upward scrolled instead, and lesson content could never …
faith-ogun Aug 25, 2026
a617b97
fix(curriculum): stale lessons had two causes, and the second defeate…
faith-ogun Aug 26, 2026
42aa226
feat(seo): one canonical URL, per route
faith-ogun Aug 26, 2026
a2ec48c
feat(seo): robots.txt, and a sitemap generated from the real routes
faith-ogun Aug 26, 2026
8718b9d
feat(mobile): the new launch screen
faith-ogun Aug 26, 2026
30c1c62
fix(achievements): tapping a card dimmed the screen and showed nothing
faith-ogun Aug 26, 2026
75c0657
feat(sim): a real circuit solver on the phone, and a bench to put it in
faith-ogun Aug 26, 2026
d644f83
feat(sim): the touch circuit builder
faith-ogun Aug 26, 2026
3aeca1e
feat(sim): the 3D breadboard, and all four tabs wired
faith-ogun Aug 26, 2026
3c7b833
fix: the scroller was fighting every gesture, and achievements now flip
faith-ogun Aug 26, 2026
ac75c13
fix: the slider and the sandbox camera were making the same mistake
faith-ogun Aug 26, 2026
bf53048
fix: heart centring, logarithmic sliders, and a board you can read
faith-ogun Aug 26, 2026
34cdef0
feat(achievements): the art IS the card, and it tilts with your finger
faith-ogun Aug 26, 2026
da1fac2
fix(sim): plain linear sliders, and sane ranges instead
faith-ogun Aug 26, 2026
c451cb4
fix(state): namespace a learner's state record by key
faith-ogun Aug 27, 2026
96fcbd7
fix(lessons): stop the phone giving away or refusing its own answers
faith-ogun Aug 27, 2026
f6f48d4
feat(curriculum): one corpus, rendered identically on both surfaces
faith-ogun Aug 27, 2026
482fbac
feat(achievements): earned means earned
faith-ogun Aug 27, 2026
f824d3a
feat(live): the learner can speak to the tutor on the phone
faith-ogun Aug 27, 2026
cc39e06
fix(sim): a slider that answers to its own knob, and a board you can …
faith-ogun Aug 27, 2026
de3df7e
feat(community): challenges that begin, end and declare a winner
faith-ogun Aug 27, 2026
94fc0c5
feat(build): the camera kit check, and the build library it needed
faith-ogun Aug 27, 2026
c48af4f
fix(progress): one definition of what finishing a lesson does
faith-ogun Aug 27, 2026
1a90325
fix(web): overlays that stay put, an avatar with two faces, a real Uno
faith-ogun Aug 27, 2026
cc2a924
merge: the audit sweep
faith-ogun Aug 27, 2026
7e54c87
fix(ci): read mobile's grading rules without mobile's node_modules
faith-ogun Aug 27, 2026
37517eb
ci: put the phone app in CI, and stop a check passing on one machine …
faith-ogun Aug 27, 2026
ccf93e6
ci: a vulnerability gate an Expo app can actually pass
faith-ogun Aug 27, 2026
2fb6114
feat(community): the seven painted challenge scenes
faith-ogun Aug 27, 2026
0491724
fix(progress): pay the once-per-lesson counters once, and stop lying …
faith-ogun Aug 27, 2026
cdaf74c
fix(ci): a permission check that can run where it matters
faith-ogun Aug 27, 2026
c60eb4f
fix(ci): check what CI can actually see
faith-ogun Aug 27, 2026
1416102
fix(live): the phone was talking into its own microphone
faith-ogun Aug 27, 2026
697fe56
fix(mobile): the permission text had a third source, and it was winning
faith-ogun Aug 27, 2026
ada850e
fix(live): the tutor sounded like a phone call because the session wa…
faith-ogun Aug 27, 2026
c7b1f15
fix(ops): stop the latency alert paging on every live tutor session
faith-ogun Aug 27, 2026
f382e5f
fix(live): play the tutor through one buffer queue instead of a node …
faith-ogun Aug 27, 2026
190b821
Revert "fix(live): play the tutor through one buffer queue instead of…
faith-ogun Aug 27, 2026
a1729d5
fix(live): abut the tutor's chunks on the sample grid, and stop under…
faith-ogun Aug 27, 2026
a166e2a
fix(live): the tutor was playing at up to 2x speed, and that was the …
faith-ogun Aug 27, 2026
1989cd7
diag(live): measure the playback speed instead of reasoning about it
faith-ogun Aug 27, 2026
c4caa26
docs(live-audio): write down what the seven builds cost, so it is not…
faith-ogun Aug 27, 2026
511cf3b
feat(stats): the bespoke stat icons, replacing four generic glyphs
faith-ogun Aug 27, 2026
fa0dd94
feat(models): move the text and tool calls to Gemini 3.7, and put a d…
faith-ogun Aug 27, 2026
7067db2
feat(live): the buffer queue, and real echo cancellation
faith-ogun Aug 27, 2026
85aefe3
feat(models): Pro onto 3.1, and prove the live model is blocked upstream
faith-ogun Aug 27, 2026
2fa74d4
feat(nav): the bespoke tab icons, and the retirement dates I had wrong
faith-ogun Aug 27, 2026
eb93cc3
feat(bosses): the unit exam, and it gates
faith-ogun Aug 28, 2026
7d395c8
feat(path): the twelve unit emblems
faith-ogun Aug 28, 2026
acf1bb6
feat(video): three lesson films, and where they belong
faith-ogun Aug 28, 2026
c0ed4a4
chore: the licence was wrong, and the pricing page sells things we do…
faith-ogun Aug 28, 2026
28c0c16
feat(video): six lesson films for units 1 and 2, and the drawings the…
faith-ogun Aug 28, 2026
7cf277b
feat(video): twelve more lesson films, units 2 to 6
faith-ogun Aug 28, 2026
02c7103
feat(video): the last twenty-two lesson films, units 6 to 12
faith-ogun Aug 28, 2026
60e5bbd
feat(video): the remaining forty lesson films
faith-ogun Aug 28, 2026
522e1e4
fix(pricing): the price, the meter, the caps, the ceilings and the tw…
faith-ogun Aug 28, 2026
48f14ef
feat(labs): Ohmlet Labs, and the 43 films it ships with
faith-ogun Aug 28, 2026
e82344d
feat(interview): route the diagnosis to the cure, and admit what we c…
faith-ogun Aug 28, 2026
3aa0d09
fix(interview): the schema test still referenced the old module-level…
faith-ogun Aug 28, 2026
fd3352b
feat(interview): the planted-fault round
faith-ogun Aug 28, 2026
c24a8ec
feat(career): Ash, and the evidence a coach is allowed to stand on
faith-ogun Aug 28, 2026
97b56ed
fix(career): the endpoint had no caller, which is the failure the gua…
faith-ogun Aug 28, 2026
bc22674
feat(coach): a live coaching session, on the same spine
faith-ogun Aug 28, 2026
202cbf2
copy(max): lead on the thing nobody else can claim
faith-ogun Aug 28, 2026
4dbfc06
feat(curriculum): the six skills Interview Mode was asking about and …
faith-ogun Aug 28, 2026
fdfaa5d
fix(curriculum): the metastability drawing asked Vision for a judgeme…
faith-ogun Aug 28, 2026
5fdb478
feat(interview): Interview Mode reaches the phone, and the web stops …
faith-ogun Aug 28, 2026
fa70c68
feat(obs): /health says which curriculum production is actually serving
faith-ogun Aug 28, 2026
73796f9
feat(web): the build record, career coaching and Labs exist on the we…
faith-ogun Aug 28, 2026
261a45a
feat(guard): "has a caller" was the wrong question for a feature sold…
faith-ogun Aug 28, 2026
38d4447
docs(agents): run the guards, not just the build
faith-ogun Aug 28, 2026
9e01ad9
feat(stats): unbox the top strip, and let the icons be big enough to …
faith-ogun Aug 29, 2026
7ffa623
fix(stats): XP had to get shorter when the number got bigger
faith-ogun Aug 29, 2026
601c055
feat(films): films get their own node on the path, and the index stop…
faith-ogun Aug 29, 2026
1faa235
chore(twins): create the bucket, and reduce the blocker to the one th…
faith-ogun Aug 29, 2026
bf8c298
feat(films): the six missing films, and two that had been dead in pro…
faith-ogun Aug 29, 2026
b46b293
feat(nav): the tab bar loses its captions, gains a plans tab, and the…
faith-ogun Aug 30, 2026
c89c3ea
feat(nav): Faith's mascot becomes the plans tab, and the drawn placeh…
faith-ogun Aug 30, 2026
54dc2fc
feat(nav): re-export the tab artwork at 40pt, from sources that were …
faith-ogun Aug 30, 2026
d05d2f5
feat(nav): the plans tab gets a real off state, from Faith's two-stat…
faith-ogun Aug 30, 2026
06bab38
chore(secrets): refuse key files at the repo root
faith-ogun Aug 30, 2026
6e5b8cb
chore(billing): mount the RevenueCat webhook secret on live-bridge
faith-ogun Aug 30, 2026
7386ea1
fix(billing): a free sandbox purchase could grant a real Max plan
faith-ogun Aug 30, 2026
2db06f6
feat(pricing): the annual prices are Apple's, and the page now says w…
faith-ogun Aug 30, 2026
167afdd
feat(plans): a monthly/annual toggle on the phone, and the bug it was…
faith-ogun Aug 30, 2026
e3f4b97
fix(billing): accept the entitlement names RevenueCat actually created
faith-ogun Aug 30, 2026
70d15aa
refactor(plans): the package matcher leaves the screen so it can be t…
faith-ogun Aug 30, 2026
f88c840
fix(billing): a purchase that could not be attributed, and a plan tha…
faith-ogun Sep 1, 2026
6e577c4
fix(progress): a streak and a daily goal that only decayed when you c…
faith-ogun Sep 1, 2026
1888bf3
feat(pricing): halve the annual, cut the caps, and stop pricing for a…
faith-ogun Sep 1, 2026
cb66006
fix(nav): a tab you could be thrown out of, and then one you could no…
faith-ogun Sep 1, 2026
360bdd3
feat(theme): dark mode on both surfaces, and a profile worth looking at
faith-ogun Sep 1, 2026
27bb250
merge: reprice, dark mode, and the navigation traps of 2026-09-01
faith-ogun Sep 1, 2026
2178166
chore(deps): bump google-genai in /backend/quiz-engine
dependabot[bot] Sep 1, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
45 changes: 45 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -37,9 +37,46 @@ jobs:
run: npm audit --omit=dev --audit-level=high
- name: Lint lessons
run: npm run lint:lessons
# Five guards that existed but were never run on push: price agreement
# across the three files that publish it, API route coverage, achievement
# durability, curriculum parity and fallback, and lesson solvability.
# A guard nobody runs is a comment.
- name: Guards
run: npm run check
- name: Production build
run: npm run build

# The phone app was not in CI at all: 21 check scripts and the typecheck ran
# only on a developer's machine. Every guard written to stop a mobile
# regression was therefore unenforced on push, which is most of the value of
# having written them.
mobile:
runs-on: ubuntu-latest
defaults:
run:
working-directory: mobile
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: "20"
cache: "npm"
cache-dependency-path: mobile/package-lock.json
- run: npm ci
# NOT `npm audit --audit-level=high` like the frontend job. Vite is a
# devDependency there so --omit=dev removes it; in an Expo app `expo` is a
# runtime dependency by necessity and drags @expo/cli and metro in with it.
# Every high advisory today is in that build toolchain, which never reaches
# a device. This gate fails on any critical, and on any high OUTSIDE a named
# build-toolchain list, so a real one in shipped code still stops the build.
- name: Vulnerability gate
run: node scripts/check-audit.mjs
# Typecheck plus every scripts/check-*.mjs. The checks read the served
# curriculum from backend/live-bridge/app/curriculum_data and some read the
# web source, so this job needs the whole checkout, not just mobile/.
- name: Checks
run: npm run check

backend:
runs-on: ubuntu-latest
strategy:
Expand Down Expand Up @@ -85,6 +122,14 @@ jobs:

secrets:
runs-on: ubuntu-latest
# gitleaks lists the PR's commits to scope its scan, which needs
# pull-requests: read. The workflow-level grant is contents: read only, and a
# Dependabot PR runs with a restricted token, so on those the API call came
# back 403 "Resource not accessible by integration" and the whole job failed.
# Every Dependabot PR mailed a CI failure that had nothing to do with secrets.
permissions:
contents: read
pull-requests: read
steps:
- uses: actions/checkout@v4
with:
Expand Down
14 changes: 13 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -55,9 +55,21 @@ design/
content/Books/
# Personal marketing drafts / screenshots
content/LinkedIn/
# Session handoff scratch doc (superseded by CLAUDE.md / AGENTS.md / curriculum plan)
# Living cross-surface handoff (local only; grab-and-upload into the Claude app).
# Dated archival copies live in metadata/handoffs/.
HANDOFF.md


# live-bridge billing config (mode-specific Stripe price IDs)
backend/live-bridge/.deploy.env

# Personal task tracker (local only, like HANDOFF.md)
FAITH.md

# Signing and store keys. mobile/.gitignore already covers these for that folder;
# this covers the repo root, because a .p8 downloads from App Store Connect
# exactly once and a stray copy in the wrong directory is the whole risk.
*.p8
*.pem
*.mobileprovision
*.p12
4 changes: 3 additions & 1 deletion AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -206,7 +206,9 @@ The live agent is the single entry point for voice sessions but dispatches to di

1. **Plan before building.** For any task touching 3+ files or making architectural decisions: write a plan in `tasks/todo.md` with checkable items, get confirmation, track progress.
2. **One thing at a time.** Atomic, testable changes. Build → verify → commit → move on. Don't refactor five files at once.
3. **Frontend validation.** After any frontend change run `cd frontend && npm run build` — it must pass with zero errors. Then describe the visual result and confirm no regressions.
3. **Frontend validation.** After any frontend change run `cd frontend && npm run check && npm run build`, and `cd mobile && npm run check`. All must pass with zero errors. Then describe the visual result and confirm no regressions.

`npm run check` is the half that catches what reading does not. On 2026-08-28 alone the guards caught a report view rendering an object as a JSX child (React throws; the Max flagship took its own screen down), three Max features sold on the web and callable only from the phone, and a curriculum step that shipped stale because a fix landed after the export ran. The build was green through every one of them. Each guard names the defect it exists for in its own header, and a new guard is expected to prove it has teeth by failing on the defect before it is fixed.
4. **Backend validation.** Run `python3 -m py_compile` on modified files; run tests if present; confirm services start without import errors.
5. **Iteration logging.** After a meaningful unit of work, create `logs/YYYY-MM-DD-iter-NNN-short-description.md`: what changed, why, what was validated, what's next.
6. **Learn from corrections.** When corrected, update `tasks/lessons.md` with a rule that prevents recurrence.
Expand Down
218 changes: 24 additions & 194 deletions LICENSE
Original file line number Diff line number Diff line change
@@ -1,201 +1,31 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
Ohmlet
Copyright (c) 2026 Faith Ogundimu. All rights reserved.

TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
PROPRIETARY AND CONFIDENTIAL

1. Definitions.
This repository and everything in it, including without limitation the source
code, the authored curriculum and lesson content, the lesson films and their
narration, the illustrations, the mascot, the wordmark, the brand assets, and
the accompanying documentation (together, the "Software"), is the proprietary
and confidential property of Faith Ogundimu.

"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
No licence is granted. Specifically, no person or organisation is permitted to
use, copy, modify, merge, publish, distribute, sublicense, sell, host, train a
model on, or create derivative works from the Software, in whole or in part,
without the prior written permission of the copyright holder.

"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
Access to this repository, whether granted deliberately or obtained otherwise,
does not confer any licence or right to the Software.

"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
The Software incorporates third-party open-source components, each of which
remains governed by its own licence. Those licences apply to those components
only and grant no rights over the Software as a whole.

"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.

"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.

"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).

"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.

"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."

"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.

2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.

3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.

4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:

(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and

(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and

(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and

(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.

You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.

5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.

6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.

7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.

8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.

9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.

END OF TERMS AND CONDITIONS

APPENDIX: How to apply the Apache License to your work.

To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.

Copyright [yyyy] [name of copyright owner]

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
Enquiries: faithogun12@gmail.com
Loading
Loading