Scholar
+{% trans "Literature and library" %}
+diff --git a/apps/infra/accounts_app/views/billing_views.py b/apps/infra/accounts_app/views/billing_views.py index e206033fe..6017b2d04 100644 --- a/apps/infra/accounts_app/views/billing_views.py +++ b/apps/infra/accounts_app/views/billing_views.py @@ -95,21 +95,6 @@ def payment_step(request): # the "any existing user can enter the signup payment flow" defect. return redirect("accounts_app:billing") - if not card_registration_is_open(): - # No card can be taken yet (provider not configured). Still render THIS - # step rather than borrowing the generic billing page: the funnel stays one - # coherent step, and the surface carries its own marker so both a reader and - # a test can tell which step they are on. - disclosures = payment_disclosures( - plan_label="", - monthly_usd=0.0, - trial_end=None, - state=NOT_OPEN, - ) - return render(request, "accounts_app/payment_step.html", disclosures.as_context()) - - # Which plan a new signup is put on must be DETERMINED and CHARGEABLE, not - # whichever catalog row comes first and not whatever ``?plan=`` names. # # Free first: a $0 plan recorded on the authority owes no card and no # provider round-trip (it can never be on the chargeable allowlist, by @@ -126,6 +111,21 @@ def payment_step(request): mark_activated(user, pricing_id=free_row["id"]) return redirect(first_product_url()) + if not card_registration_is_open(): + # No card can be taken yet (provider not configured). Still render THIS + # step rather than borrowing the generic billing page: the funnel stays one + # coherent step, and the surface carries its own marker so both a reader and + # a test can tell which step they are on. + disclosures = payment_disclosures( + plan_label="", + monthly_usd=0.0, + trial_end=None, + state=NOT_OPEN, + ) + return render(request, "accounts_app/payment_step.html", disclosures.as_context()) + + # Which plan a new signup is put on must be DETERMINED and CHARGEABLE, not + # whichever catalog row comes first and not whatever ``?plan=`` names. row = funnel_plan(user, requested_id=request.GET.get("plan")) # The way the last attempt ended, read from the provider's return markers. diff --git a/apps/infra/auth_app/views/theme.py b/apps/infra/auth_app/views/theme.py index 068f68585..b783fde0e 100644 --- a/apps/infra/auth_app/views/theme.py +++ b/apps/infra/auth_app/views/theme.py @@ -5,14 +5,10 @@ Theme resolution contract: - The BASE default is DARK for every first visit, on every viewport. -- Only a REGISTERED user's EXPLICITLY saved profile preference is - served as a preference (``source: "profile"``); everything else is - served as a default (``source: "default"``) so the client can let an - explicit prior localStorage choice win over it. A profile row is - auto-created at registration with the dark default, so row existence - alone must NOT count as a saved preference (UserProfile.theme_explicit - gates it) — otherwise every login would clobber a stored light choice - back to dark. +- Only a REGISTERED user's saved profile preference is served as a + preference (``source: "profile"``); everything else is served as a + default (``source: "default"``) so the client can let an explicit + prior localStorage choice win over it. """ from __future__ import annotations @@ -118,11 +114,7 @@ def api_get_theme_preference(request): "source": "profile" | "default" } - ``source: "profile"`` only for an authenticated user whose profile - row carries an EXPLICITLY saved choice (theme_explicit). A row that - merely exists (auto-created at registration with the dark default) - is served as ``source: "default"`` so the client lets a stored - browser choice win. + ``source: "profile"`` only for an authenticated user's saved row. """ if not request.user.is_authenticated: return JsonResponse(dict(_DEFAULT_THEME_RESPONSE)) diff --git a/apps/infra/public_app/templates/public_app/landing.html b/apps/infra/public_app/templates/public_app/landing.html index 7547c7c54..4ff1926ab 100644 --- a/apps/infra/public_app/templates/public_app/landing.html +++ b/apps/infra/public_app/templates/public_app/landing.html @@ -3,6 +3,7 @@ {% load static vite i18n %} {% block title %}{% trans "SciTeX — A platform for science" %}{% endblock %} +{% block meta_description %}{% trans "Connect literature, files, analysis, figures, writing, and compute in one SciTeX project context." %}{% endblock %} {% block extra_css %} diff --git a/apps/infra/public_app/templates/public_app/landing_partials/landing_hero.html b/apps/infra/public_app/templates/public_app/landing_partials/landing_hero.html index 3292fd011..fcdf5cf99 100644 --- a/apps/infra/public_app/templates/public_app/landing_partials/landing_hero.html +++ b/apps/infra/public_app/templates/public_app/landing_partials/landing_hero.html @@ -5,40 +5,33 @@
{% trans "Open research infrastructure" %}
+ {% trans "Literature, files, analysis, figures, writing, and agents in one connected project." %} +
++ {% trans "Review from your phone. Work in the browser. Run where compute lives." %}
-+ {% trans "Already have an account?" %} + {% trans "Sign in" %} +
++ {% blocktrans with version=SCITEX_HUB_VERSION %}Alpha Release ({{ version }}) — Data persistence and API stability are not guaranteed. For production use, install the local Python toolkit. Any contribution welcome:{% endblocktrans %} + {{ CONTACT_EMAIL }} +
+{% trans "One project, every place" %}
+{% trans "Move between a quick mobile review, focused browser work, and HPC over SSH without rebuilding the project around each device." %}
+{% trans "Review a result, save a paper, or capture the next step." %}
+{% trans "Use the browser for daily analysis, figures, and writing." %}
+{% trans "Run near the scheduler and data while the project stays connected." %}
+{% trans "Extend the same project and command contract for your lab." %}
+{% trans "Built in, connected by design" %}
-{% trans "Each built-in app specializes. Hub keeps project, files, identity, and commands connected. Custom Apps sit outside the built-ins and extend the same contract." %}
{% trans "Literature and library" %}
+{% trans "Files and data" %}
+{% trans "Analysis and reports" %}
+{% trans "Commands and conversations" %}
+{% trans "one project context" %}
+{% trans "Tasks and evidence" %}
+{% trans "Figures and source" %}
+{% trans "Manuscript and PDF" %}
+{% trans "Extend the same contract" %}
+
- - {% trans "Unedited interface captures from tracked product-guide screenshots and the development Stats app; resize and compression only." %} + {% trans "Unedited interface captures from tracked product-guide screenshots; resize and compression only." %}
{% trans "Verifiable provenance" %}
-{% trans "SciTeX Clew records relationships between research artifacts in a directed acyclic graph, connecting a manuscript claim to output, processing, and raw data, and resolving the shortest path between them. A “clew” is Ariadne’s ball of thread from Greek mythology, given to Theseus to navigate the Labyrinth and escape the Minotaur — our thread leads back from claim to source." %}
+{% trans "SciTeX Clew records relationships between research artifacts in a directed acyclic graph. The public example connects a manuscript claim to output, processing, and raw data." %}
{% trans "One project, every place" %}
-{% trans "Move between a quick mobile review, focused browser work, and HPC over SSH without rebuilding the project around each device." %}
-{% trans "Review results, save papers, or capture the next step — from anywhere, even your bed." %}
-{% trans "Daily analysis, figures, and writing in the browser — wherever you work." %}
-{% trans "Collaborate with colleagues on private and public projects in one connected workspace." %}
-{% trans "Heavy compute next to the scheduler and data — without leaving the project." %}
-{% trans "Build on SciTeX" %}
-{% trans "Research is novel by definition: predefined products rarely cover the experiment in front of you. Custom Apps let you build the data-collection and experiment tools your work actually needs, on the shared foundation you already have: users, projects, authentication, file storage, background compute, and AI." %}
-{% trans "The SDK provides DataStore (structured records), FileVault (project files), and JobQueue (background jobs) through a Python API, CLI, and MCP tools. Built-in skills let you create apps through interactive conversation with AI agents, and validators check each app before it runs." %}
-{% trans "Apps are just repositories: use, share, and co-develop them like code, and publish one alongside your paper so readers can run the experiment, not just read about it." %}
- -{% trans "Published apps live in the SciTeX App Store. Native mobile stores (Apple App Store / Google Play) are planned — not yet available." %}
-
+
+ {% trans "Open by design" %}
-{% trans "Your research. Your infrastructure. Your assets stay yours: connect the machines, datasets, and keys you already have and use them at full value, with no platform markup and nothing locked in. Use SciTeX Cloud or self-host, keep human judgment at the center, and plug in whatever the work needs." %}
+{% trans "Use SciTeX Cloud or self-host. Keep human judgment at the center and choose the environment, compute, and integrations that fit the work." %}
{% trans "Available deployment options and integrations depend on the selected setup." %}