{"id":30439878,"url":"https://github.com/pennypack/learn-erlang","last_synced_at":"2025-08-23T05:05:44.236Z","repository":{"id":305072511,"uuid":"1017561607","full_name":"pennypack/learn-erlang","owner":"pennypack","description":"Learn Erlang Step-By-Step","archived":false,"fork":false,"pushed_at":"2025-07-31T19:35:28.000Z","size":287,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-07-31T22:34:38.990Z","etag":null,"topics":["beam","erlang","koans","otp","tutorial"],"latest_commit_sha":null,"homepage":"https://learnerlang.com/","language":"MDX","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/pennypack.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-07-10T18:15:44.000Z","updated_at":"2025-07-31T19:35:31.000Z","dependencies_parsed_at":"2025-07-18T07:21:06.848Z","dependency_job_id":"f4a03a98-e847-4b3f-95ce-15df798a54b9","html_url":"https://github.com/pennypack/learn-erlang","commit_stats":null,"previous_names":["pennypack/learn-erlang"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/pennypack/learn-erlang","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pennypack%2Flearn-erlang","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pennypack%2Flearn-erlang/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pennypack%2Flearn-erlang/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pennypack%2Flearn-erlang/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pennypack","download_url":"https://codeload.github.com/pennypack/learn-erlang/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pennypack%2Flearn-erlang/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":271745472,"owners_count":24813499,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-23T02:00:09.327Z","response_time":69,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["beam","erlang","koans","otp","tutorial"],"created_at":"2025-08-23T05:04:25.693Z","updated_at":"2025-08-23T05:05:44.203Z","avatar_url":"https://github.com/pennypack.png","language":"MDX","readme":"# Learn Erlang Step-by-Step\n\nAn interactive tutorial website for learning Erlang by building a WebSocket chat server from scratch. This project teaches Erlang through hands-on coding, progressing from basic syntax to building a production-ready distributed chat system.\n\n## 🎯 What You'll Build\n\nThrough 35 progressive lessons, you'll build a complete WebSocket chat server while learning:\n\n- Erlang fundamentals and functional programming\n- OTP (Open Telecom Platform) patterns\n- Concurrent and distributed systems\n- Real-time communication with WebSockets\n- Production deployment and operations\n\n## ✨ Features\n\n- **Interactive Koans**: Fill-in-the-blank exercises with immediate feedback\n- **Progressive Learning**: Each lesson builds on the previous ones\n- **Real Project**: Build an actual chat server, not just toy examples\n- **Modern UI**: Dark/light mode, syntax highlighting, progress tracking\n- **Responsive Design**: Works great on desktop and mobile\n- **Fast Search**: Quick lesson search with keyboard shortcuts (Cmd/Ctrl+K)\n\n## 🚀 Getting Started\n\n### Prerequisites\n\n- Node.js 22\n- npm\n\n### Installation\n\n```bash\n# Clone the repository\ngit clone https://github.com/pennypack/learn-erlang.git\ncd learn-erlang\n\n# Install dependencies\nnpm install\n\n# Start development server\nnpm run dev\n\n# Open http://localhost:4321\n```\n\n### Building for Production\n\n```bash\n# Type check and build\nnpm run build\n\n# Preview production build\nnpm run preview\n```\n\n## 📝 Contributing\n\nWe welcome contributions! Here's how you can help:\n\n### Reporting Issues\n\n- Check existing issues first\n- Use issue templates when available\n- Include browser/OS information for UI issues\n- Provide code examples for content issues\n\n### Submitting Pull Requests\n\n1. Fork the repository\n2. Create a feature branch: `git checkout -b feature/your-feature`\n3. Make your changes\n4. Run type checking: `npx astro check`\n5. Commit with clear messages: `git commit -m \"Add: your feature\"`\n6. Push to your fork: `git push origin feature/your-feature`\n7. Open a pull request\n\n### Content Guidelines\n\nWhen contributing lessons or koans:\n\n- Follow the existing lesson structure\n- Keep examples practical and building toward the chat server\n- Write clear, concise explanations\n- Include 6-8 koans per lesson testing key concepts\n- Test all code examples\n- Follow the writing style in existing lessons\n\n### Koan Guidelines\n\nWhen creating or modifying koans:\n\n1. **Single Blank Rule**: Every koan MUST have exactly one `___` blank\n2. **Clear Questions**: Questions should be specific about what goes in the blank\n3. **Simple Answers**: Answers should be single values, expressions, or identifiers (not comma-separated lists)\n4. **Test Coverage**: All koan patterns MUST have corresponding tests in `js-erlang-interpreter/tests/`\n5. **Validation Types**: Use appropriate validation hints:\n   - `value_check`: For numeric or string values\n   - `pattern_check`: For pattern matching scenarios\n   - Default: Simple string comparison\n\nExample koan structure:\n```javascript\n{\n  id: \"unique_koan_id\",\n  question: \"What value makes this base case work?\",\n  code: \"Factorial = fun\\n    (0) -\u003e ___;\\n    (N) -\u003e N * Factorial(N - 1)\\nend.\",\n  answer: \"1\",\n  validation: \"value_check\", // optional\n  hint: \"Think about 0! = ?\", // optional\n  explanation: \"The factorial of 0 is defined as 1\" // optional\n}\n```\n\n### Code Style\n\n- Use TypeScript for new components\n- Follow existing formatting (2 space indentation)\n- Keep components small and focused\n- Add comments for complex logic\n\n### Adding New Lessons\n\n1. Create a new file in `src/content/lessons/`\n2. Use the required frontmatter:\n\n```markdown\n---\ntitle: \"Your Lesson Title\"\ndescription: \"Brief description\"\npostNumber: 36\npublishDate: 2025-01-17T00:00:00Z\ntags: [\"erlang\", \"your-topic\"]\ndifficulty: \"intermediate\"\nprerequisites: [1, 2, 3]\n---\n```\n\n3. Write content following the established pattern\n4. Add interactive koans at the end\n5. Test the lesson thoroughly\n\n## 🏗️ Project Structure\n\n```\nsrc/\n├── components/       # UI components\n├── content/\n│   ├── config.ts    # Content schema\n│   └── lessons/     # Tutorial lessons\n├── layouts/         # Page layouts\n├── pages/           # Routes\n└── styles/          # Global styles\n```\n\n## 🛠️ Tech Stack\n\n- **Framework**: Astro\n- **Styling**: Tailwind CSS\n- **Language**: TypeScript\n- **Syntax Highlighting**: Expressive Code\n- **Interactive Koans**: Custom Erlang interpreter\n\n## 🧮 JavaScript Erlang Interpreter\n\nThe interactive koans are powered by a custom JavaScript-based Erlang interpreter located in `/js-erlang-interpreter`. This interpreter:\n\n- Supports basic Erlang syntax for educational exercises\n- Handles pattern matching, lists, atoms, and function calls\n- Provides immediate feedback for learning\n- Runs entirely in the browser for a seamless experience\n\n### Current Limitations\n\nThe interpreter is designed for teaching basic concepts and currently supports:\n- Simple pattern matching\n- List operations\n- Basic arithmetic and comparisons\n- Atoms and tuples\n- Simple function definitions\n\n### Contributing to the Interpreter\n\nThe interpreter needs enhancement to support more advanced koans. Areas for improvement include:\n- Map syntax and operations\n- Process spawning and message passing\n- More complex pattern matching scenarios\n- Binary syntax\n- Guards and list comprehensions\n- Module system basics\n\n**Testing Requirements**: When adding new koan patterns or interpreter features:\n1. All koan patterns MUST have corresponding test cases in `js-erlang-interpreter/tests/`\n2. Test files should follow the naming convention: `lessonXX-koans.test.js`\n3. Each test should validate that the koan's expected answer produces the correct result\n4. Run tests with `npm test` in the `js-erlang-interpreter` directory\n5. Ensure all tests pass before submitting a PR\n\nIf you're interested in extending the interpreter, see `/js-erlang-interpreter/README.md` for implementation details.\n\n## 📄 License\n\nThis project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.\n\n## 🙏 Acknowledgments\n\n- The Erlang/OTP team for creating an amazing platform\n- The Astro team for their fantastic framework\n- All contributors who help improve this tutorial\n\n## 🔗 Links\n\n- [Live Site](https://learnerlang.com)\n- [Report Issues](https://github.com/pennypack/learn-erlang/issues)\n- [Discussions](https://github.com/pennypack/learn-erlang/discussions)\n\n---\n\nBuilt with ❤️ by Pennypack Software and the Erlang Community\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpennypack%2Flearn-erlang","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpennypack%2Flearn-erlang","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpennypack%2Flearn-erlang/lists"}