@ -42,3 +42,4 @@ coverage/
.turso/
@ -241,3 +241,4 @@ Available sizes:
**Ready to deploy?** Follow the steps above and you'll be live in minutes! 🚀
@ -80,3 +80,4 @@ See [DEPLOYMENT.md](./DEPLOYMENT.md) for detailed instructions and troubleshooti
**Total: $5/month**
@ -1,2 +1,3 @@
web: npm start
@ -30,3 +30,4 @@ export async function setSetting(key: string, value: string): Promise<void> {
}
@ -59,3 +59,4 @@ export const env = {
};
@ -272,3 +272,4 @@ export async function refreshChannel(req: AuthRequest, res: Response) {
@ -43,3 +43,4 @@ export function authMiddleware(
@ -23,3 +23,4 @@ export function errorHandler(
@ -29,3 +29,4 @@ export const apiLimiter = rateLimit({
});
@ -14,3 +14,4 @@ router.get('/me', authMiddleware, getCurrentUser);
export default router;
@ -16,3 +16,4 @@ router.put('/:id/refresh', authMiddleware, refreshChannel);
@ -14,3 +14,4 @@ router.post('/refresh', authMiddleware, refreshVideos);
@ -147,3 +147,4 @@ export function formatDuration(isoDuration: string): string {
@ -28,3 +28,4 @@ export async function createInitialAdmin() {
@ -60,3 +60,4 @@ export interface ApiResponse<T = any> {
@ -18,3 +18,4 @@
@ -13,3 +13,4 @@
</html>
@ -60,3 +60,4 @@ body {
@ -39,3 +39,4 @@ function App() {
export default App;
@ -173,3 +173,4 @@
@ -113,3 +113,4 @@ export function ChannelManager() {
@ -41,3 +41,4 @@ export class ErrorBoundary extends React.Component<Props, State> {
@ -20,3 +20,4 @@ export function ProtectedRoute({ children }: ProtectedRouteProps) {
@ -109,3 +109,4 @@
@ -81,3 +81,4 @@ export function SearchFilter({
@ -102,3 +102,4 @@
@ -62,3 +62,4 @@ export function VideoCard({ video, onClick }: VideoCardProps) {
@ -154,3 +154,4 @@
@ -118,3 +118,4 @@ export function VideoGrid({
@ -80,3 +80,4 @@
@ -43,3 +43,4 @@ export function VideoPlayer({ videoId, onClose }: VideoPlayerProps) {
@ -70,3 +70,4 @@ export const useAuth = () => {
@ -54,3 +54,4 @@ export function useChannels() {
@ -9,3 +9,4 @@ ReactDOM.createRoot(document.getElementById('root')!).render(
)
@ -24,3 +24,4 @@
@ -15,3 +15,4 @@ export function AdminPage() {
@ -98,3 +98,4 @@
@ -73,3 +73,4 @@ export function LoginPage() {
@ -120,3 +120,4 @@ export const videosApi = {
@ -8,3 +8,4 @@ interface ImportMeta {
readonly env: ImportMetaEnv
@ -21,3 +21,4 @@
@ -10,3 +10,4 @@
@ -9,3 +9,4 @@ export default defineConfig({
})
@ -227,3 +227,4 @@ But this requires lifting state to App level and prop drilling.
**Complexity:** Medium (URL params + responsive styling)
@ -44,3 +44,4 @@
"tsx": "^4.7.0"