{"id":19433866,"url":"https://github.com/carlobortolan/ticktack","last_synced_at":"2026-05-09T07:01:52.760Z","repository":{"id":166518378,"uuid":"634590902","full_name":"carlobortolan/TickTack","owner":"carlobortolan","description":"Full-stack Rust application using WebAssembly (WASM).","archived":false,"fork":false,"pushed_at":"2024-02-17T23:37:13.000Z","size":263,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-02-25T06:25:44.157Z","etag":null,"topics":["actix-web","docker-compose","full-stack","postgres","rust","wasm","webassembly","yew","yew-framework"],"latest_commit_sha":null,"homepage":"https://ticktack.carlobortolan.com","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/carlobortolan.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}},"created_at":"2023-04-30T16:17:23.000Z","updated_at":"2023-11-13T19:05:01.000Z","dependencies_parsed_at":"2024-02-18T00:26:50.932Z","dependency_job_id":null,"html_url":"https://github.com/carlobortolan/TickTack","commit_stats":null,"previous_names":["carlobortolan/rateabeer"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/carlobortolan/TickTack","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/carlobortolan%2FTickTack","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/carlobortolan%2FTickTack/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/carlobortolan%2FTickTack/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/carlobortolan%2FTickTack/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/carlobortolan","download_url":"https://codeload.github.com/carlobortolan/TickTack/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/carlobortolan%2FTickTack/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32810381,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-08T08:22:46.396Z","status":"online","status_checked_at":"2026-05-09T02:00:06.633Z","response_time":123,"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":["actix-web","docker-compose","full-stack","postgres","rust","wasm","webassembly","yew","yew-framework"],"created_at":"2024-11-10T14:41:25.932Z","updated_at":"2026-05-09T07:01:52.744Z","avatar_url":"https://github.com/carlobortolan.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# TickTack\n\nA Full-Stack Rust application empowered by WebAssembly (WASM).\n\n\u003e [!IMPORTANT]\n\u003e As of February 18, 2024, this project has been put on hold and will probably not be worked on or finished in the near future.\n\n\u003e [!NOTE]\n\u003e At the moment_ [___https://ticktack-api.onrender.com___](https://ticktack-api.onrender.com/watches) _hosts the API and_ [___https://ticktack.carlobortolan.com___](https://ticktack.carlobortolan.com) _hosts the Frontend. You can find the docker-repository for the Frontend-image at `docker.io/carlobortolan/ticktack:frontend`.\n\n\u003e __DISCLAIMER__: _This is inspired by the [rust-fullstack-demo](https://github.com/toadslop/rust-fullstack-demo) as seen in [__\"Tokyo Rust\nMeetup - Fullstack Web Dev in Rust\"__](https://www.youtube.com/watch?v=5el5aFoJ8ws) and used to have a fun project for\n\u003e experimenting with Rust and WASM._\n\n## FUNCTIONALITY\n\nWASM based web-app that keeps track of the most polular mechanical wristwatches at the time, allowing users to rate and comment their favorite timepieces.\n\n\u003c!-- Or in the words of Ben Clymer (/GPT3.5):\n\u003e _\"With every click, TickTack transports you into a realm where watch connoisseurs unite in a symphony of vibrant\nconversations and captivating visual narratives. Delve into a luminous palette of watch photography, each frame a\ntestament to the artistry, craftsmanship, and boundless creativity of watchmakers from across the globe._\n\u003e\n\u003e _As you traverse the opulent landscapes of TickTack, be prepared to engage in a realm of intellectual discourse and\nenlightening dialogues. Connect with fellow horological explorers who share a fervor for the intricacies of watchmaking._\n\u003e\n\u003e _Capture your own horological adventures through the lens of your timepiece, sharing your chronometric masterpieces\nwith an audience that awaits your narrative. Experience the thrill of camaraderie as passionate watch collectors,\nseasoned aficionados, and wide-eyed novices converge, embracing the boundless spectrums of time and color that unite us\nall._\n\u003e\n\u003e _Join the luminous world of TickTack, where time is an exquisite work of art, and watches become the brushstrokes that\npaint your wrist with unparalleled elegance. Let the vibrant spirit of TickTack ignite your imagination, as we celebrate\nthe hues, stories, and the infinite palette of possibilities that watches bring to our lives.\"_ --\u003e\n\n## CONFIG\n\n\u003cdetails\u003e\u003csummary\u003e\u003cb\u003eStart backend\u003c/b\u003e\u003c/summary\u003e\n\n`cargo build`\n\n`cargo install cargo-make`\n\n`cargo run --bin backend`\n\n**OR**\n\n`cargo make start_back_prod`\n\u003c/details\u003e\n\n\u003cdetails\u003e\u003csummary\u003e\u003cb\u003eStart frontend\u003c/b\u003e\u003c/summary\u003e\n\n(`npm install`)\n\n(`npm install -g pnpm`)\n\n(`npm install -g wasm-pack`)\n\n`pnpm install --dir ./frontend`\n\n`pnpm run --dir ./frontend build`\n\n`pnpm run --dir ./frontend dev`\n\n**OR**\n\n`cargo make start_front_prod`\n\n**OR**\n\n`simple-http-server ./frontend/dist -i -p 8000 --nocache --try-file ./frontend/dist/index.html`\n\n\u003e [!NOTE]\n\u003e You might have to `Set-ExecutionPolicy RemoteSigned` to run pnpm commands on Windows.\n\n\u003c/details\u003e\n\n## ITEMS DEMONSTRATED IN THIS APP\n\n### General\n\n* Compile time environment variables\n* Runtime environment variables\n* Sharing entities between frontend and backend\n* Dockerizing Rust frontends and backends\n* Running tasks with [Cargo Make](https://github.com/sagiegurari/cargo-make)\n\n### Database\n\n* Object Relational Mapping\n* Seeding with random data\n* Seeding with CSV data\n* Entity Definitions\n\n### Backend\n\n* Routing\n* Middleware\n* CORS configuration\n* Application State\n* Database connections\n\n### Frontend\n\n* Asynchronous data fetching\n* Functional components\n* State management with hooks\n* Posting data\n* Building with webpack\n\n## RUNNING ON DOCKER\n\nFirst install Docker.\nYou can find instructions [here](https://docs.docker.com/get-docker/).\n\nNext, install `docker-compose` to build and run several docker containers simultaneously.\nInstructions can be found [here](https://docs.docker.com/compose/install/).\n\nIn theory it would be sufficient to run `docker-compose up` and, once everything is up and running, visit http://localhost:8000 to view the app.\n\nNote that docker-compose will start the app in production mode.\n\nTo push to your remote docker-repository run:\n```\ndocker-compose up\ndocker tag ticktack-backend:latest \u003cdocker-username\u003e/\u003cdocker-repository\u003e:backend\ndocker tag ticktack-frontend:latest \u003cdocker-username\u003e/\u003cdocker-repository\u003e:frontend\ndocker push \u003cdocker-username\u003e/\u003cdocker-repository\u003e:backend\ndocker push \u003cdocker-username\u003e/\u003cdocker-repository\u003e:frontend\n```\n\n\n## RUNNING OUTSIDE DOCKER\n\n### Database Installation\n\nThis app requires a Postgres 14 database.\n\nDownloads for the various operating systems can be\nfound [here](https://www.enterprisedb.com/downloads/postgres-postgresql-downloads).\n\n#### Windows\n\nRefer to this [article](https://www.postgresqltutorial.com/postgresql-getting-started/install-postgresql/).\n\nAfter installation, open your terminal and try running \"psql\".\nKeep in mind that you will need to set the version to 14.\n\n#### Mac\n\nRefer to this [article](https://www.postgresqltutorial.com/postgresql-getting-started/install-postgresql-macos/)\n\n#### Linux\n\nRefer to this [article](https://www.postgresqltutorial.com/postgresql-getting-started/install-postgresql-linux/)\n\n### Database Setup\n\nOnce you have a Postgres server up and running, create a database and make sure your database user has read and write\nprivileges.\n\nExample:\n\n```bash\nsudo -u postgres psql\ncreate database rustfullstack;\ncreate user rustuser with encrypted password 'password';\ngrant all privileges on database rustfullstack to rustuser;\nexit\n```\n\nNOTE: If you get an error message saying \"connection refused\", your postgres server may have installed on port 5433\nrather than the default 5432. To resolve this, try using the -p flag as follows:\n\n```bash\nsudo -u postgres psql -p 5433\n```\n\n### ENV file\n\nYou'll need a file to hold necessary environment variables.\nIf you're running docker, it should be named `docker.env` and contain the following:\n\n```\nFRONTEND_HOST=localhost\nFRONTEND_PORT=8000\nFRONTEND_PROTOCOL=http\n\nDATABASE_PROTOCOL=postgres\nDATABASE_PORT=5432\nDATABASE_URL=\u003cSECRET\u003e\nPOSTGRES_USER=\u003cSECRET\u003e\nPOSTGRES_PASSWORD=\u003cSECRET\u003e\nPOSTGRES_DB=\u003cSECRET\u003e\nPOSTGRES_HOST=\u003cSECRET\u003e\n\nBACKEND_HOST=localhost\nBACKEND_HOST_INTERNAL=0.0.0.0\nBACKEND_PORT=8080\nBACKEND_PROTOCOL=http\n```\n\nIf you're running it outside of docker, the file should be called `.env` and should contain the following:\n\n```\nFRONTEND_HOST=localhost\nFRONTEND_PORT=8000\nFRONTEND_PROTOCOL=http\n\nDATABASE_PROTOCOL=postgres\nDATABASE_PORT=5432\nDATABASE_URL=\u003cSECRET\u003e\nPOSTGRES_USER=\u003cSECRET\u003e\nPOSTGRES_PASSWORD=\u003cSECRET\u003e\nPOSTGRES_DB=\u003cSECRET\u003e\nPOSTGRES_HOST=\u003cSECRET\u003e\n\nBACKEND_HOST=localhost\nBACKEND_PORT=8080\nBACKEND_PROTOCOL=http\n```\n\n### Running the App\n\n[Cargo Make](https://github.com/sagiegurari/cargo-make) as a task running to simplify starting and stopping the\napplication.\nTo use cargo make, run `cargo install cargo-make`.\n\nTo start the application in development mode, run `cargo make start_all`.\n\nTo start the application in production mode, run `cargo make start_all_prod`.\n\nNote: On Windows, you might see the following error:\n\n```powershell\n\u003ce\u003e [webpack-dev-middleware] Error: spawn npm ENOENT\n\u003ce\u003e     at ChildProcess._handle.onexit (node:internal/child_process:285:19)\n\u003ce\u003e     at onErrorNT (node:internal/child_process:483:16)\n\u003ce\u003e     at process.processTicksAndRejections (node:internal/process/task_queues:82:21) {\n\u003ce\u003e   errno: -4058,\n\u003ce\u003e   code: 'ENOENT',\n\u003ce\u003e   syscall: 'spawn npm',\n\u003ce\u003e   path: 'npm',\n\u003ce\u003e   spawnargs: [ 'install', '-g', 'wasm-pack' ]\n\u003ce\u003e }\n```\n\nIf you get this error, run the following command and then try again:\n\n```\nnpm install -g wasm-pack\n```\n\nTo view all the available tasks, open [Makefile.toml](/Makefile.toml).\n\n## CONTRIBUTING\n\nContributions are welcome! If you find a bug or have an idea for a new feature, please open an issue or submit a pull\nrequest.\n\n## LICENSE\n\nThis project is licensed under the GPL-3.0 license. See the [LICENSE](LICENSE) file for details.\n\n---\n\n© Carlo Bortolan\n\n\u003e Carlo Bortolan \u0026nbsp;\u0026middot;\u0026nbsp;\n\u003e GitHub [carlobortolan](https://github.com/carlobortolan) \u0026nbsp;\u0026middot;\u0026nbsp;\n\u003e contact via [carlobortolan@gmail.com](mailto:carlobortolan@gmail.com)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcarlobortolan%2Fticktack","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcarlobortolan%2Fticktack","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcarlobortolan%2Fticktack/lists"}