IF1EIGHT0STY
srcforms_core.vue

/**
* ING Forms — self-hosted form builder, full-stack core
* @author Roshan Aryan Majhi · editor + admissions contributor
*/

Ask anything.
Own everything.

ING Forms is a self-hosted form builder for admissions, internal data collection and client surveys — a customized OpnForm deployment with Keycloak SSO, education-specific fields, AI drafting and a containerized Laravel + Nuxt production fleet. I shipped editor polish and admissions-domain features on a nine-person team.

// design_system

System first, screens second.

design_system.fig

color/tokens

primary

#774EA7

secondary

#F6EDFC

info

#9D90D1

warning

#F2C07E

notion

#191919

paper

#F7F6F3

type/scale

Aa

Inter / Nuxt UI

Heading 20

Body 14 · notion-calm

mono 11 · fields & logic

radius/soft

md
lg
xl
full

fields lg · avatars full

components/ui

PublishPreviewrequired
Your answer…*req
Tokens → components, no hard-coded hex
fields.stat
20+
field types
field types
integrations.stat
12
integrations
integrations
field.json
{
  "type": "select",
  "name": "course",
  "source": "attendance_api",
  "required": true
}
Admissions field
builder.demo
Short text
Email
Course

3 fields · autosaved

Click a field, watch the canvas grow
auth.gate
Keycloak SSOOIDC
Workspaces03
2FAON
jwt session · demo workspace
ai.draft

“admission form for +2 science…”

4 fields will appear here

Describe it, get a draft
webhooks.pipe
Zapier5 zaps
n8n3 flows
SlackLIVE
StripeLIVE
Every submit, everywhere
analytics.viz
72%
1,248
submissions
3,904
form views
Completion, not just counts
commits.log
26 commits · editor & admissions
package.json
nuxt3.17.1
vue3.5.13
laravel/framework11.x
pinia3.0.2
tailwindcss4.1.10
php8.2

+55 more in package.json

The stack
workers.fleet
queue:work8 workers
schedule:workevery minute
horizonsupervising

webhooks never block a submit

Always draining

// why_it_exists

Admissions can't wait on SaaS.

Intakes, surveys and internal data collection all ran through tools the team couldn't control — per-seat pricing, data off-site, and no way to model education domain logic.

ING Forms brings it home. A self-hosted builder on our own metal: admissions fields on the model, SSO at the gate, AI drafts in the editor, and every submission fanning out to queues, sheets and chat tools in seconds.

// feature_modules

What ships inside.

form_editor

Drag-and-drop builder over 20+ field types — text, email, phone with per-country placeholders, dates, dropdowns, files, signatures, payments, barcodes and notion-styled layout blocks.

20+ fieldsdnd canvasconditional logic

admissions_domain

Education-specific fields (course, group, year, intake, phase, total_student) on the Form model, with duplicate-form flows pulling live course and group data from the attendance system.

custom migrationsattendance API

submissions_analytics

Per-form dashboard with submission tracking, traffic breakdown and completion rates — including a global submission-settings section for surveys.

funnelscompletion tracking

workspaces_access

Multi-workspace isolation with admin / user / readonly roles, workspace-scoped forms and submissions, plus 2FA on top of SSO.

rbacscoped data

ai_generation

OpenAI-powered drafting: describe the form you need and get a structured starting point with fields, validation and layout to refine in the editor.

openaidraft-to-editor

keycloak_sso

Keycloak as the primary identity provider with JWT session management, replacing default auth — env-driven across demo and production.

oidcjwt sessions

integrations_webhooks

Native-feel bridges to Zapier, n8n, Activepieces and Google Sheets, plus Slack, Discord, Telegram and email notifications on every submission.

webhooksautomations

queue_fleet

Containerized workers (queue:work), scheduler (schedule:work) and Horizon supervision behind Nginx ingress, with health checks and zero-downtime deploys.

horizondocker compose

// engineering_decisions

Worth noting.

  • +Self-host over SaaS admissions data stays in-house on PostgreSQL + Redis instead of a third-party form vendor.
  • +Extend, don't rebuild OpnForm as the base bought the editor and 20+ fields; effort went into SSO, admissions domain and infrastructure.
  • +Education fields via migrations course, group, year, intake, phase live on the Form model, so every downstream view inherits them.
  • +Async everything heavy notifications, webhooks and sheets sync ride the queue fleet — submissions never wait on integrations.
  • +Duplicate with live data duplicating a form re-pulls courses and groups from the attendance system instead of copying stale options.

// my_role

What I built.

Editor polish and admissions-domain features across Nuxt and Laravel, driving the demo branch through stakeholder review cycles.

26
commits
521 + 503
client + api files
~9
person team

$form_editor_polish

  • Form-editor UI fixes across the builder canvas
  • Phone placeholder made country-specific instead of global
  • Form / survey name made editable inline

$admissions_domain

  • Duplicate-form flow wired to live course + group APIs
  • Education fields carried through create / edit / duplicate
  • Global survey submission-settings section

$platform_plumbing

  • Keycloak env wiring (NUXT_PUBLIC_*) across environments
  • Session-expired popup removal and delete-error copy fixes
  • Initial loader replaced with shared circular spinner

$demo_branch_driver

  • Drove demo-branch merges fronting stakeholder reviews
  • User CRUD and submission-settings collaboration passes
  • QC loop on editor regressions before showcases

// in_one_line

A self-hosted form builder where admissions logic, AI drafts and analytics share one workspace.
Nuxt 3Vue 3Laravel 11PHP 8.2PostgreSQL 16RedisKeycloakStripeOpenAIDockerTailwind 4Pinia