Wenlan
Wenlan is a source-backed AI knowledge base and LLM wiki for AI work: organize documents and decisions into pages you can find, inspect, and review.
Write and share memories privately with the people you trust. Secure, invitation-only journaling platform.
ProductivityGitHub @skow0020OnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Repository information has not been collected yet.
No updates detected yet. GitHub releases will appear here.
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗A Next.js journal application built with the App Router, featuring user authentication and database integration.
First, run the development server:
npm run dev
Open http://localhost:3000 with your browser to see the result.
You can start editing the page by modifying src/app/page.tsx. The page auto-updates as you edit the file.
This project uses next/font to automatically optimize and load Geist, a new font family for Vercel.
npm run lintnpm run formatnpm run format:checkESLint is used for code-quality and correctness checks, while Prettier handles code formatting.
Create a .env.local file in the root of your project with the following variables:
cp .env.example .env.local
# Clerk Authentication
NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY=pk_test_...
CLERK_SECRET_KEY=sk_test_...
# LaunchDarkly feature flags (server-side)
LAUNCHDARKLY_SDK_KEY=sdk-...
# Optional: LaunchDarkly client-side id (for future client SDK usage)
NEXT_PUBLIC_LAUNCHDARKLY_CLIENT_SIDE_ID=...
# Database (Neon/PostgreSQL)
DATABASE_URL=postgresql://user:password@host:port/database
# Entry content encryption (base64-encoded 32-byte key)
ENTRY_CONTENT_ENCRYPTION_KEY=replace-with-openssl-rand-base64-32
# App URL (used in invite links)
NEXT_PUBLIC_APP_URL=http://localhost:3000
# Invite Email Provider (optional)
# Resend is auto-detected when RESEND_API_KEY and RESEND_FROM_EMAIL are set.
# Optionally set INVITE_EMAIL_PROVIDER=resend explicitly, or INVITE_EMAIL_PROVIDER=none to disable email sending.
INVITE_EMAIL_PROVIDER=resend
RESEND_API_KEY=re_...
RESEND_FROM_EMAIL=SharedJournal <[email protected]>
# Support payments (Stripe)
STRIPE_SECRET_KEY=sk_test_...
STRIPE_WEBHOOK_SECRET=whsec_...
SharedJournal can moderate entry and reflection content before writing to the database.
Add these variables to .env.local to enable moderation locally:
# Content moderation
CONTENT_MODERATION_ENABLED=true
CONTENT_MODERATION_PROVIDER=openai
CONTENT_MODERATION_API_KEY=sk-...
# Behavior when provider is unavailable:
# open -> allow writes (default)
# closed -> block writes and return retry message
CONTENT_MODERATION_FAIL_MODE=open
Behavior summary:
CONTENT_MODERATION_ENABLED must be exactly true to enforce moderation.CONTENT_MODERATION_FAIL_MODE=open, provider errors allow writes.CONTENT_MODERATION_FAIL_MODE=closed, provider errors block writes with a generic retry error.For full implementation details, see docs/content-moderation-implementation.md.
SharedJournal supports optional one-time "buy me a coffee" style contributions via Stripe Checkout.
/supportsrc/app/support/actions.ts/api/webhooks/stripe/support/successsupport_paymentsConfigure these events for your webhook endpoint:
checkout.session.completedcheckout.session.async_payment_succeededcheckout.session.async_payment_failedcheckout.session.expiredSTRIPE_SECRET_KEY=sk_test_...npm run dev
stripe listen --events checkout.session.completed,checkout.session.async_payment_succeeded,checkout.session.async_payment_failed,checkout.session.expired --forward-to http://localhost:3000/api/webhooks/stripe
whsec_...) and set:STRIPE_WEBHOOK_SECRET=whsec_...Notes:
4242 4242 4242 4242.For deployed environments (Vercel preview or production):
https://<your-domain>/api/webhooks/stripeSTRIPE_WEBHOOK_SECRET in that environment.Important:
whsec_... is different from production/preview dashboard endpoint secrets.sk_test_... vs sk_live_...).Stripe support payments require the support_payments table migration. Run:
npm run db:migrate
before testing checkout.
SharedJournal now includes a server-side LaunchDarkly helper at src/lib/launchdarkly/server-client.ts.
Basic usage in a Server Component or Server Action:
import {
createLaunchDarklyContext,
getLaunchDarklyVariation,
} from '@/lib/launchdarkly/server-client'
const context = createLaunchDarklyContext({
key: appUser.id,
name: appUser.displayName,
})
const isNewExperienceEnabled = await getLaunchDarklyVariation({
flagKey: 'new-experience',
context,
fallback: false,
})
Notes:
LAUNCHDARKLY_SDK_KEY must be set in your environment for the helper to initialize..env.localThis is the beginning of the README. Read the rest at the original. Read the full README ↗