Dentalpin
무료 오픈소스 치과 클리닉 관리 소프트웨어, 일정·환자·치아도·견적·청구서 제공, 코드를 직접 설치 가능
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 README에서 읽을 수 있습니다. 저장소 README ↗
README 전체를 불러오는 중입니다.
README 전문 보기 ↗Screening support for respiratory care. Not a diagnosis: the doctor keeps final judgment. All data in this repository is fictional, and every threshold, range and model output is an unvalidated sample.
npm install --legacy-peer-deps
npm run setup:ai # once: installs the AI service (needs Python 3.10+)
npm run dev # http://localhost:3000, web app + AI service, already connected
npm run dev:web # web app alone, with the labelled Demo model
npm test # unit tests (AI contracts, quality gate, pipeline, WAV measurement)
npm run test:e2e # Playwright (uses a fake microphone; set PW_CHROMIUM for a custom browser)
npm run gen:openapi # regenerates services/inference/openapi.json from the Zod contracts
Demo access: any email, a password of 8+ characters, one-time code 482916.
Patient recording link to try without creating a record: /r/demo-invite.
| Path | What it is |
|---|---|
src/styles/tokens.css, tailwind.config.ts | Token layer. No hex values in components. |
src/components/ui | Primitives. Reference at /design; per-flow state libraries at /design/states/*. |
src/messages/{es,en}.json, src/lib/i18n | es-AR primary, EN secondary. Cookie spiro_locale. |
src/data | Fixtures, in-memory store and repositories. Swap for Postgres behind the same functions. |
src/ai | Isolated AI slot: contracts, providers (mock, http), quality gate, pipeline, post-processing. |
services/inference | FastAPI placeholder and generated openapi.json. |
src/components/recorder, src/lib/recorder | Desktop recording (patient link and assisted). |
src/lib/report | One report model, used by the live preview and the server PDF. |
Force the designed states on data screens with ?state=loading|empty|error.
The real models (voice: vowel + counting, cough) run in services/inference, a separate Python service.
Setting AI_ENDPOINT is enough to connect the app to it (AI_PROVIDER defaults to http when an endpoint is set,
mock otherwise). Other variables: AI_API_KEY, AI_TIMEOUT_MS (default 60000), AI_ENABLED, AI_MODEL_VERSION_PIN.
Every result keeps model id and version, confidence, quality and the disclaimer; the UI labels mock results "Demo model".
See src/ai/README.md.
Locally: npm run setup:ai once, then npm run dev starts both and connects them. If the AI service is not
installed, npm run dev says so and falls back to the Demo model.
Deployed (always connected):
render.yaml builds
services/inference/Dockerfile and generates an AI_API_KEY. Any Docker host works the same way.AI_ENDPOINT: the service URL, e.g. https://spiroai-inference.onrender.comAI_API_KEY: the same value as on RenderAPP_ORIGIN: the public URL of the web app (the service downloads the recordings from it)render.yaml uses Render's free plan, so no payment details are asked. It sleeps after 15 minutes idle; the first
test after that waits about a minute, which fits inside the 60 s timeout. The service peaks at about 400 MB, inside
the free 512 MB. For an always-on service, change plan: free to plan: starter (paid).
What each model learned, how well it does and its known biases: services/inference/models/MODEL_CARD.md.
Browser voice processing (echo cancellation, noise suppression, auto gain) is switched off, and what the browser actually applied is read back from the track and stored. Audio is captured as raw PCM through an AudioWorklet, encoded to 16-bit WAV, and uploaded in resumable chunks. The server measures the PCM itself, runs the quality gate, then the screening job in the background. The patient link never shows a score.
AUDIO_SIGNING_SECRET, APP_ORIGIN, and replace the mock auth (cookies spiro_pre, spiro_session) and the demo OTP with real identity and TOTP.