What I Built
At the request of a club leader, I built a shift management site for a university club. Members can answer shift surveys, check published shifts, record attendance, and recruit substitutes from their phones. Organizers can handle member approvals, weekday groups, two-week shift generation and publication, and attendance checks in one place.
The stack is Nuxt 4, Vuetify 4, Cloudflare Workers, Cloudflare D1, and Drizzle ORM. I also integrated LINE Login and the LINE Messaging API so LINE can send notifications for survey start, publication, deadline reminders, substitute requests, and successful substitutions.
Shift Cycle
This site treats shifts as two-week cycles. When the survey period starts, members answer mainly for the days corresponding to their weekday group. After the response deadline, organizers generate the shift, adjust it manually if needed, and publish it.
The previous shift management workflow happened manually in a LINE group chat, so the system had to migrate that workflow as-is. Complex shift-cycle rules and substitution mechanisms made it a difficult project from the planning stage.
Member Side
On the member side, I prioritized actions that can be completed quickly. If accessing the website creates psychological friction, that becomes a direct barrier to club participation, so I cared a lot about comfort. The shift response screen lays out fourteen days and lets members toggle available, unavailable, and unanswered with buttons.
On the published shift screen, members can not only check the days they are assigned but also request substitutes and join additional shifts from the same screen. If someone can no longer attend their shift, they can recruit a substitute, and another member can accept the open request. When it is confirmed, a LINE notification is sent to the original assignee. The goal is to reduce psychological friction by prompting action through LINE.
Organizer Side
The organizer pages support member approval, role changes, user data fixes, shift generation, and manual shift-participant adjustments. Users are not allowed to log in immediately after registration; they become usable only after an organizer approves them. I learned from past experience that this is effective in semi-closed communities.
LINE Notifications And Cloudflare
Notifications are implemented with the LINE Messaging API. When shifts are published, each member receives a message with their assigned days. Deadline reminders are sent only to members who have not answered. Sending the same message to everyone just results in people muting notifications, so the system sends only to the people who need it.
The infrastructure uses Cloudflare Workers and D1. Nuxt is built for Cloudflare, and D1 is accessed through Drizzle ORM. The two-week cycle update runs as a Nitro.js scheduled task, so survey start, deadlines, publication, and cycle creation proceed automatically on the server side.
After Building It
Because I used familiar technologies such as Nuxt, Vuetify, Cloudflare Workers, and D1, and also used generative AI, development itself was not painful.
On the other hand, turning the club's operational rules into logic that could be automated was difficult. Unanswered responses, additional participation, substitutes, leave and return, and whether LINE is connected are all real-world states, and building logic to manage them was challenging.

