TutorLoom
기업·대학·교육기관을 위한 학습 플랫폼, 무료 오픈소스이며 엔터프라이즈 버전 제공
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기A collection of free, browser-based practice tools for musicians — a jam tune picker, a metronome, a tuner, a note trainer, an audio slow-downer/looper, and a multitrack recorder. Everything runs locally in your browser; nothing is uploaded anywhere.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다.
README 전문 보기 ↗Current version: v0.10.3 (beta) · What's new
Free practice tools for musicians, in the browser: a metronome (odd and changing meters, polyrhythm modulation), a tuner, ear training with levelled learning paths, note, scale and interval trainers, chord charts (with iReal Pro import), a jam-practice tune picker, a bass-line and drum generator to play along with, a slow-downer/looper, a recorder, a practice log with streaks and goals, setlists, your files (PDFs, recordings, lead sheets) with share links, a community, and tools for teachers and students.
No ads, no paywalls. Every tool works without an account; signing in syncs your stuff between devices.
Use it: soniroll.com
Found a bug, or want a feature? Use soniroll.com/feedback (also in the sidebar's ⋮ menu), or open a GitHub issue.
You need Node and pnpm (pnpm only — no npm or yarn).
pnpm install
pnpm convex:dev # the Convex backend (needs a Convex account and packages/convex/.env.local)
pnpm dev # the website at http://localhost:3000
pnpm mobile # the Expo app (development is paused)
The web app reads NEXT_PUBLIC_CONVEX_URL from apps/web/.env.local; the mobile app reads
EXPO_PUBLIC_CONVEX_URL from apps/mobile/.env.local.
apps/desktop is a Tauri app that reuses the website's own components and
plays sound through a native (Rust) audio engine. It has every tool and page. In development it
uses the same Convex deployment as apps/web/.env.local; releases use production. You need Rust,
plus the system libraries from the flake's desktop shell on Linux:
nix develop .#desktop # Linux: WebKitGTK, PipeWire, ALSA
pnpm desktop # opens the app (with hot reload)
pnpm desktop:build # a release build and installers, in apps/desktop/src-tauri/target/release
Installing a release. Downloads for Linux (.deb, .rpm, .AppImage), macOS (.dmg) and
Windows (-setup.exe) are on the releases page.
On NixOS, run it straight from the flake, or add it to your configuration:
# flake.nix inputs (pin a release tag)
soniroll.url = "github:JackMechem/soniroll/desktop-v0.1.0";
# configuration.nix
environment.systemPackages = [ inputs.soniroll.packages.${pkgs.stdenv.hostPlatform.system}.soniroll-desktop ];
nix run github:JackMechem/soniroll/desktop-v0.1.0
Releasing. The desktop app has its own version, separate from the website's: bump it in
apps/desktop/package.json, src-tauri/tauri.conf.json and src-tauri/Cargo.toml (then
cargo build for the lock file), add a section to apps/desktop/CHANGELOG.md, and check with
apps/desktop/scripts/check-version.sh. Pushing a tag desktop-vX.Y.Z builds the installers and
publishes the GitHub release (.github/workflows/desktop-release.yml). Every push that touches the
app, the website or the packages runs the desktop checks (desktop-ci.yml). If pnpm-lock.yaml
changes, the flake's pnpm hash for the desktop package changes too: set it to "", run
nix build .#soniroll-desktop, and copy in the hash it prints.
| Folder | What's in it |
|---|---|
apps/web | The website (Next.js + Tailwind) |
apps/mobile | The iOS/Android app (Expo). Development is paused for now; it may pick up again later. |
apps/desktop | The desktop app (Tauri), an early test: the website's components with native audio |
packages/core | Shared logic used by both apps and the backend |
packages/convex | The backend (Convex) |
docs | How it fits together, style guide, versioning, testing, deploying, and feature notes |
Nobody works directly on main any more.
| Branch | What it's for |
|---|---|
main | What's live on soniroll.com. Only changes from preview are merged in, when a version is ready to release. |
preview | Where day-to-day work happens and gets tested before release. |
<type>/<short-name> | Optional, for a bigger or riskier piece of work. Branch off preview, merge back into preview when done, then delete it. |
Naming work branches: <type>/<short-name>, lowercase, words joined by hyphens, a few words
at most, no dates or version numbers.
| Type | Use it for | Example |
|---|---|---|
feature/ | A new tool, page or ability | feature/bass-genius-mobile |
fix/ | A bug fix | fix/shed-log-streak-reset |
design/ | Visual or wording changes, no new behavior | design/sidebar-cards |
refactor/ | Restructuring code without changing what it does | refactor/synced-settings-cache |
docs/ | Documentation only | docs/branch-guidelines |
chore/ | Dependencies, build and tooling | chore/expo-sdk-58 |
Releasing: bump the version on preview (see docs/guides/versioning.md),
check it, then merge preview into main. Merging into main is what updates the live site.
Every branch except main also gets a Vercel preview site with its own separate backend and demo
data; see docs/guides/deploying.md.
soniroll uses semantic versioning and is in beta until 1.0. The version is set in
apps/web/package.json, and every release is listed at soniroll.com/changelog
(entries live in apps/web/lib/changelog.ts). See docs/guides/versioning.md.
Samples and fonts are by their authors under their own licenses; see soniroll.com/credits.