{"id":33926517,"url":"https://github.com/netrondev/tinkr","last_synced_at":"2025-12-12T10:20:29.015Z","repository":{"id":324131238,"uuid":"1080533421","full_name":"netrondev/tinkr","owner":"netrondev","description":"full-stack rust framework","archived":false,"fork":false,"pushed_at":"2025-11-14T01:58:52.000Z","size":1241,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-11-14T02:17:28.361Z","etag":null,"topics":["axum","backend","frontend","full-stack","leptos","resend","surrealdb"],"latest_commit_sha":null,"homepage":"https://crates.io/crates/tinkr","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/netrondev.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-10-21T13:58:14.000Z","updated_at":"2025-11-14T01:58:56.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/netrondev/tinkr","commit_stats":null,"previous_names":["netrondev/tinkr"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/netrondev/tinkr","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/netrondev%2Ftinkr","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/netrondev%2Ftinkr/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/netrondev%2Ftinkr/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/netrondev%2Ftinkr/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/netrondev","download_url":"https://codeload.github.com/netrondev/tinkr/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/netrondev%2Ftinkr/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":27680744,"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-12-12T02:00:06.775Z","response_time":129,"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":["axum","backend","frontend","full-stack","leptos","resend","surrealdb"],"created_at":"2025-12-12T10:20:28.150Z","updated_at":"2025-12-12T10:20:29.008Z","avatar_url":"https://github.com/netrondev.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Tinkr\n\n`⚠️ EVERYTHING UNDER EXPERIMENTAL DEVELOPMENT ⚠️`\n\n[![Crates.io](https://img.shields.io/crates/v/tinkr.svg)](https://crates.io/crates/tinkr)\n[![Documentation](https://docs.rs/tinkr/badge.svg)](https://docs.rs/tinkr)\n[![License](https://img.shields.io/badge/license-MIT%2FApache--2.0-blue.svg)](https://github.com/netrondev/tinkr)\n\nA full-stack web framework for Rust that makes building modern web applications fast and enjoyable. Built on [Leptos](https://leptos.dev), Tinkr provides a comprehensive suite of UI components, authentication, database integration, and deployment tools to help you ship production-ready applications quickly.\n\n## Features\n\n### 🎨 Rich UI Component Library\n- **Pre-built Components**: Buttons, inputs, modals, dropdowns, tabs, tooltips, and more\n- **Form Handling**: Integrated form components with validation support\n- **Loading States**: Progress bars, loading indicators, and skeletons\n- **Navigation**: Sidebar, navbar, breadcrumbs, and navigation helpers\n- **Avatars**: Boring Avatars integration with multiple styles (Beam, Marble, Ring, Pixel, Bauhaus, Sunset)\n- **Alerts \u0026 Notifications**: Built-in alert system with different severity levels\n- **Responsive Design**: Mobile-first components that work across all devices\n\n### 🔐 Authentication \u0026 Authorization\n- **OAuth Integration**: Built-in OAuth2 support for third-party authentication\n- **Session Management**: Secure session handling with token-based authentication\n- **User Management**: Complete user profile and account management system\n- **Guest Access**: Support for guest users and anonymous sessions\n- **Authorization Checks**: Easy-to-use authorization middleware and guards\n\n### 🗄️ Database \u0026 Storage\n- **SurrealDB Integration**: First-class support for SurrealDB with async operations\n- **Caching Layer**: Built-in caching with the `cached` crate for improved performance\n- **Storage Traits**: Flexible storage abstraction for implementing custom backends\n- **Type-Safe Queries**: Strongly typed database operations with compile-time safety\n- **Migrations**: Schema management and database initialization helpers\n\n### 💳 Payment Processing\n- **PayFast Integration**: South African payment gateway support\n- **Transaction Management**: Handle payments and subscriptions\n- **Webhook Handling**: Process payment notifications and updates\n\n### 🪙 Web3 \u0026 Wallet Support\n- **MetaMask Integration**: Connect and interact with MetaMask wallets\n- **EVM Chains**: Support for Ethereum and EVM-compatible chains\n- **Address Verification**: Checksum validation and address utilities\n- **Wallet Authentication**: Sign-in with Ethereum/Web3 wallets\n\n### 📊 Observability \u0026 Telemetry\n- **OpenTelemetry**: Built-in metrics and tracing support\n- **Grafana Loki**: Log aggregation integration\n- **Prometheus Metrics**: Metrics endpoint for monitoring\n- **Pyroscope Profiling**: CPU profiling integration\n- **Custom Logging**: Structured logging with tracing\n\n### 🚀 Server \u0026 Middleware\n- **Axum Integration**: High-performance async HTTP server\n- **Compression**: Gzip, Brotli, Deflate, and Zstd compression support\n- **CORS**: Cross-origin resource sharing middleware\n- **Health Checks**: Built-in health and readiness endpoints\n- **Metrics Endpoint**: Prometheus-compatible metrics\n- **Request Logging**: Comprehensive request/response logging\n\n### 📧 Email Integration\n- **Resend API**: Send transactional emails via Resend\n- **Email Validation**: Built-in email address validation\n- **Template Support**: Email template helpers\n\n### 🛠️ Utilities\n- **Date \u0026 Time**: Chrono-based date utilities and helpers\n- **String Manipulation**: Common string operations and transformations\n- **Color Utilities**: Color parsing, conversion, and manipulation\n- **URL Handling**: URL parsing and construction helpers\n- **Image Processing**: Image upload, compression, and format conversion\n- **MIME Type Detection**: Automatic file type detection\n\n## Installation\n\nAdd Tinkr to your `Cargo.toml`:\n\n```toml\n[dependencies]\ntinkr = \"0.0.32\"\nleptos = \"0.8\"\n```\n\nFor SSR (Server-Side Rendering) support:\n\n```toml\n[dependencies]\ntinkr = { version = \"0.0.32\", features = [\"ssr\"] }\n```\n\nFor hydration (client-side):\n\n```toml\n[dependencies]\ntinkr = { version = \"0.0.32\", features = [\"hydrate\"] }\n```\n\n## Quick Start\n\n### Basic Component Usage\n\n```rust\nuse leptos::*;\nuse tinkr::components::*;\n\n#[component]\npub fn App() -\u003e impl IntoView {\n    view! {\n        \u003cPage\u003e\n            \u003cHero\n                title=\"Welcome to Tinkr\"\n                subtitle=\"Build full-stack web apps with Rust\"\n            \u003e\n                \u003cHeroButton href=\"/docs\"\u003e\"Get Started\"\u003c/HeroButton\u003e\n            \u003c/Hero\u003e\n\n            \u003cSection\u003e\n                \u003cFeatureGrid\u003e\n                    \u003cFeatureCard\n                        title=\"Fast\"\n                        description=\"Built with performance in mind\"\n                    /\u003e\n                    \u003cFeatureCard\n                        title=\"Type-Safe\"\n                        description=\"Catch errors at compile time\"\n                    /\u003e\n                    \u003cFeatureCard\n                        title=\"Full-Stack\"\n                        description=\"Frontend and backend in one language\"\n                    /\u003e\n                \u003c/FeatureGrid\u003e\n            \u003c/Section\u003e\n        \u003c/Page\u003e\n    }\n}\n```\n\n### Form Handling\n\n```rust\nuse leptos::*;\nuse tinkr::components::*;\n\n#[component]\npub fn LoginForm() -\u003e impl IntoView {\n    let (email, set_email) = create_signal(String::new());\n    let (password, set_password) = create_signal(String::new());\n\n    view! {\n        \u003cFormSection title=\"Sign In\"\u003e\n            \u003cFormGrid\u003e\n                \u003cInput\n                    label=\"Email\"\n                    type_=\"email\"\n                    value=email\n                    on_input=move |v| set_email(v)\n                /\u003e\n                \u003cInput\n                    label=\"Password\"\n                    type_=\"password\"\n                    value=password\n                    on_input=move |v| set_password(v)\n                /\u003e\n            \u003c/FormGrid\u003e\n            \u003cFormActions\u003e\n                \u003cSubmitButton\u003e\"Sign In\"\u003c/SubmitButton\u003e\n            \u003c/FormActions\u003e\n        \u003c/FormSection\u003e\n    }\n}\n```\n\n### Authentication\n\n```rust\nuse leptos::*;\nuse tinkr::auth::*;\n\n#[server]\nasync fn check_auth() -\u003e Result\u003cUser, ServerFnError\u003e {\n    let user = user()?; // Get current authenticated user\n    Ok(user)\n}\n\n#[component]\npub fn ProtectedPage() -\u003e impl IntoView {\n    let user = create_resource(|| (), |_| check_auth());\n\n    view! {\n        \u003cSuspense fallback=|| view! { \u003cLoading /\u003e }\u003e\n            {move || user.get().map(|result| match result {\n                Ok(user) =\u003e view! {\n                    \u003cdiv\u003e\"Welcome, \" {user.email}\u003c/div\u003e\n                }.into_view(),\n                Err(_) =\u003e view! {\n                    \u003cdiv\u003e\"Please sign in\"\u003c/div\u003e\n                }.into_view(),\n            })}\n        \u003c/Suspense\u003e\n    }\n}\n```\n\n### Datetime\n\n```rust\nuse tinkr::Datetime;\nuse tinkr::date_utils::FormatDatetime;\n\nlet created_at: Datetime;\ncreated_at.format_custom(\"%a %d %b\"); // Mon 01 Jan\ncreated_at.ago(); // 9 days ago\n```\n\n\n### Database Integration (SSR)\n\n```rust\n#[cfg(feature = \"ssr\")]\nuse tinkr::db::*;\nuse serde::{Deserialize, Serialize};\n\n#[derive(Debug, Clone, Serialize, Deserialize)]\nstruct Todo {\n    id: Option\u003cRecordId\u003e,\n    title: String,\n    completed: bool,\n}\n\n#[server]\nasync fn get_todos() -\u003e Result\u003cVec\u003cTodo\u003e, ServerFnError\u003e {\n    let db = db_init().await?;\n    let todos: Vec\u003cTodo\u003e = db.select(\"todos\").await?;\n    Ok(todos)\n}\n\n#[server]\nasync fn create_todo(title: String) -\u003e Result\u003cTodo, ServerFnError\u003e {\n    let db = db_init().await?;\n    let todo: Todo = db.create(\"todos\")\n        .content(Todo {\n            id: None,\n            title,\n            completed: false,\n        })\n        .await?;\n    Ok(todo)\n}\n```\n\n## Configuration\n\n### Environment Variables\n\nTinkr uses environment variables for configuration. Create a `.env` file:\n\n```env\n# Database\nSURREALDB_HOST=ws://localhost:8000\nSURREALDB_NS=your_namespace\nSURREALDB_DB=your_database\nSURREALDB_USER=root\nSURREALDB_PASS=root\n\n# Auth\nJWT_SECRET=your-secret-key-here\n\n# Email (optional)\nRESEND_API_KEY=your-resend-api-key\n\n# OAuth (optional)\nOAUTH_CLIENT_ID=your-client-id\nOAUTH_CLIENT_SECRET=your-client-secret\n\n# Telemetry (optional)\nOTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4317\n```\n\n## Components Reference\n\n### Layout Components\n- `Page` - Main page wrapper with responsive layout\n- `Section` - Content section with optional header\n- `Hero` - Hero section with title, subtitle, and CTA buttons\n- `Footer` - Application footer\n\n### Navigation\n- `NavBar` - Top navigation bar\n- `SideBar` - Collapsible sidebar navigation\n- `NavigationBackButton` - Browser back button\n- `Dropdown` - Dropdown menu with trigger and items\n\n### Forms\n- `Input` - Text input with label and validation\n- `Checkbox` - Checkbox input\n- `Select` - Select dropdown\n- `SubmitButton` - Form submit button with loading state\n- `FormSection` - Form wrapper with title\n- `FormGrid` - Responsive form grid layout\n\n### UI Elements\n- `Button` - Customizable button component\n- `Modal` - Modal dialog with backdrop\n- `Alert` - Alert messages with severity levels\n- `Tooltip` - Hover tooltip\n- `Loading` - Loading spinner\n- `ProgressBar` - Progress indicator\n- `Tabs` - Tab navigation\n\n### Display\n- `Image` - Optimized image component\n- `UserAvatar` - User avatar with fallback\n- `Logo` - Application logo\n- `Timer` - Countdown/elapsed time display\n\n## Features Flag\n\nTinkr supports the following feature flags:\n\n- `default` - Includes `ssr` feature\n- `ssr` - Server-side rendering with Axum, SurrealDB, and all backend features\n- `hydrate` - Client-side hydration support\n\n## Architecture\n\nTinkr follows a modular architecture:\n\n```\ntinkr/\n├── auth/           # Authentication \u0026 authorization\n├── components/     # UI component library\n├── db/             # Database layer\n├── email/          # Email integration\n├── middleware/     # Server middleware\n├── payments/       # Payment processing\n├── telemetry/      # Observability\n├── wallet/         # Web3 wallet integration\n└── utils/          # Shared utilities\n```\n\n## Development\n\n### Running Tests\n\n```bash\ncargo test\n```\n\n### Building\n\n```bash\n# Development build\ncargo build\n\n# Production build\ncargo build --release\n```\n\n### Release\n\nThe project includes a release script:\n\n```bash\n./release.sh\n```\n\n## Contributing\n\nContributions are welcome! Please feel free to submit issues and pull requests.\n\n## License\n\nLicensed under either of:\n\n- Apache License, Version 2.0 ([LICENSE-APACHE](LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0)\n- MIT license ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT)\n\nat your option.\n\n## Links\n\n- [Documentation](https://docs.rs/tinkr)\n- [Crates.io](https://crates.io/crates/tinkr)\n- [GitHub Repository](https://github.com/netrondev/tinkr)\n- [Leptos Framework](https://leptos.dev)\n\n## Support\n\nFor questions and support, please open an issue on [GitHub](https://github.com/netrondev/tinkr/issues).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnetrondev%2Ftinkr","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnetrondev%2Ftinkr","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnetrondev%2Ftinkr/lists"}