Skip to content

Commit e4463fb

Browse files
authored
feat: flip to the v3 information architecture (#2702)
Switches the docs from the `/platform/*` URL structure to the v3 information architecture: topic-first sections at the site root, `routeBasePath` dropped to `/`, and 301 redirects covering old URLs. ### Review by commit The flip is categorized by concern; commits 1-2 are mechanical (bulk moves and link rewrites) and can be skimmed, the judgment lives in 3-6. Commits 7-10 are refinements from reviewing the live preview. 1. **restructure into the v3 IA** - the moves: console and collaboration fold into Account, schedules and monitoring move under Actors > running; adds the Account hub and the Get Started section. Check the destinations make sense. 2. **drop the /platform prefix from internal links** - 157 files, move-aware (relocated sections point at their new paths). Bulk rewrite; the OpenAPI source and React pages are included alongside content. 3. **flip routeBasePath + v3 navbar** - the actual routing switch, the nav items, Open source moving from nav dropdown to footer, and per-section sidebars. The core change to scrutinize. 4. **scope theme doc-content and search to the v3 roots** - `DocItemContent` allowed paths and the `SearchBar` instance check. 5. **remove the platform landing page** - the site root is the new entry point. 6. **redirect /platform/\* URLs** - nginx catch-all plus structural pre-rules for the relocated sections. 7. **label v3 section overviews** - the Actors, Storage, Proxy, and Integrations hub pages now read "Overview" and sort first. 8. **footer dedup** - drop the duplicate Open source link now that there is a dedicated Open source column. 9. **split Get Started into Agent onboarding and a Build group** - move "Apify for AI agents" out of Integrations into Get Started, and group the four build pages under an expanded Build category. 10. **remove the duplicate quick start tree** - it duplicated the new Get Started build pages; its unique Technology stack intro moved into the Actor development overview. ### Verification - Build green at the tip, 0 broken links. The broken-anchor warnings are pre-existing and non-blocking (`onBrokenAnchors: 'warn'`). - **nginx double-hop cleanup** - stripping `/platform/` from the ~135 existing rule targets is a separate post-flip PR; those URLs still resolve via the catch-all in the meantime, just with an extra hop.
1 parent bc88c94 commit e4463fb

232 files changed

Lines changed: 910 additions & 821 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/test.yaml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -138,14 +138,14 @@ jobs:
138138
assert_no_redirect "http://localhost:8080" --request-target '/\evil.com/'
139139
assert_no_redirect "http://localhost:8080" --request-target '///\evil.com/'
140140
# Normal trailing-slash redirect must still work
141-
assert_status "http://localhost:8080/platform/proxy/datacenter-proxy/" "302"
141+
assert_status "http://localhost:8080/proxy/datacenter-proxy/" "302"
142142
143143
echo "🧪 Checking Nginx responses... (apify-docs)"
144144
assert_header "http://localhost:8080/" "Content-Type" "text/html"
145145
assert_header "http://localhost:8080/" "Content-Type" "text/markdown" -H "Accept: text/markdown"
146-
assert_header "http://localhost:8080/platform/proxy/datacenter-proxy" "Content-Type" "text/html"
147-
assert_header "http://localhost:8080/platform/proxy/datacenter-proxy.md" "Content-Type" "text/markdown"
148-
assert_header "http://localhost:8080/platform/proxy/datacenter-proxy" "Content-Type" "text/markdown" -H "Accept: text/markdown"
146+
assert_header "http://localhost:8080/proxy/datacenter-proxy" "Content-Type" "text/html"
147+
assert_header "http://localhost:8080/proxy/datacenter-proxy.md" "Content-Type" "text/markdown"
148+
assert_header "http://localhost:8080/proxy/datacenter-proxy" "Content-Type" "text/markdown" -H "Accept: text/markdown"
149149
assert_header "http://localhost:8080/img/docs-og.png" "Content-Type" "image/png"
150150
assert_header "http://localhost:8080/img/javascript-40x40.svg" "Content-Type" "image/svg"
151151
assert_header "http://localhost:8080/llms.txt" "Content-Type" "text/markdown"
@@ -172,7 +172,7 @@ jobs:
172172
assert_html_md_alternate "http://localhost:8080/api/v2/dataset-get" "https://docs.apify.com/api/v2/dataset-get.md"
173173
assert_html_md_alternate "http://localhost:8080/academy/tutorials" "https://docs.apify.com/academy/tutorials.md"
174174
# Sanity check: a regular (non-excluded) page also has the alternate.
175-
assert_html_md_alternate "http://localhost:8080/platform/proxy/datacenter-proxy" "https://docs.apify.com/platform/proxy/datacenter-proxy.md"
175+
assert_html_md_alternate "http://localhost:8080/proxy/datacenter-proxy" "https://docs.apify.com/proxy/datacenter-proxy.md"
176176
177177
echo "🧪 Checking Nginx responses... (apify-sdk-js)"
178178
assert_final_content_type "http://localhost:8080/sdk/js" "text/html"

apify-api/openapi/components/objects/actor-runs/charge.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ byRunId:
99
1010
:::info Learn more about pay-per-event pricing
1111
12-
For more details about pay-per-event (PPE) pricing, refer to our [PPE documentation](/platform/actors/publishing/monetize/pay-per-event).
12+
For more details about pay-per-event (PPE) pricing, refer to our [PPE documentation](/actors/publishing/monetize/pay-per-event).
1313
1414
:::
1515

apify-api/openapi/components/parameters/datasetParameters.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,7 @@ view:
236236
description: |
237237
Defines the view configuration for dataset items based on the schema definition.
238238
This parameter determines how the data will be filtered and presented.
239-
For complete specification details, see the [dataset schema documentation](/platform/actors/development/actor-definition/dataset-schema).
239+
For complete specification details, see the [dataset schema documentation](/actors/development/actor-definition/dataset-schema).
240240
schema:
241241
type: string
242242
example: overview

apify-api/openapi/components/schemas/actors/ActorDefinition.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ properties:
4848
examples: [get(input, startUrls.length, 1) * 1024]
4949
- type: integer
5050
examples: [1024]
51-
description: Specifies the default amount of memory in megabytes to be used when the Actor is started. Can be an integer or a [dynamic memory expression](/platform/actors/development/actor-definition/dynamic-actor-memory).
51+
description: Specifies the default amount of memory in megabytes to be used when the Actor is started. Can be an integer or a [dynamic memory expression](/actors/development/actor-definition/dynamic-actor-memory).
5252
minMemoryMbytes:
5353
type: integer
5454
minimum: 128

apify-api/openapi/components/schemas/datasets/Dataset.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ properties:
5050
description: ""
5151
schema:
5252
type: [object, "null"]
53-
description: Defines the schema of items in your dataset, the full specification can be found in [Apify docs](/platform/actors/development/actor-definition/dataset-schema)
53+
description: Defines the schema of items in your dataset, the full specification can be found in [Apify docs](/actors/development/actor-definition/dataset-schema)
5454
example:
5555
actorSpecification: 1
5656
title: My dataset

apify-api/openapi/components/schemas/users/UpdateLimitsRequest.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,4 @@ properties:
1010
type: integer
1111
examples: [90]
1212
description: |
13-
Apify securely stores your ten most recent Actor runs indefinitely, ensuring they are always accessible. Unnamed storages and other Actor runs are automatically deleted after the retention period. If you're subscribed, you can change it to keep data for longer or to limit your usage. [Lear more](https://docs.apify.com/platform/storage/usage#data-retention).
13+
Apify securely stores your ten most recent Actor runs indefinitely, ensuring they are always accessible. Unnamed storages and other Actor runs are automatically deleted after the retention period. If you're subscribed, you can change it to keep data for longer or to limit your usage. [Lear more](https://docs.apify.com/storage#data-retention).

apify-docs-theme/src/config.js

Lines changed: 114 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -20,119 +20,118 @@ const themeConfig = {
2020
},
2121
items: [
2222
{
23-
label: 'Academy',
24-
href: `${absoluteUrl}/academy`,
25-
activeBasePath: 'academy',
23+
label: 'Get started',
24+
href: `${absoluteUrl}/get-started`,
25+
activeBasePath: 'get-started',
2626
position: 'left',
2727
target: '_self',
2828
rel: 'dofollow',
2929
},
3030
{
31-
label: 'Platform',
32-
href: `${absoluteUrl}/platform`,
33-
className: 'navbar__active',
34-
activeBasePath: 'platform',
31+
label: 'Actors',
32+
href: `${absoluteUrl}/actors`,
33+
activeBasePath: 'actors',
3534
position: 'left',
3635
target: '_self',
3736
rel: 'dofollow',
3837
},
3938
{
40-
label: 'API',
41-
type: 'dropdown',
42-
to: `${absoluteUrl}/api`,
39+
label: 'Storage',
40+
href: `${absoluteUrl}/storage`,
41+
activeBasePath: 'storage',
42+
position: 'left',
4343
target: '_self',
4444
rel: 'dofollow',
45-
activeBasePath: 'api',
45+
},
46+
{
47+
label: 'Proxy',
48+
href: `${absoluteUrl}/proxy`,
49+
activeBasePath: 'proxy',
4650
position: 'left',
47-
items: [
48-
{
49-
label: 'Reference',
50-
href: `${absoluteUrl}/api/v2`,
51-
target: '_self',
52-
rel: 'dofollow',
53-
},
54-
{
55-
label: 'Client for JavaScript',
56-
href: `${absoluteUrl}/api/client/js/docs`,
57-
target: '_self',
58-
rel: 'dofollow',
59-
},
60-
{
61-
label: 'Client for Python',
62-
href: `${absoluteUrl}/api/client/python/docs`,
63-
target: '_self',
64-
rel: 'dofollow',
65-
},
66-
],
51+
target: '_self',
52+
rel: 'dofollow',
6753
},
6854
{
69-
label: 'SDK',
70-
type: 'dropdown',
71-
to: `${absoluteUrl}/sdk`,
72-
activeBasePath: 'sdk',
55+
label: 'Account',
56+
href: `${absoluteUrl}/account`,
57+
activeBasePath: 'account',
7358
position: 'left',
7459
target: '_self',
7560
rel: 'dofollow',
76-
items: [
77-
{
78-
label: 'SDK for JavaScript',
79-
href: `${absoluteUrl}/sdk/js/docs/overview`,
80-
target: '_self',
81-
rel: 'dofollow',
82-
},
83-
{
84-
html: 'SDK for Python',
85-
href: `${absoluteUrl}/sdk/python/docs/overview`,
86-
target: '_self',
87-
rel: 'dofollow',
88-
},
89-
],
9061
},
9162
{
92-
label: 'CLI',
93-
href: `${absoluteUrl}/cli/docs`,
63+
label: 'Integrations',
64+
href: `${absoluteUrl}/integrations`,
65+
activeBasePath: 'integrations',
9466
position: 'left',
95-
activeBasePath: 'cli',
9667
target: '_self',
9768
rel: 'dofollow',
9869
},
9970
{
100-
label: 'Open source',
101-
type: 'dropdown',
102-
to: `${absoluteUrl}/open-source`,
103-
activeBasePath: 'open-source',
71+
label: 'Limits',
72+
href: `${absoluteUrl}/limits`,
73+
activeBasePath: 'limits',
74+
position: 'left',
10475
target: '_self',
76+
rel: 'dofollow',
77+
},
78+
{
79+
label: 'Security',
80+
href: `${absoluteUrl}/security`,
81+
activeBasePath: 'security',
10582
position: 'left',
106-
className: 'navbar__item',
83+
target: '_self',
84+
rel: 'dofollow',
85+
},
86+
{
87+
label: 'Academy',
88+
href: `${absoluteUrl}/academy`,
89+
activeBasePath: 'academy',
90+
position: 'right',
91+
target: '_self',
92+
rel: 'dofollow',
93+
},
94+
{
95+
label: 'APIs, SDKs & CLI',
96+
type: 'dropdown',
97+
activeBaseRegex: '^/(api|sdk|cli)/',
98+
position: 'right',
10799
items: [
108100
{
109-
label: 'Crawlee',
110-
href: 'https://crawlee.dev',
101+
label: 'API Reference',
102+
href: `${absoluteUrl}/api/v2`,
103+
target: '_self',
111104
rel: 'dofollow',
112105
},
113106
{
114-
label: 'Fingerprint Suite',
115-
href: 'https://github.com/apify/fingerprint-suite',
116-
},
117-
{
118-
label: 'impit',
119-
href: 'https://github.com/apify/impit',
107+
label: 'SDK for JavaScript',
108+
href: `${absoluteUrl}/sdk/js/docs/overview`,
109+
target: '_self',
110+
rel: 'dofollow',
120111
},
121112
{
122-
label: 'MCP CLI',
123-
href: 'https://github.com/apify/mcpc',
113+
label: 'SDK for Python',
114+
href: `${absoluteUrl}/sdk/python/docs/overview`,
115+
target: '_self',
116+
rel: 'dofollow',
124117
},
125118
{
126-
label: 'Actor whitepaper',
127-
href: 'https://whitepaper.actor',
119+
label: 'Client for JavaScript',
120+
href: `${absoluteUrl}/api/client/js/docs`,
121+
target: '_self',
122+
rel: 'dofollow',
128123
},
129124
{
130-
label: 'proxy-chain',
131-
href: 'https://github.com/apify/proxy-chain',
125+
label: 'Client for Python',
126+
href: `${absoluteUrl}/api/client/python/docs`,
127+
target: '_self',
128+
rel: 'dofollow',
132129
},
133130
{
134-
label: 'Apify on GitHub',
135-
href: 'https://github.com/apify',
131+
label: 'CLI',
132+
href: `${absoluteUrl}/cli/docs`,
133+
target: '_self',
134+
rel: 'dofollow',
136135
},
137136
],
138137
},
@@ -163,8 +162,14 @@ const themeConfig = {
163162
rel: 'dofollow',
164163
},
165164
{
166-
label: 'Platform',
167-
href: `${absoluteUrl}/platform`,
165+
label: 'Get started',
166+
href: `${absoluteUrl}/get-started`,
167+
target: '_self',
168+
rel: 'dofollow',
169+
},
170+
{
171+
label: 'Actors',
172+
href: `${absoluteUrl}/actors`,
168173
target: '_self',
169174
rel: 'dofollow',
170175
},
@@ -211,18 +216,45 @@ const themeConfig = {
211216
],
212217
},
213218
{
214-
title: 'Other',
219+
title: 'Open source',
215220
items: [
216221
{
217-
label: 'CLI',
218-
href: `${absoluteUrl}/cli/docs`,
219-
position: 'left',
220-
target: '_self',
222+
label: 'Crawlee',
223+
href: 'https://crawlee.dev',
221224
rel: 'dofollow',
222225
},
223226
{
224-
label: 'Open source',
225-
href: `${absoluteUrl}/open-source`,
227+
label: 'Fingerprint Suite',
228+
href: 'https://github.com/apify/fingerprint-suite',
229+
},
230+
{
231+
label: 'impit',
232+
href: 'https://github.com/apify/impit',
233+
},
234+
{
235+
label: 'MCP CLI',
236+
href: 'https://github.com/apify/mcpc',
237+
},
238+
{
239+
label: 'Actor whitepaper',
240+
href: 'https://whitepaper.actor',
241+
},
242+
{
243+
label: 'proxy-chain',
244+
href: 'https://github.com/apify/proxy-chain',
245+
},
246+
{
247+
label: 'Apify on GitHub',
248+
href: 'https://github.com/apify',
249+
},
250+
],
251+
},
252+
{
253+
title: 'Other',
254+
items: [
255+
{
256+
label: 'CLI',
257+
href: `${absoluteUrl}/cli/docs`,
226258
position: 'left',
227259
target: '_self',
228260
rel: 'dofollow',

apify-docs-theme/src/theme/DocItemContent/index.js

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,14 @@ export default function DocItemContent({ children }) {
5151
'/api/v2/logs',
5252
'/api/v2/users',
5353
'/api/client',
54-
'/platform',
54+
'/get-started',
55+
'/actors',
56+
'/storage',
57+
'/proxy',
58+
'/account',
59+
'/integrations',
60+
'/limits',
61+
'/security',
5562
'/sdk',
5663
'/cli',
5764
'/academy',

apify-docs-theme/src/theme/SearchBar/index.js

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,17 @@ import './styles.css';
1717
*/
1818
function matchesCurrentInstance(href, baseUrl) {
1919
if (baseUrl === '/') {
20-
return href.startsWith('/academy') || href.startsWith('/platform');
20+
return (
21+
href.startsWith('/academy') ||
22+
href.startsWith('/get-started') ||
23+
href.startsWith('/actors') ||
24+
href.startsWith('/storage') ||
25+
href.startsWith('/proxy') ||
26+
href.startsWith('/account') ||
27+
href.startsWith('/integrations') ||
28+
href.startsWith('/limits') ||
29+
href.startsWith('/security')
30+
);
2131
}
2232

2333
return href.startsWith(baseUrl);

docusaurus.config.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ module.exports = {
120120
showLastUpdateTime: false,
121121
editUrl: 'https://github.com/apify/apify-docs/edit/master/',
122122
path: './sources/platform',
123-
routeBasePath: 'platform',
123+
routeBasePath: '/',
124124
sidebarPath: require.resolve('./sources/platform/sidebars.js'),
125125
rehypePlugins: [externalLinkProcessor],
126126
},

0 commit comments

Comments
 (0)