El-Kayyisa is a personal and structured tutoring service designed around a simple premise: students do not need more noise. They need guidance that understands their current position, identifies what is holding them back, and makes the next meaningful step clear.
This repository contains the public-facing El-Kayyisa web experience. It combines tutoring landing pages, program information, learning content, legal pages, and a bespoke presentation of Sentra Smartboard—a learning intelligence surface for communicating progress, patterns, observations, and follow-up needs.
|
PRODUCT Personal tutoring website and Smartboard presentation surface. |
PRIMARY USERS Students, parents, tutors, and service administrators. |
CURRENT SCOPE Frontend presentation, local routes, mirrored content, and bespoke pages. |
DECISION BOUNDARY Tutors and parents remain responsible for educational decisions. |
%%{init: {"theme":"base","themeVariables":{"background":"#FFFFFF","primaryColor":"#FFFFFF","secondaryColor":"#FFFFFF","tertiaryColor":"#FFFFFF","primaryTextColor":"#0F172A","secondaryTextColor":"#0F172A","tertiaryTextColor":"#0F172A","lineColor":"#64748B","clusterBkg":"#FFFFFF","clusterBorder":"#CBD5E1","fontFamily":"Inter, ui-sans-serif, system-ui"}}}%%
flowchart LR
A["Student context"] --> B["Personal tutoring"]
B --> C["Session observations"]
C --> D["Visible progress"]
D --> E["Shared interpretation"]
E --> F["Next meaningful step"]
F --> B
classDef blue fill:#FFFFFF,stroke:#2563EB,color:#1E3A8A,stroke-width:2px;
classDef violet fill:#FFFFFF,stroke:#7C3AED,color:#4C1D95,stroke-width:2px;
classDef green fill:#FFFFFF,stroke:#16A34A,color:#14532D,stroke-width:2px;
classDef orange fill:#FFFFFF,stroke:#F97316,color:#7C2D12,stroke-width:2px;
class A,B blue;
class C,D violet;
class E green;
class F orange;
The current objective is precise: present El-Kayyisa as a calm, credible, human-centered tutoring service while establishing the frontend foundation for a more connected learning ecosystem.
Technology should make the student journey easier to understand—not make learning feel more complicated.
The product is organized into three connected but distinct layers.
%%{init: {"theme":"base","themeVariables":{"background":"#FFFFFF","primaryColor":"#FFFFFF","secondaryColor":"#FFFFFF","tertiaryColor":"#FFFFFF","primaryTextColor":"#0F172A","secondaryTextColor":"#0F172A","tertiaryTextColor":"#0F172A","lineColor":"#64748B","clusterBkg":"#FFFFFF","clusterBorder":"#CBD5E1","fontFamily":"Inter, ui-sans-serif, system-ui"}}}%%
flowchart TB
subgraph L1["LEARNING LAYER"]
A1["Personal tutoring"]
A2["Clear learning targets"]
A3["Gradual reinforcement"]
A4["Parent and tutor communication"]
end
subgraph L2["SMARTBOARD LAYER"]
B1["Session summaries"]
B2["Longitudinal progress"]
B3["Tutor observations"]
B4["AI-assisted recommendations"]
end
subgraph L3["PLATFORM LAYER"]
C1["React application"]
C2["Local routing"]
C3["Mirrored pages"]
C4["Bespoke product pages"]
end
L1 --> L2
L2 --> L3
classDef learning fill:#FFFFFF,stroke:#2563EB,color:#1E3A8A,stroke-width:2px;
classDef smart fill:#FFFFFF,stroke:#7C3AED,color:#4C1D95,stroke-width:2px;
classDef platform fill:#FFFFFF,stroke:#F97316,color:#7C2D12,stroke-width:2px;
class A1,A2,A3,A4 learning;
class B1,B2,B3,B4 smart;
class C1,C2,C3,C4 platform;
style L1 fill:#FFFFFF,stroke:#2563EB,stroke-width:2px;
style L2 fill:#FFFFFF,stroke:#7C3AED,stroke-width:2px;
style L3 fill:#FFFFFF,stroke:#F97316,stroke-width:2px;
| Capability | Current implementation | Explicit boundary |
|---|---|---|
| Multi-page tutoring website | Local React routes for programs, information, insights, pricing, and supporting pages. | Frontend presentation only. |
| Sentra Smartboard page | Hand-authored React page with learning summaries, progress visuals, program signals, and AI recommendation examples. | No operational student backend is included. |
| Responsive navigation | Desktop and mobile navigation, fullscreen menu, escape handling, scroll-aware behavior, and route-aware links. | Navigation state is client-side. |
| Source-page preservation | Raw HTML snapshots are parsed, localized, and rendered while retaining source classes and layout behavior. | Only vetted local snapshots should enter this path. |
| Local asset mirror | CSS, JavaScript, fonts, images, and supporting assets can be mirrored into public/source-assets. |
Refreshing assets requires access to the configured source origin. |
| Legal information | Dedicated Indonesian privacy policy and terms-of-service routes. | Formal legal review remains an organizational responsibility. |
| Runtime metadata | Mirrored routes update browser title and description from their source snapshots. | The static shell still contains legacy metadata. |
%%{init: {"theme":"base","themeVariables":{"background":"#FFFFFF","primaryColor":"#FFFFFF","secondaryColor":"#FFFFFF","tertiaryColor":"#FFFFFF","primaryTextColor":"#0F172A","secondaryTextColor":"#0F172A","tertiaryTextColor":"#0F172A","lineColor":"#64748B","clusterBkg":"#FFFFFF","clusterBorder":"#CBD5E1","fontFamily":"Inter, ui-sans-serif, system-ui"}}}%%
flowchart LR
R["Browser request"] --> Q{"Route classification"}
Q -->|Mirrored| M["Source mirror pipeline"]
Q -->|Bespoke| B["Bespoke React pipeline"]
Q -->|Unknown| X["Redirect to /services"]
M --> M1["/services"]
M --> M2["/services/*"]
M --> M3["/blog"]
M --> M4["/about"]
M --> M5["/pricing"]
B --> B1["/smartboard"]
B --> B2["/kebijakan-privasi"]
B --> B3["/ketentuan-layanan"]
classDef entry fill:#FFFFFF,stroke:#475569,color:#0F172A,stroke-width:2px;
classDef mirror fill:#FFFFFF,stroke:#2563EB,color:#1E3A8A,stroke-width:2px;
classDef bespoke fill:#FFFFFF,stroke:#7C3AED,color:#4C1D95,stroke-width:2px;
classDef redirect fill:#FFFFFF,stroke:#F97316,color:#7C2D12,stroke-width:2px;
class R,Q entry;
class M,M1,M2,M3,M4,M5 mirror;
class B,B1,B2,B3 bespoke;
class X redirect;
| Route | Surface | Rendering pattern |
|---|---|---|
/services |
Main program and landing surface | Source mirror |
/services/ai-strategy |
Program detail surface | Source mirror |
/services/business-consulting |
Program detail surface | Source mirror |
/services/data-insights |
Program detail surface | Source mirror |
/blog |
Learning insights | Source mirror |
/about |
El-Kayyisa information | Source mirror |
/pricing |
Learning model and pricing | Source mirror |
/smartboard |
Sentra Smartboard presentation | Bespoke React page |
/kebijakan-privasi |
Privacy policy | Bespoke React page |
/ketentuan-layanan |
Terms of service | Bespoke React page |
* |
Unknown route | Redirect to /services |
The three
/services/*slugs are inherited technical routes from the original source structure. Their user-facing content is authoritative; the legacy slug names are not.
%%{init: {"theme":"base","themeVariables":{"background":"#FFFFFF","primaryColor":"#FFFFFF","secondaryColor":"#FFFFFF","tertiaryColor":"#FFFFFF","primaryTextColor":"#0F172A","secondaryTextColor":"#0F172A","tertiaryTextColor":"#0F172A","lineColor":"#64748B","clusterBkg":"#FFFFFF","clusterBorder":"#CBD5E1","fontFamily":"Inter, ui-sans-serif, system-ui"}}}%%
flowchart TD
A["Browser"] --> B["React 19 and BrowserRouter"]
B --> C["src/App.tsx"]
C --> D{"Rendering contract"}
D -->|Mirrored route| E["src/sourcePages.ts"]
E --> F["Captured HTML snapshots"]
E --> G["DOM parsing and URL localization"]
G --> H["src/components/SourcePage.tsx"]
H --> I["Local mirrored assets"]
H --> J["Reattached navigation, FAQ, and scroll behavior"]
D -->|Bespoke route| K["Smartboard and policy pages"]
K --> L["Shared SiteHeader and SiteFooter"]
K --> M["Scoped styles"]
K --> N["Controlled GSAP motion"]
O["scripts/mirror-source-assets.mjs"] --> I
I --> P["public/source-assets"]
classDef browser fill:#FFFFFF,stroke:#475569,color:#0F172A,stroke-width:2px;
classDef core fill:#FFFFFF,stroke:#2563EB,color:#1E3A8A,stroke-width:2px;
classDef mirror fill:#FFFFFF,stroke:#16A34A,color:#14532D,stroke-width:2px;
classDef bespoke fill:#FFFFFF,stroke:#7C3AED,color:#4C1D95,stroke-width:2px;
classDef asset fill:#FFFFFF,stroke:#F97316,color:#7C2D12,stroke-width:2px;
class A browser;
class B,C,D core;
class E,F,G,H,J mirror;
class K,L,M,N bespoke;
class I,O,P asset;
tutoring-landing/
├── index.html # Vite application shell
├── index-2.html ... index-5.html # Captured source-page snapshots
├── source-about.html # Captured About page
├── source-blog.html # Captured insights page
├── source-pricing.html # Captured learning/pricing page
├── package.json # Runtime, scripts, and dependencies
├── tsconfig.json # Strict TypeScript configuration
├── scripts/
│ └── mirror-source-assets.mjs # Source-asset crawler and localizer
├── public/
│ └── source-assets/ # Runtime assets served by Vite
└── src/
├── main.tsx # React root and BrowserRouter
├── App.tsx # Route registry and fallback
├── sourcePages.ts # Source parsing and route localization
├── components/
│ ├── SourcePage.tsx # Generic mirrored-page renderer
│ ├── SmartboardPage.tsx # Bespoke Smartboard experience
│ ├── SiteChrome.tsx # Shared header, menu, and footer
│ ├── PrivacyPolicyPage.tsx # Indonesian privacy policy
│ └── TermsOfServicePage.tsx # Indonesian terms of service
├── lib/
│ └── smartboardMotion.ts # Smartboard motion behavior
└── styles/
└── app.css # Global, mirrored, and scoped styles
- Node.js
- npm
- Git
The repository does not currently pin a Node.js version through engines or a
version file. Use a maintained Node.js LTS release compatible with the locked
dependency tree.
git clone https://github.com/drferdii/tutoring-landing.git
cd tutoring-landing
npm installnpm run devVite prints the local development URL in the terminal.
npm run buildThe build command performs strict TypeScript validation and then creates the
production bundle in dist/.
npm run previewnpm run assets:mirrorThis command reads captured source HTML, discovers eligible assets from the
configured origin, downloads them, rewrites internal references, and stores the
result under public/source-assets/.
Do not run the mirror command casually in a review branch. It can generate a broad asset diff and depends on the current external source origin.
| Command | Purpose | Required before merge |
|---|---|---|
npm run dev |
Start the Vite development server | For visual and interaction checks |
npm run typecheck |
Run TypeScript without emitting files | Yes |
npm run build |
Typecheck and create the production bundle | Yes |
npm run preview |
Preview the generated production build | Recommended |
npm run assets:mirror |
Refresh mirrored source assets | Only when source assets change |
The inspected application code does not currently document required runtime environment variables.
Do not add secrets, student data, API credentials, or private service endpoints to committed frontend files. Future integrations should use explicit environment contracts and server-side protection wherever sensitive data is involved.
%%{init: {"theme":"base","themeVariables":{"background":"#FFFFFF","primaryColor":"#FFFFFF","secondaryColor":"#FFFFFF","tertiaryColor":"#FFFFFF","primaryTextColor":"#0F172A","secondaryTextColor":"#0F172A","tertiaryTextColor":"#0F172A","lineColor":"#64748B","clusterBkg":"#FFFFFF","clusterBorder":"#CBD5E1","fontFamily":"Inter, ui-sans-serif, system-ui"}}}%%
flowchart LR
A["Proposed change"] --> B{"Target surface"}
B -->|Mirrored page| C["Preserve markup and visual language"]
B -->|Bespoke page| D["Use explicit React composition"]
C --> E["Minimal traceable transformation"]
D --> F["Scoped classes and controlled motion"]
E --> G["Route and asset validation"]
F --> G
G --> H{"Claims and accessibility valid?"}
H -->|Yes| I["Ready for review"]
H -->|No| J["Revise before merge"]
classDef input fill:#FFFFFF,stroke:#475569,color:#0F172A,stroke-width:2px;
classDef mirror fill:#FFFFFF,stroke:#2563EB,color:#1E3A8A,stroke-width:2px;
classDef bespoke fill:#FFFFFF,stroke:#7C3AED,color:#4C1D95,stroke-width:2px;
classDef gate fill:#FFFFFF,stroke:#D97706,color:#78350F,stroke-width:2px;
classDef pass fill:#FFFFFF,stroke:#16A34A,color:#14532D,stroke-width:2px;
classDef fail fill:#FFFFFF,stroke:#DC2626,color:#7F1D1D,stroke-width:2px;
class A,B input;
class C,E mirror;
class D,F bespoke;
class G,H gate;
class I pass;
class J fail;
Preserve the source design.
Keep user-facing copy in Bahasa Indonesia.
Do not mix mirrored and bespoke rendering patterns.
Do not hand-edit generated mirrored assets.
Do not introduce motion that reduces clarity or accessibility.
Do not claim backend capability that this repository does not provide.
|
|
|
The broader El-Kayyisa service may use student and parent contact details, learning targets, schedules, attendance, tutor notes, learning activity, payment information, and Smartboard summaries or recommendations.
This repository itself is a frontend codebase, not the operational student information system.
%%{init: {"theme":"base","themeVariables":{"background":"#FFFFFF","primaryColor":"#FFFFFF","secondaryColor":"#FFFFFF","tertiaryColor":"#FFFFFF","primaryTextColor":"#0F172A","secondaryTextColor":"#0F172A","tertiaryTextColor":"#0F172A","lineColor":"#64748B","clusterBkg":"#FFFFFF","clusterBorder":"#CBD5E1","fontFamily":"Inter, ui-sans-serif, system-ui"}}}%%
flowchart LR
A["Public frontend repository"] --> B["Static presentation content"]
A --> C["Illustrative Smartboard surface"]
D["PROHIBITED: Real student data"] -.-> A
E["PROHIBITED: Secret credentials"] -.-> A
F["PROHIBITED: Unreviewed AI judgment"] -.-> A
C --> G["Future protected backend"]
G --> H["Role-based access"]
G --> I["Consent and retention controls"]
G --> J["Audit trail"]
G --> K["Protected AI services"]
K --> L["Human review"]
L --> M["Educational decision"]
classDef frontend fill:#FFFFFF,stroke:#2563EB,color:#1E3A8A,stroke-width:2px;
classDef prohibited fill:#FFFFFF,stroke:#DC2626,color:#7F1D1D,stroke-width:2px;
classDef protected fill:#FFFFFF,stroke:#7C3AED,color:#4C1D95,stroke-width:2px;
classDef governance fill:#FFFFFF,stroke:#D97706,color:#78350F,stroke-width:2px;
classDef human fill:#FFFFFF,stroke:#16A34A,color:#14532D,stroke-width:2px;
class A,B,C frontend;
class D,E,F prohibited;
class G,H,I,J,K protected;
class L governance;
class M human;
NO REAL STUDENT DATA IN STATIC SOURCE.
NO SECRET KEYS IN CLIENT CODE.
NO AI OUTPUT PRESENTED AS FINAL EDUCATIONAL JUDGMENT.
NO OPERATIONAL SMARTBOARD CLAIM WITHOUT A VERIFIED BACKEND.
Any future operational Smartboard integration should add, at minimum:
- authenticated role-based access;
- parent or guardian consent handling;
- least-privilege data access;
- server-side validation;
- audit trails;
- retention and deletion controls;
- protected AI service calls;
- explicit human review of recommendations;
- incident and recovery procedures.
Sentra AI should strengthen tutor and parent judgment. It must not silently replace educational responsibility.
%%{init: {"theme":"base","themeVariables":{"background":"#FFFFFF","primaryColor":"#FFFFFF","secondaryColor":"#FFFFFF","tertiaryColor":"#FFFFFF","primaryTextColor":"#0F172A","secondaryTextColor":"#0F172A","tertiaryTextColor":"#0F172A","lineColor":"#64748B","clusterBkg":"#FFFFFF","clusterBorder":"#CBD5E1","fontFamily":"Inter, ui-sans-serif, system-ui"}}}%%
flowchart LR
A["Focused change"] --> B["TypeScript typecheck"]
B --> C["Production build"]
C --> D["Route verification"]
D --> E["Responsive interaction review"]
E --> F["Smartboard motion review"]
F --> G["Privacy and legal route review"]
G --> H["SPA fallback verification"]
H --> I["Merge-ready evidence"]
B -.-> X["Repair"]
C -.-> X
D -.-> X
E -.-> X
F -.-> X
G -.-> X
H -.-> X
X --> B
classDef start fill:#FFFFFF,stroke:#475569,color:#0F172A,stroke-width:2px;
classDef automated fill:#FFFFFF,stroke:#2563EB,color:#1E3A8A,stroke-width:2px;
classDef manual fill:#FFFFFF,stroke:#7C3AED,color:#4C1D95,stroke-width:2px;
classDef pass fill:#FFFFFF,stroke:#16A34A,color:#14532D,stroke-width:2px;
classDef repair fill:#FFFFFF,stroke:#DC2626,color:#7F1D1D,stroke-width:2px;
class A start;
class B,C automated;
class D,E,F,G,H manual;
class I pass;
class X repair;
Before a change is considered ready:
npm run typecheck
npm run buildThen verify manually:
- all routes load directly and through internal navigation;
- the mobile menu opens, closes, and responds to
Escape; - page scrolling is restored after overlays close;
- mirrored-page FAQ behavior still works;
- navbar scroll behavior remains stable;
- Smartboard motion creates no layout shifts or console errors;
- privacy and terms pages remain reachable;
- unknown routes redirect to
/services; - production hosting returns the SPA shell for direct route requests.
| Gate | Current state | Classification |
|---|---|---|
| Strict TypeScript validation | Present | Automated |
| Production build | Present | Automated |
| Visual and interaction verification | Present | Manual |
| Lint command | Not configured | Gap |
| Unit and component tests | Not configured | Gap |
| End-to-end browser tests | Not configured | Gap |
| Accessibility regression tests | Not configured | Gap |
This README does not assume CI coverage that is not expressed by the current repository scripts.
%%{init: {"theme":"base","themeVariables":{"background":"#FFFFFF","primaryColor":"#FFFFFF","secondaryColor":"#FFFFFF","tertiaryColor":"#FFFFFF","primaryTextColor":"#0F172A","secondaryTextColor":"#0F172A","tertiaryTextColor":"#0F172A","lineColor":"#64748B","clusterBkg":"#FFFFFF","clusterBorder":"#CBD5E1","fontFamily":"Inter, ui-sans-serif, system-ui"}}}%%
flowchart LR
A["Repository source"] --> B["npm run build"]
B --> C["TypeScript validation"]
C --> D["Vite production bundle"]
D --> E["dist/"]
E --> F["Static hosting platform"]
F --> G{"Direct application route"}
G -->|Known asset| H["Serve asset"]
G -->|SPA route| I["Rewrite to index.html"]
I --> J["BrowserRouter resolves page"]
classDef source fill:#FFFFFF,stroke:#475569,color:#0F172A,stroke-width:2px;
classDef build fill:#FFFFFF,stroke:#2563EB,color:#1E3A8A,stroke-width:2px;
classDef output fill:#FFFFFF,stroke:#7C3AED,color:#4C1D95,stroke-width:2px;
classDef hosting fill:#FFFFFF,stroke:#F97316,color:#7C2D12,stroke-width:2px;
classDef resolved fill:#FFFFFF,stroke:#16A34A,color:#14532D,stroke-width:2px;
class A source;
class B,C,D build;
class E output;
class F,G,H,I hosting;
class J resolved;
The application builds as a Vite single-page application. The hosting platform
must support SPA rewrites so direct visits to routes such as /smartboard and
/kebijakan-privasi do not return 404.
No platform-specific deployment contract was identified in the inspected application files. Add deployment configuration only for the platform actually used; do not accumulate speculative files.
| Area | Current state | Recommended next action |
|---|---|---|
| Static shell metadata | index.html still uses the legacy title Aeline; mirrored pages update metadata only after JavaScript runs. |
Replace shell metadata with El-Kayyisa defaults and verify social previews. |
| Backend capability | No authentication, database, student records, tutor portal, or operational Smartboard API is present. | Keep frontend claims bounded until the backend exists and is verified. |
| Automated testing | No lint, unit, component, accessibility, or E2E suite is configured. | Add the smallest useful CI gate after stabilizing the current interface. |
| HTML trust boundary | Mirrored pages use dangerouslySetInnerHTML after parsing trusted snapshots. |
Treat snapshots as reviewed code and never accept untrusted HTML input. |
| Source dependency | Asset refresh depends on https://aeline.temlis.workers.dev. |
Preserve reviewed local assets and document future source migration. |
| Legacy route slugs | Some technical routes retain generic template names. | Rename only through an explicit migration with redirect coverage. |
| Licensing | No standalone repository LICENSE file is present. |
Add a license only after ownership and distribution terms are approved. |
- Create a focused branch from
main. - Keep the change limited to one clear objective.
- Identify whether the target page is mirrored or bespoke before editing.
- Avoid unrelated design rewrites and broad generated-asset changes.
- Run typecheck and the production build.
- Perform direct-route and responsive visual checks.
- Explain new data, security, accessibility, or source-origin implications in the pull request.
Use short, intentional messages:
docs: add comprehensive project README
fix: correct mobile navigation overflow
feat: add tutoring contact route
refactor: isolate smartboard motion lifecycle
Do not place student information, parent information, payment details, private screenshots, credentials, or production endpoints in issues, pull requests, commits, or frontend source files.
For security-sensitive findings:
- avoid publishing exploit details in a public issue;
- contact the repository owner privately through the GitHub profile;
- include affected route or component, reproduction conditions, impact, and a minimal remediation proposal;
- remove all real personal data from evidence.
Repository owner: @drferdii
The repository does not currently contain a standalone open-source license. Therefore, no permission to copy, redistribute, modify, or commercialize the code should be assumed.
The in-application Terms of Service state that:
- the work was created by Sentra for El-Kayyisa;
- economic rights are held by El-Kayyisa;
- moral rights remain attached to Sentra as creator, subject to applicable Indonesian copyright law.
For formal reuse or distribution, obtain written authorization from the rights holder.
|
|
|
|
|
Personal tutoring built around understanding, continuity, and meaningful progress. |
Intelligent digital systems designed to strengthen human capability and institutional continuity. |
Guided by Human Insight, Powered by Artificial Intelligence.
El-Kayyisa × Sentra Artificial Intelligence · Indonesia
// intelligence with purpose · learning with direction

