@if (activeStep() === 1) {
Step 1 · Basic info

Tell us who she is

Start with what you know. Photo, country, the years she was active. Only the display name is required — leave anything else blank.

Recognition photo

One clean photo we can use to identify her on every camsite.

The goal is to identify her across camsites. Topless is OK. Fully-nude or hardcore photos will be replaced by moderators.

Identity

Name and basics — leave blank if unknown.

@if (birthDateError()) {

{{ birthDateError() }}

}

Years active

Approximate is fine. Leave 'Quit' empty if she's still active.

@if (ageViolation()) {

She'd have been under 18 when she started.

} @if (draft().startYear !== null) { }
@if (draft().endYear !== null) { }

Other links

Personal blogs, fan pages, social accounts, anything that helps verify her identity.

@if (draft().links.length > 0) { } @if (linkForm(); as lf) { } @else {
}

Tips & guidelines

Photo guidelines

  • The photo's only job is recognition across camsites.
  • Topless is OK · fully nude photos will be replaced.
  • No hardcore or third-party content.
  • Square crop performs best on profile cards.

Already exists?

Search the index before submitting — duplicates are merged and your draft is discarded.

Search the index
} @else if (activeStep() === 2) {
Step 2 · Camsite accounts

Where does she work?

Add every nickname she uses, on every camsite. The more we have, the easier she is to find.

Linked accounts {{ draft().accounts.length }}

{{ accountsHint() }}
@if (draft().accounts.length > 0) {
@for (a of draft().accounts; track a.id) { @if (accountForm()?.editingId !== a.id) { @if (confirmingDeleteId() === a.id) {
Delete {{ a.nickname }} on {{ platformName(a.platform) }}?
} @else {
{{ a.nickname }} {{ platformName(a.platform) }} {{ a.type }} @if (a.closed) { Closed } @if (a.recycled) { Recycled }
} } }
} @if (accountForm(); as af) {

{{ af.editingId ? 'Edit account' : 'New account' }}

Pick a camsite, then add the exact nickname she uses there.

{{ o.label }} @if (o.meta) { {{ o.meta }} } {{ o.label }}
@for (t of typeOptions; track t.value) { }
Closed account Recycled by another model
@if (accountInDraftDup()) { }
} @else {
}

Tips & guidelines

Why add every nickname?

  • Every nickname people search for becomes a way to find her.
  • Closed and recycled accounts still help — old fans search by old names.
  • Linked accounts let us merge stats across her whole career.

Don't see a camsite?

We track 29 platforms today and add new ones weekly. Request the missing one and the moderation team takes a look.

What counts as recycled?

When an old nickname gets reassigned to a new model on the same site. Mark the account recycled so reviews aren't misattributed.

} @else if (activeStep() === 3) {
Step 3 · Tags & traits

How would fans describe her?

Pick from the popular tags below. Tags are optional — you can submit with zero. Search the full catalog if you don't see what you need.

{{ draft().defaultTags.length }} {{ draft().defaultTags.length === 1 ? 'tag' : 'tags' }} selected @if (draft().defaultTags.length > 0) { }
@if (draft().defaultTags.length === 0) {

None yet. Click any chip below to add it.

} @else {
@for (t of draft().defaultTags; track t) { {{ t }} }
}
@for (f of tagFilters(); track f.key) { }
@if (cloudTags().length === 0) {

All popular {{ cloudEmptyLabel() }} in this set are added — search above for more.

} @else {
@for (t of cloudTags(); track t) { }
}
} @else if (activeStep() === 4) {
{{ step4Eyebrow() }}

{{ step4Title() }}

{{ step4Lede() }}

Profile preview This is how she'll appear on the index.
@if (!draft().photo) { } @if (liveAccounts().length > 0) {
@for (a of liveAccounts().slice(0, 6); track a.id) { } @if (liveAccounts().length > 6) { +{{ liveAccounts().length - 6 }} }
}

{{ draft().displayName || 'Unnamed model' }}

@if (draft().countryCode) { {{ draft().countryCode }} }
@if (draft().startYear !== null) { Active since {{ draft().startYear }} } @if (computedAge() !== null) { Age {{ computedAge() }} } {{ liveAccounts().length }} {{ liveAccounts().length === 1 ? 'live account' : 'live accounts' }}
@if (topTags().length > 0) {
@for (t of topTags(); track t) { {{ t }} } @if (tagOverflow() > 0) { +{{ tagOverflow() }} }
}
Verify the details Click Edit on any section to jump back.
Step 1

Basic info

@if (!draft().photo) { }
Display name{{ draft().displayName || '—' }}
Country {{ draft().countryCode || '—' }}
Born{{ draft().birthDate ? draft().birthDate + ' · age ' + computedAge() : '—' }}
Years active{{ yearsActiveLabel() ?? '—' }}
@if (draft().links.length > 0) { }
Step 2

Camsite accounts @if (draft().accounts.length > 0) { {{ draft().accounts.length }} }

@if (draft().accounts.length === 0) {

No accounts yet — go back and add at least one.

} @else {
@for (a of draft().accounts; track a.id) {
{{ a.nickname }} {{ platformName(a.platform) }} {{ a.type }} @if (a.closed) { Closed } @if (a.recycled) { Recycled }
}
}
Step 3

Tags & traits @if (draft().defaultTags.length > 0) { {{ draft().defaultTags.length }} }

@if (reviewTagGroups().length === 0) {

No tags selected. Tags are optional.

} @else {
@for (g of reviewTagGroups(); track g.label) {
{{ g.label }}
@for (t of g.tags; track t) { {{ t }} }
}
}

{{ panelTitle() }}

@if (mode === 'add') {

{{ panelName() }} will appear on the index right away. You can edit her profile anytime.

⚡ Live instantly✏ Edit anytime
} @else if (mode === 'admin') {

{{ panelName() }}'s public-facing changes look good — the next four steps cover admin-only settings.

⚡ Approved instantly on save↺ Edit again anytime
} @else {

{{ panelName() }}'s profile updates will go live as soon as you save.

⚡ Live the moment you save↺ Edit again anytime
}
} @else if (activeStep() === 5) {
Step 5 · Geo-blocking Admin

Block countries & regions

Restrict this profile from appearing in certain countries or regions. You can block a whole country or just a region/state.

Blocked countries and regions

@if (draft().blockedCountries.length === 0) {

No blocked regions yet.

} @else {
@for (c of draft().blockedCountries; track c) { {{ c }} }
}
} @else if (activeStep() === 6) {
Step 6 · Visibility Admin

Visibility settings

Control what information is visible on her pages and who can see it. The model, while logged in, always bypasses these settings.

Show last activity Show longest sessions Show past nicknames Show country and age
} @else if (activeStep() === 7) {
Step 7 · Model content Admin

Model content

The editorial bio displayed in the About section. Written by admin; never shown to the model for editing.

Show unique rich content Index model
} @else {
Step 8 · SEO & indexing Admin

Meta & indexing

Controls the page's search engine metadata. Leave blank to auto-generate from the model's name and content.

}
@if (activeStep() === finalStep()) { } @else { }

Discarding throws away everything you've entered for this model. Save & exit keeps the draft on your account so you can return later. Keep editing dismisses this dialog.