*** Begin Patch
*** Add File: server/shareToken.ts
+import { createHmac } from 'crypto';
+
+const SECRET = process.env.SHARE_TOKEN_SECRET || 'take_share_secret';
+
+/**
+ * Create a signed token encoding the user ID and timestamp.
+ * The token is base64-url encoded to be URL safe.
+ */
+export function createShareToken(userId: string): string {
+  const timestamp = Date.now().toString();
+  const payload = `${userId}:${timestamp}`;
+  const signature = createHmac('sha256', SECRET).update(payload).digest('hex');
+  const token = Buffer.from(`${payload}:${signature}`, 'utf-8')
+    .toString('base64')
+    .replace(/\+/g, '-')
+    .replace(/\//g, '_')
+    .replace(/=+$/, '');
+  return token;
+}
+
+/**
+ * Parse and verify a share token. Returns the embedded user ID if valid.
+ */
+export function verifyShareToken(token: string): string | null {
+  try {
+    const base64 = token
+      .replace(/-/g, '+')
+      .replace(/_/g, '/')
+      .padEnd(token.length + (4 - (token.length % 4)) % 4, '=');
+    const decoded = Buffer.from(base64, 'base64').toString('utf-8');
+    const [userId, timestamp, signature] = decoded.split(':');
+    if (!userId || !timestamp || !signature) return null;
+    const expected = createHmac('sha256', SECRET)
+      .update(`${userId}:${timestamp}`)
+      .digest('hex');
+    if (signature !== expected) return null;
+    // Optionally check expiry here (token valid forever for now)
+    return userId;
+  } catch {
+    return null;
+  }
+}
*** End Patch
*** Update File: server/routes.ts
@@
-import { isAuthenticated } from "./replit_integrations/auth";
+import { isAuthenticated } from "./replit_integrations/auth";
+import { createShareToken, verifyShareToken } from "./shareToken";
@@ export async function registerRoutes(
   httpServer: Server,
   app: Express
 ): Promise<Server> {
@@
   app.get("/api/leaderboard/hidden-gems", async (req, res) => {
@@
   });
+
+  // Generate a share link for the current user's "My TAKE".
+  app.post("/api/share/my-take", isAuthenticated, async (req: any, res) => {
+    try {
+      const userId = req.user.claims.sub;
+      if (!userId) {
+        return res.status(401).json({ error: "Unauthenticated" });
+      }
+      const token = createShareToken(userId);
+      res.json({ url: `/u/${token}` });
+    } catch (err) {
+      console.error("Share link generation error:", err);
+      res.status(500).json({ error: "Failed to generate share link" });
+    }
+  });
+
+  // Public endpoint to fetch a user's rankings via share token.
+  app.get("/api/public/my-take/:token", async (req, res) => {
+    try {
+      const { token } = req.params;
+      const userId = verifyShareToken(token);
+      if (!userId) {
+        return res.status(400).json({ error: "Invalid or expired token" });
+      }
+      const user = await storage.getUser(userId);
+      const rankings = await storage.getUserRankings(userId);
+      const restaurantList = rankings.map(r => ({
+        id: r.restaurant.id,
+        name: r.restaurant.name,
+        image: r.restaurant.image,
+        tags: r.restaurant.tags || [],
+        location: r.restaurant.location || '',
+        category: r.restaurant.category || '',
+        rating: r.restaurant.rating ? Number(r.restaurant.rating) : 0,
+        votes: r.restaurant.votes ? Number(r.restaurant.votes) : 0,
+        priceLevel: r.restaurant.priceLevel ? Number(r.restaurant.priceLevel) : 0,
+        googlePlaceId: r.restaurant.googlePlaceId || undefined,
+        lat: r.restaurant.lat ?? undefined,
+        lng: r.restaurant.lng ?? undefined,
+        googleTypes: r.restaurant.googleTypes || [],
+        googlePrimaryType: r.restaurant.googlePrimaryType || undefined,
+      }));
+      const ranking = rankings.map(r => r.restaurant.id);
+      const displayName = user
+        ? [user.firstName, user.lastName].filter(Boolean).join(' ') || user.email || ''
+        : '';
+      res.json({ displayName, restaurants: restaurantList, ranking });
+    } catch (err) {
+      console.error("Public my-take error:", err);
+      res.status(500).json({ error: "Failed to fetch public ranking" });
+    }
+  });
*** End Patch
*** Add File: client/src/pages/PublicTake.tsx
+import { useEffect, useState } from "react";
+import { useParams, useLocation } from "wouter";
+import Layout from "@/components/Layout";
+import RestaurantCard from "@/components/RestaurantCard";
+import { Button } from "@/components/ui/button";
+
+interface Restaurant {
+  id: string;
+  name: string;
+  image: string;
+  tags: string[];
+  location: string;
+  category: string;
+  rating: number;
+  votes: number;
+  priceLevel: number;
+  googlePlaceId?: string;
+  lat?: number;
+  lng?: number;
+  googleTypes?: string[];
+  googlePrimaryType?: string;
+}
+
+export default function PublicTake() {
+  const { token } = useParams<{ token: string }>();
+  const [data, setData] = useState<{
+    loading: boolean;
+    displayName: string;
+    restaurants: Restaurant[];
+    ranking: string[];
+    error?: string;
+  }>({
+    loading: true,
+    displayName: "",
+    restaurants: [],
+    ranking: [],
+  });
+  const [_, setLocation] = useLocation();
+
+  useEffect(() => {
+    async function load() {
+      try {
+        const res = await fetch(`/api/public/my-take/${token}`);
+        const json = await res.json();
+        if (!res.ok) {
+          setData(prev => ({ ...prev, loading: false, error: json.error || "Failed to load" }));
+          return;
+        }
+        setData({
+          loading: false,
+          displayName: json.displayName || "Their Take",
+          restaurants: json.restaurants || [],
+          ranking: json.ranking || [],
+        });
+      } catch (err) {
+        setData(prev => ({ ...prev, loading: false, error: "Failed to load" }));
+      }
+    }
+    load();
+  }, [token]);
+
+  if (data.loading) {
+    return (
+      <Layout>
+        <div className="flex flex-col items-center justify-center min-h-[60vh] p-6 text-center">
+          <div className="animate-spin rounded-full h-8 w-8 border-b-2 border-foreground mb-4" />
+          <p className="text-muted-foreground text-sm">Loading...</p>
+        </div>
+      </Layout>
+    );
+  }
+
+  if (data.error) {
+    return (
+      <Layout>
+        <div className="flex flex-col items-center justify-center min-h-[60vh] p-6 text-center">
+          <h2 className="text-xl font-heading font-bold mb-2">Error</h2>
+          <p className="text-muted-foreground mb-6">{data.error}</p>
+        </div>
+      </Layout>
+    );
+  }
+
+  return (
+    <Layout>
+      <div className="pt-12 pb-6 space-y-6">
+        <header className="px-6">
+          <h1 className="text-3xl font-heading font-extrabold text-foreground tracking-tight">
+            {data.displayName ? `${data.displayName}'s TAKE` : "TAKE"}
+          </h1>
+          <p className="text-muted-foreground text-sm font-medium mt-1">
+            Ranked restaurants
+          </p>
+        </header>
+        {data.restaurants.length > 0 ? (
+          <div className="space-y-6">
+            <div className="px-6">
+              <div className="flex items-center gap-2 mb-3">
+                <span className="text-sm font-bold text-muted-foreground">
+                  Top {data.restaurants.length}
+                </span>
+              </div>
+              <div className="space-y-3">
+                {data.restaurants.map((restaurant: Restaurant, index: number) => (
+                  <RestaurantCard
+                    key={restaurant.id}
+                    restaurant={restaurant}
+                    rank={index + 1}
+                    compact
+                  />
+                ))}
+              </div>
+            </div>
+            <div className="px-6">
+              <Button
+                className="w-full bg-foreground text-background hover:bg-foreground/90 h-12 rounded-xl text-base font-bold shadow-lg shadow-foreground/20"
+                onClick={() => setLocation('/')}
+              >
+                Make your own TAKE
+              </Button>
+            </div>
+          </div>
+        ) : (
+          <div className="mx-6 text-center py-12 px-6 bg-secondary/30 rounded-3xl border-2 border-dashed border-border">
+            <h3 className="text-xl font-bold mb-2">No rankings yet</h3>
+            <p className="text-muted-foreground mb-6 text-sm">
+              This user has not ranked any restaurants.
+            </p>
+            <Button
+              className="rounded-full px-8"
+              onClick={() => setLocation('/')}
+            >
+              Make your own TAKE
+            </Button>
+          </div>
+        )}
+      </div>
+    </Layout>
+  );
+}
*** End Patch
*** Update File: client/src/App.tsx
@@
 import NotFound from "@/pages/not-found";
+import PublicTake from "@/pages/PublicTake";
@@ function Router() {
       <Route path="/edit-profile" component={EditProfile} />
+      {/* Public share route for viewing another user's rankings */}
+      <Route path="/u/:token" component={PublicTake} />
       <Route component={NotFound} />
*** End Patch
*** Update File: client/src/pages/MyList.tsx
@@
 import { CUISINE_LABELS } from "@shared/tagInference";
+import { toast } from "@/hooks/use-toast";
@@ export default function MyList() {
   return (
     <Layout>
       <div className="pt-12 pb-6 space-y-6">
-        <header className="px-6">
-          <h1 className="text-3xl font-heading font-extrabold text-foreground tracking-tight" data-testid="text-my-list-heading">
-            My TAKE
-          </h1>
-          <p className="text-muted-foreground text-sm font-medium mt-1">
-            Your personal restaurant ranking
-          </p>
-        </header>
+        <header className="px-6">
+          <div className="flex items-center justify-between">
+            <div>
+              <h1 className="text-3xl font-heading font-extrabold text-foreground tracking-tight" data-testid="text-my-list-heading">
+                My TAKE
+              </h1>
+              <p className="text-muted-foreground text-sm font-medium mt-1">
+                Your personal restaurant ranking
+              </p>
+            </div>
+            {isAuthenticated && (
+              <button
+                onClick={async () => {
+                  try {
+                    const res = await fetch('/api/share/my-take', {
+                      method: 'POST',
+                      credentials: 'include',
+                    });
+                    if (!res.ok) {
+                      throw new Error('Failed to generate share link');
+                    }
+                    const data = await res.json();
+                    const shareUrl = `${window.location.origin}${data.url}`;
+                    await navigator.clipboard.writeText(shareUrl);
+                    toast({
+                      title: 'Copied link',
+                      description: 'Your share link is copied to clipboard!',
+                    });
+                  } catch (err) {
+                    console.error(err);
+                    toast({
+                      title: 'Share failed',
+                      description: 'Could not generate share link',
+                    });
+                  }
+                }}
+                className="text-sm font-semibold text-primary underline hover:no-underline"
+              >
+                Share my TAKE
+              </button>
+            )}
+          </div>
+        </header>
*** End Patch
