Compare commits

...

406 Commits

Author SHA1 Message Date
Dhruwang 5301fbd8f3 fix shuffle in ranking question 2024-10-04 17:20:05 +05:30
Dhruwang ad0ad9008c refactors 2024-10-04 15:31:43 +05:30
Dhruwang f813db65e9 Merge branch 'main' of https://github.com/formbricks/formbricks into randomize-row-order-matrix-questions 2024-10-04 14:40:42 +05:30
Matti Nannt 6b04cc789b chore: improve packages endpoint cache to save bandwidth (#3284) 2024-10-04 08:41:41 +00:00
Dhruwang Jariwala e31e9f4fa1 fix: matrix survey sync issue (#3283) 2024-10-04 06:21:03 +00:00
Dev Dalia f38a4665e4 fix: keyboard opening unexpectedly (#3278)
Co-authored-by: Dhruwang Jariwala <67850763+Dhruwang@users.noreply.github.com>
2024-10-04 05:38:50 +00:00
Prajyot 0cc84c8734 fix: Add reference to the API in the Single Use Link docs #3257 (#3280)
Co-authored-by: prajyot28 <prajyot.sable@techstalwarts.com>
Co-authored-by: Johannes <johannes@formbricks.com>
Co-authored-by: Johannes <72809645+jobenjada@users.noreply.github.com>
2024-10-03 14:31:27 -07:00
SaiSawant1 d97e90a515 ShuffleOptionType 2024-10-04 02:29:52 +05:30
SaiSawant1 16170a73a6 Merge branch 'main' into randomize-row-order-matrix-questions 2024-10-04 02:15:20 +05:30
SaiSawant1 be7de68d4f create shuffle option select component in
packages/ui/components/ShuffleOptionSelect
which is imported in MatrixQuestionForm, MultipleChoiceQuestionForm,
RankingQuestionForm
2024-10-04 01:20:32 +05:30
Johannes 80243b8561 Merge branch 'main' of https://github.com/formbricks/formbricks 2024-10-03 12:33:18 -07:00
Johannes f90b508251 replace conditional logic with new content 2024-10-03 12:33:11 -07:00
Vanshika d71a9c9c3d ossgg: update -brand with -brand-dark (#3256)
Co-authored-by: root <root@Vanshika>
Co-authored-by: Johannes <johannes@formbricks.com>
Co-authored-by: Matthias Nannt <mail@matthiasnannt.com>
2024-10-03 11:15:47 -07:00
Ikko Eltociear Ashimine 934a05a814 docs: update page.mdx (#3265) 2024-10-03 11:13:09 -07:00
Dhruwang Jariwala 21e9e9167f fix: survey preview updation issues (#3269) 2024-10-03 17:35:24 +00:00
Harsh Shrikant Bhat ea0df287d9 ossgg: All three oss.gg sidequests (#3267) 2024-10-03 10:26:58 -07:00
Teddy ASSIH 74407e7919 ossgg: Like and Retweet ossgg launch post (#3274) 2024-10-03 07:56:44 -07:00
SaiSawant1 c4e4f0c272 Merge branch 'main' into randomize-row-order-matrix-questions 2024-10-03 20:12:46 +05:30
SaiSawant1 14cfb6fdf8 Preview error fix.
The preview matrix question was not being updated when questions was
being updated.
2024-10-03 20:10:10 +05:30
Abhi-Bohora ea4941fe98 fix: gitpod build error (#3271)
Co-authored-by: Dhruwang <dhruwangjariwala18@gmail.com>
2024-10-03 10:42:03 +00:00
SaiSawant1 d208e99f06 Merge branch 'main' into randomize-row-order-matrix-questions 2024-10-03 14:33:32 +05:30
Satyanarayan Prashar 1c10679b71 fix: Validate button link input to only accept URLs #3258 (#3268)
Co-authored-by: Dhruwang <dhruwangjariwala18@gmail.com>
2024-10-03 06:39:01 +00:00
Aditya Deshlahre 0b9d76e243 ossgg: tweet hunter (#3261)
Co-authored-by: Johannes <72809645+jobenjada@users.noreply.github.com>
2024-10-02 21:36:41 +00:00
kartik satish devarde 4d225818a6 feat: update CSAT template #3212 (#3242)
Co-authored-by: Johannes <72809645+jobenjada@users.noreply.github.com>
2024-10-02 21:05:53 +00:00
Emmanuel C. Jemeni f60ae69ed1 ossgg: Update 1-retweet-launch-tweet.md (#3255)
Co-authored-by: Johannes <72809645+jobenjada@users.noreply.github.com>
2024-10-02 17:51:39 +00:00
Dhruwang Jariwala e583aa38ba fix: missing footer (#3253) 2024-10-02 13:56:15 +00:00
Anshuman Pandey d47944ed21 chore: removes actions from the backend (#3106)
Co-authored-by: Matthias Nannt <mail@matthiasnannt.com>
2024-10-02 11:55:26 +00:00
Smriti Doneria a8e1fce3b7 fix: toast Message while creating the survey (#3240)
Co-authored-by: Piyush Gupta <piyushguptaa2z123@gmail.com>
2024-10-02 11:17:54 +00:00
Matti Nannt 706fa8a04e fix: notification settings not working correctly (#3246)
Co-authored-by: Johannes <72809645+jobenjada@users.noreply.github.com>
Co-authored-by: Johannes <johannes@formbricks.com>
2024-10-02 00:08:12 +00:00
Johannes 11748cbeba fix: remove pulp ficiton from onboarding (#3187) 2024-10-01 15:38:43 -07:00
Matti Nannt 0f50c9690c fix: update lower-level license files to match main license (#3247) 2024-10-01 22:20:06 +00:00
SaiSawant1 409fc8bb01 random error fix 2024-10-02 02:04:33 +05:30
Satyanarayan Prashar 316e5f15b0 fix: height & width of survey preview when loading (#3234)
Co-authored-by: Johannes <72809645+jobenjada@users.noreply.github.com>
2024-10-01 19:48:03 +00:00
RajuGangitla 18719746ed fix: added brand color to loader #3205 (#3237)
Co-authored-by: Johannes <72809645+jobenjada@users.noreply.github.com>
2024-10-01 19:36:37 +00:00
Nawin Kumar Sharma 41fb76e4ff fix: template search functionality (#3243) 2024-10-01 18:11:13 +00:00
Aashish Anand 24d1f23421 fix: dark mode in demo apps #3209 (#3241)
Co-authored-by: Piyush Gupta <piyushguptaa2z123@gmail.com>
2024-10-01 16:11:42 +00:00
Harsh Singh 354ec1b887 fix: remove scrollbar in rich text editor (#3236)
Co-authored-by: Anshuman Pandey <54475686+pandeymangg@users.noreply.github.com>
2024-10-01 12:25:16 +00:00
Dhruwang Jariwala 87c584add8 fix: validations in integrations (#3238) 2024-10-01 11:56:36 +00:00
Anshuman Pandey 5035e3db9d feat: adds contact info question type (#3176)
Co-authored-by: Dhruwang <dhruwangjariwala18@gmail.com>
2024-10-01 11:11:45 +00:00
SaiSawant1 b078655f82 set default shuffle to none 2024-10-01 08:08:30 +05:30
SaiSawant1 31eae02a78 create copy of row and shuffle the copy instead of original row 2024-10-01 01:36:28 +05:30
SaiSawant1 b3ad45cce1 build error fix 2024-10-01 00:37:33 +05:30
SaiSawant1 f7108b1d1e feature allow user to randomize rows. 2024-10-01 00:30:41 +05:30
Matti Nannt b7f4097508 chore: improve pipeline performance (#3184)
Co-authored-by: Dhruwang <dhruwangjariwala18@gmail.com>
Co-authored-by: Dhruwang Jariwala <67850763+Dhruwang@users.noreply.github.com>
2024-09-30 14:32:48 +00:00
Piyush Gupta 26591d9b9f feat: Advanced logic editor (#3020)
Co-authored-by: Johannes <johannes@formbricks.com>
Co-authored-by: pandeymangg <anshuman.pandey9999@gmail.com>
Co-authored-by: Matthias Nannt <mail@matthiasnannt.com>
2024-09-30 10:25:22 +00:00
Piyush Gupta 655b67c3ad fix: preserve last environment id (#3185) 2024-09-30 06:57:51 +00:00
Piyush Gupta 2dbd7111a9 fix: getMonthlyOrganizationResponseCount for free plan users (#3219) 2024-09-30 06:26:14 +00:00
Johannes 06ddee42a9 Update oss-gg-hack-submission.yml 2024-09-29 13:45:04 -07:00
Johannes 47aa84bf8a Update oss-gg-hack-submission.yml 2024-09-29 13:41:52 -07:00
Johannes 2f7a59817a Update oss-gg-hack-submission.yml 2024-09-29 13:26:46 -07:00
Johannes e7a0228bfa Update oss-gg-hack-submission.yml 2024-09-29 13:25:50 -07:00
Johannes 2367313ff2 feat: adding side quest tracker files (#3189) 2024-09-29 13:02:46 -07:00
Johannes 68e52954e2 docs: add shareable dashboard page (#3188) 2024-09-28 17:16:03 -07:00
Dhruwang Jariwala 59ebde49cf fix: mls missing language toggle (#3143)
Co-authored-by: Anshuman Pandey <54475686+pandeymangg@users.noreply.github.com>
Co-authored-by: pandeymangg <anshuman.pandey9999@gmail.com>
2024-09-28 05:11:21 +00:00
Dhruwang Jariwala 6ab2560432 fix: 50% scroll (#3174)
Co-authored-by: pandeymangg <anshuman.pandey9999@gmail.com>
2024-09-28 04:15:47 +00:00
Dhruwang Jariwala 861d399025 feat: Search bar in persons table (#3169)
Co-authored-by: Piyush Gupta <piyushguptaa2z123@gmail.com>
Co-authored-by: Matthias Nannt <mail@matthiasnannt.com>
2024-09-27 09:42:44 +00:00
Thomas Sieffert fc3886fafa fix(docs): S3 endpoint was wrong (#3182) 2024-09-27 10:25:58 +02:00
Matti Nannt ddf7ad8475 chore: update ui package structure & add shadcn-ui cli support (#3178)
Co-authored-by: Piyush Gupta <piyushguptaa2z123@gmail.com>
2024-09-26 12:08:21 +00:00
Jonas Höbenreich ad6d5d6c00 fix: small typos (#3179) 2024-09-26 09:03:01 +00:00
Piyush Gupta 315aaac395 fix: product headline (#3173) 2024-09-25 08:56:38 +00:00
Dhruwang Jariwala 01ceaa13ec fix: load more button applies filter (#3167) 2024-09-23 12:37:07 +00:00
Piyush Gupta 25774f6f08 chore: removes stale action docs (#3166) 2024-09-23 04:43:13 +00:00
Dhruwang Jariwala 9a98772210 fix: notion integration (#3162) 2024-09-20 14:17:28 +00:00
Piyush Gupta 59a29dd3d6 feat: Introduce Formbricks CX (#3152)
Co-authored-by: RajuGangitla <gangitlaraju8520@gmail.com>
Co-authored-by: Johannes <johannes@formbricks.com>
Co-authored-by: Johannes <72809645+jobenjada@users.noreply.github.com>
Co-authored-by: pandeymangg <anshuman.pandey9999@gmail.com>
Co-authored-by: Anshuman Pandey <54475686+pandeymangg@users.noreply.github.com>
2024-09-20 09:17:18 +00:00
Dhruwang Jariwala e4fceb2e5e fix: improved person fetching (#3161) 2024-09-20 05:09:22 +00:00
Dhruwang Jariwala 0b553447e0 fix: person loading skeleton (#3160) 2024-09-19 16:44:16 +00:00
Dhruwang Jariwala 6b64367d99 feat: Data table for persons (#3154) 2024-09-19 13:34:25 +00:00
Matti Nannt fe9746ba67 fix: update displays data migration run out of memory on many displays (#3157)
Co-authored-by: pandeymangg <anshuman.pandey9999@gmail.com>
2024-09-19 11:00:39 +00:00
Dhruwang Jariwala e4009d5951 chore: Refactor display response relationship (#3100)
Co-authored-by: Piyush Gupta <piyushguptaa2z123@gmail.com>
2024-09-18 10:55:46 +00:00
Sai Suhas Sawant b1ed61c247 fix: Added DialogTitle and DialogDescrtiption components to the dialog. (#3146)
Co-authored-by: Dhruwang <dhruwangjariwala18@gmail.com>
2024-09-18 09:53:50 +00:00
Anshuman Pandey 10255aa102 fix: api errors (#3150)
Co-authored-by: Piyush Gupta <piyushguptaa2z123@gmail.com>
2024-09-18 09:52:05 +00:00
mdm317 774c6f19a5 fix: notes not appearing (#3131)
Co-authored-by: Johannes <72809645+jobenjada@users.noreply.github.com>
2024-09-18 09:37:36 +00:00
Piyush Gupta ebf35ea582 feat: adds auto animate to survey questions (#3147)
Co-authored-by: Johannes <72809645+jobenjada@users.noreply.github.com>
2024-09-17 09:24:12 +00:00
Anshuman Pandey f13efc954e fix: removes rewrites from next config (#3149) 2024-09-17 09:19:21 +00:00
Matti Nannt 9ee052a229 feat: Make app surveys scalable (#3024)
Co-authored-by: pandeymangg <anshuman.pandey9999@gmail.com>
Co-authored-by: Piyush Gupta <piyushguptaa2z123@gmail.com>
2024-09-17 08:15:19 +00:00
RajuGangitla 152fbede90 feat: info about new formbricks version (#3126)
Co-authored-by: Johannes <johannes@formbricks.com>
Co-authored-by: Johannes <72809645+jobenjada@users.noreply.github.com>
Co-authored-by: pandeymangg <anshuman.pandey9999@gmail.com>
Co-authored-by: Anshuman Pandey <54475686+pandeymangg@users.noreply.github.com>
Co-authored-by: Piyush Gupta <piyushguptaa2z123@gmail.com>
2024-09-17 07:35:19 +00:00
Dhruwang Jariwala c9b8ffa9ef fix: billing tab (#3138)
Co-authored-by: Johannes <72809645+jobenjada@users.noreply.github.com>
2024-09-16 10:31:54 +00:00
Anshuman Pandey 04e16d44a1 fix: release 2.5.3 (#3139) 2024-09-12 16:07:39 +02:00
Jonas Höbenreich 29131f93c2 fix: increase timeout (#3120)
Co-authored-by: pandeymangg <anshuman.pandey9999@gmail.com>
2024-09-12 15:35:12 +02:00
Anshuman Pandey 1e2fe7b066 fix: validation UI (#3137)
Co-authored-by: Dhruwang <dhruwangjariwala18@gmail.com>
2024-09-12 11:52:58 +00:00
Johannes 426a0a3847 fix: tweak action UI (#3136) 2024-09-12 11:50:58 +00:00
Jonas Höbenreich 80ef504bef fix: Device Info Overflowing for Long URLs (#3135)
Co-authored-by: Johannes <72809645+jobenjada@users.noreply.github.com>
Co-authored-by: Johannes <johannes@formbricks.com>
2024-09-12 11:44:41 +00:00
Anshuman Pandey 6ab83e25d3 fix: multi lang issue sync (#3132)
Co-authored-by: Dhruwang <dhruwangjariwala18@gmail.com>
2024-09-12 10:59:15 +00:00
Jonas Höbenreich 688dc25990 fix: cuid validation 🚨 (#3130) 2024-09-12 10:26:33 +00:00
Johannes c53b58c64f fix: update RN docs (#3127) 2024-09-11 12:00:04 +02:00
Piyush Gupta 61d18edb5d feat: add support for webp file format in file inputs (#3117)
Co-authored-by: Anshuman Pandey <54475686+pandeymangg@users.noreply.github.com>
2024-09-11 08:53:05 +00:00
Anshuman Pandey 07b5dfe28a fix: trigger (#3125) 2024-09-11 04:31:37 +00:00
Anshuman Pandey f55cad0121 fix: multi lang sync issue (#3121)
Co-authored-by: Dhruwang <dhruwangjariwala18@gmail.com>
2024-09-10 12:37:55 +00:00
Dhruwang Jariwala 494299cd89 fix: optional behaviour for matrix question (#3118) 2024-09-10 12:32:42 +00:00
RajuGangitla 5cc071e5a8 fix: Loading Skeleton for survey summary page (#3108)
Co-authored-by: Johannes <johannes@formbricks.com>
Co-authored-by: Johannes <72809645+jobenjada@users.noreply.github.com>
Co-authored-by: pandeymangg <anshuman.pandey9999@gmail.com>
Co-authored-by: Anshuman Pandey <54475686+pandeymangg@users.noreply.github.com>
2024-09-09 15:11:56 +00:00
Anshuman Pandey 0532f2744b feat: delete uploaded files with response deletion (#3114) 2024-09-09 12:24:25 +00:00
Anshuman Pandey 43ea26a33a fix: segment update (#3115) 2024-09-09 11:47:38 +00:00
Piyush Gupta ec54e40a8b fix: SSRF vulnerability in unsplash image fetching (#3111)
Co-authored-by: pandeymangg <anshuman.pandey9999@gmail.com>
Co-authored-by: Anshuman Pandey <54475686+pandeymangg@users.noreply.github.com>
2024-09-09 10:46:07 +00:00
Dhruwang Jariwala 4b508f02e3 fix: added people column to data table (#3110)
Co-authored-by: Johannes <johannes@formbricks.com>
Co-authored-by: Johannes <72809645+jobenjada@users.noreply.github.com>
2024-09-09 04:30:35 +00:00
Johannes eec7e1b62a fix: update docs (#3113) 2024-09-08 15:29:32 +02:00
Johannes 39e87eb8d3 fix: remove description from new questions (#3112) 2024-09-07 14:25:55 +02:00
Dhruwang Jariwala 780115ffb8 fix: infinite loading in survey animation (#3107) 2024-09-06 07:02:57 +00:00
Anshuman Pandey c7c4ba6e49 release 2.5.1 (#3103) 2024-09-05 12:55:29 +02:00
Piyush Gupta b9a7edf1f5 fix: create response via api can change created and updated at (#3091) 2024-09-05 10:34:42 +00:00
Dhruwang Jariwala 86bf2accc9 style: tweak environment switch (#3102) 2024-09-05 10:29:59 +00:00
Anshuman Pandey 954c435404 fix: setAttribute error in the js package (#3099) 2024-09-05 09:23:49 +00:00
Johannes 538c1bd809 feat: add new template to GitHub (#3101) 2024-09-05 11:33:00 +02:00
Johannes e0767881f2 fix: update link to landing page (#3097) 2024-09-05 09:21:09 +02:00
Dhruwang Jariwala 7d0cbad326 feat: one response per email (#3088)
Co-authored-by: Johannes <johannes@formbricks.com>
2024-09-04 12:43:03 +00:00
Dhruwang Jariwala 0ce7703ab8 fix: data table tweaks (#3095) 2024-09-04 12:40:51 +00:00
Dhruwang Jariwala 4362fdf35a fix: verified email to exports (#3094) 2024-09-04 12:35:29 +00:00
Dhruwang Jariwala 4bcca2daf4 fix: hidden fields in data table (#3087)
Co-authored-by: pandeymangg <anshuman.pandey9999@gmail.com>
2024-09-04 08:45:30 +00:00
Piyush Gupta a1d83ac7b9 fix: final bugs in release 2.5 (#3084) 2024-09-03 12:22:28 +00:00
Piyush Gupta 492729baf3 docs: adds data migration guide for formbricks 2.5 release (#3083) 2024-09-03 10:54:25 +00:00
Dhruwang Jariwala 4003d21826 feat: Relevance option for sorting (#2968)
Co-authored-by: pandeymangg <anshuman.pandey9999@gmail.com>
Co-authored-by: Anshuman Pandey <54475686+pandeymangg@users.noreply.github.com>
2024-09-03 10:43:55 +00:00
Piyush Gupta b10d398728 fix: Summary auto-update also queries when not in focus (#3067)
Co-authored-by: Anshuman Pandey <54475686+pandeymangg@users.noreply.github.com>
2024-09-03 09:22:18 +00:00
Dhruwang Jariwala 198df84b89 fix: NPS response exported as empty string (#3080)
Co-authored-by: Johannes <johannes@formbricks.com>
2024-09-03 08:58:48 +00:00
Dhruwang Jariwala 211fc22b2a fix: docs app build (#3081) 2024-09-03 08:30:48 +00:00
Dhruwang Jariwala 4a0a5c9591 feat: Data table view for Responses (#3053)
Co-authored-by: Johannes <72809645+jobenjada@users.noreply.github.com>
Co-authored-by: Johannes <johannes@formbricks.com>
Co-authored-by: pandeymangg <anshuman.pandey9999@gmail.com>
Co-authored-by: Anshuman Pandey <54475686+pandeymangg@users.noreply.github.com>
2024-09-03 03:19:58 +00:00
Sai Suhas Sawant 8f51afe198 feat: skeleton loading #3051 (#3057)
Co-authored-by: Johannes <72809645+jobenjada@users.noreply.github.com>
Co-authored-by: Johannes <johannes@formbricks.com>
2024-09-02 15:16:50 +00:00
Dhruwang Jariwala 40b6642ef0 fix: caching issue for resultShareKey (#3063) 2024-09-02 14:35:54 +00:00
Dhruwang Jariwala 0076cbaf54 fix: Validation for callback URL (#3061) 2024-09-02 13:15:57 +00:00
Dhruwang Jariwala 14e0d57091 chore: removed environmentId from language services (#3070) 2024-09-02 12:57:55 +00:00
Johannes 3e79ec9a61 fix: change question type CTA wording (#3076) 2024-08-31 11:22:16 +02:00
Johannes 42cd7d3b77 feat: reword RN docs and tweak for SEO (#3073) 2024-08-30 18:47:56 +02:00
Dhruwang Jariwala 6f4c65c178 fix: tweaked preview (#3072)
Co-authored-by: Johannes <72809645+jobenjada@users.noreply.github.com>
2024-08-30 15:31:38 +00:00
Naitik Kapadia 863424ffd7 feat: Add Ranking Question (#2996)
Co-authored-by: Johannes <72809645+jobenjada@users.noreply.github.com>
Co-authored-by: Johannes <johannes@formbricks.com>
Co-authored-by: Dhruwang Jariwala <67850763+Dhruwang@users.noreply.github.com>
Co-authored-by: Dhruwang <dhruwangjariwala18@gmail.com>
Co-authored-by: pandeymangg <anshuman.pandey9999@gmail.com>
2024-08-30 11:21:36 +00:00
Dhruwang Jariwala c35cfbd170 fix: reset survey button (#3069) 2024-08-30 11:00:51 +00:00
Dhruwang Jariwala 22425726d1 fix: other filter not working (#3041)
Co-authored-by: Johannes <72809645+jobenjada@users.noreply.github.com>
Co-authored-by: Johannes <johannes@formbricks.com>
2024-08-29 12:53:15 +00:00
Anshuman Pandey 94e8c1da68 fix: survey cache invalidation in survey-status cron (#3066) 2024-08-29 12:27:35 +00:00
Dhruwang Jariwala 55c305c569 fix: rounded-corner-gap=issue (#3064)
Co-authored-by: Johannes <johannes@formbricks.com>
2024-08-29 12:26:25 +00:00
Piyush Gupta ad028947e0 fix: new survey button visible to viewers (#3065) 2024-08-29 11:31:39 +00:00
mdm317 212e0753c8 fix: closing survey on mobile falsely positions it (#3004)
Co-authored-by: Piyush Gupta <piyushguptaa2z123@gmail.com>
Co-authored-by: Johannes <72809645+jobenjada@users.noreply.github.com>
Co-authored-by: Johannes <johannes@formbricks.com>
Co-authored-by: Dhruwang <dhruwangjariwala18@gmail.com>
2024-08-27 12:24:47 +00:00
Matti Nannt 711dc83f5c fix: build errors on docs page (#3056) 2024-08-27 10:35:01 +02:00
Matti Nannt 6314eeda0a chore: release js 2.2.0 (#3055) 2024-08-27 10:01:21 +02:00
Anshuman Pandey cf783ea480 fix: s3 file upload (#3050)
Co-authored-by: Matti Nannt <mail@matthiasnannt.com>
2024-08-26 14:43:25 +00:00
Filip Gornitzka Abelson 899fbef948 feat: replace emojis in survey editor and survey fetching (#3047)
Co-authored-by: Johannes <johannes@formbricks.com>
2024-08-26 12:39:41 +00:00
Anshuman Pandey 4a6d7952a7 fix: segment evaluation fix (#3043) 2024-08-26 05:04:37 +00:00
Matti Nannt 5443226e27 chore: increase react-native version number to 1.0.0 (#3046) 2024-08-23 21:31:57 +02:00
ty kerr 89ffe99dcc feat: react native sdk (#2565)
Co-authored-by: tykerr <tykerr@gmail.com>
Co-authored-by: Dhruwang <dhruwangjariwala18@gmail.com>
Co-authored-by: Dhruwang Jariwala <67850763+Dhruwang@users.noreply.github.com>
Co-authored-by: pandeymangg <anshuman.pandey9999@gmail.com>
Co-authored-by: Matthias Nannt <mail@matthiasnannt.com>
2024-08-23 12:43:49 +02:00
Dhruwang Jariwala ede306b88e fix: matrix question validation (#3030)
Co-authored-by: Matti Nannt <mail@matthiasnannt.com>
2024-08-23 10:05:28 +00:00
Dhruwang Jariwala 0acc49c57d fix: open outbound links in new tab (#3042) 2024-08-23 10:11:22 +02:00
Matti Nannt 2bbeb040c2 fix: use createdAt instead of updatedAt in responseCard (#3040) 2024-08-22 11:14:08 +00:00
Piyush Gupta 5689c36b12 feat: adds management endpoint to generate multiple suId (#3022)
Co-authored-by: Matti Nannt <mail@matthiasnannt.com>
2024-08-22 09:55:13 +00:00
Anshuman Pandey f4a367d2de feat: survey variables (#3013)
Co-authored-by: Matti Nannt <mail@matthiasnannt.com>
2024-08-22 09:43:39 +00:00
Dhruwang Jariwala afe042ecfc fix: member invite issues (#3028)
Co-authored-by: Matti Nannt <mail@matthiasnannt.com>
2024-08-22 08:55:44 +00:00
Anshuman Pandey c108cd4780 fix: js command queue support for late initialization (#2974) 2024-08-21 11:12:30 +00:00
Dhruwang Jariwala d84146fd88 fix: display creation (#3034) 2024-08-21 07:03:34 +00:00
use-tusk[bot] 30e6316e16 feat: Add support for managing path style in S3 compatible service (#3031)
Co-authored-by: use-tusk[bot] <144006087+use-tusk[bot]@users.noreply.github.com>
2024-08-20 10:16:48 +00:00
Dhruwang Jariwala 6835e585b0 fix: missing question type in Add question below menu (#3029) 2024-08-20 08:59:17 +02:00
Matti Nannt 49d4f43652 chore: add address collection to stripe checkout (#3025) 2024-08-19 14:37:22 +00:00
Matti Nannt 70dd9c7724 fix: dismissed inconsistency data migration fails with many entries (#3021) 2024-08-19 12:20:39 +02:00
Piyush Gupta f386e47efa fix: Let CTA and consent question store nothing if dismissed (#2977)
Co-authored-by: Matthias Nannt <mail@matthiasnannt.com>
2024-08-19 08:50:19 +00:00
Piyush Gupta ec16159497 chore: Move all server action to new authorization approach (#2999) 2024-08-19 07:07:37 +00:00
Vishal Tyagi 5ba2959eb4 feat: Added ColorPicker component to Storybook (#3019) 2024-08-19 06:59:10 +00:00
Saurabh Chaddha e9c5b00628 fix: recall info on thank you card (#3016) 2024-08-16 22:11:15 +02:00
Johannes 8e1f43eb8b fix: update upgrade plan notice (#3018) 2024-08-16 22:10:36 +02:00
Matti Nannt 3788293bc0 chore: npm dependency and version upgrades before release (#3014) 2024-08-15 21:18:05 +02:00
Matti Nannt 89a2e26f25 fix: remove failing prisma migration (#3015) 2024-08-15 16:42:43 +02:00
Piyush Gupta 2c453bd491 fix: Filters do not apply to summary impressions (#2986)
Co-authored-by: Johannes <johannes@formbricks.com>
Co-authored-by: Matthias Nannt <mail@matthiasnannt.com>
2024-08-15 14:02:34 +00:00
Matti Nannt 0aebf234f9 fix: styles get overwritten by loading indicator changes (#3012) 2024-08-15 14:09:29 +02:00
Dhruwang Jariwala 3e25ef4b5a fix: wait for background to load in survey loading indicator (#3011) 2024-08-15 06:53:47 +00:00
Dhruwang Jariwala 3dc3edb83e fix: progress bar on welcome card (#3006) 2024-08-15 06:51:41 +00:00
Piyush Gupta 4ebe144191 feat: Add auto-refresh to the analysis view (#3007)
Co-authored-by: Matti Nannt <mail@matthiasnannt.com>
2024-08-15 06:51:26 +00:00
Dhruwang Jariwala 49cd06a9b4 feat: Loading indicator for link surveys (#2982)
Co-authored-by: Johannes <72809645+jobenjada@users.noreply.github.com>
Co-authored-by: Johannes <johannes@formbricks.com>
2024-08-14 16:34:02 +00:00
Anshuman Pandey e0208da0ac fix: sync call in e2e tests (#3010) 2024-08-14 13:06:07 +00:00
Anshuman Pandey 1f41770060 fix: catching errors in integrations (#2989) 2024-08-13 10:26:35 +00:00
Dhruwang Jariwala 3eff06281c fix: surveyEditor issues (#2997) 2024-08-13 10:23:47 +00:00
Matti Nannt 5848dfb4f3 fix: next-config env variables are not unique (#3003) 2024-08-12 17:42:35 +02:00
Piyush Gupta 89f27adce5 fix: adds default weekly summary notification value in signin (#2993)
Co-authored-by: Matti Nannt <mail@matthiasnannt.com>
2024-08-12 14:59:53 +00:00
Dhruwang Jariwala bbab7fa672 fix: linting warnings in email package (#2998) 2024-08-12 14:45:50 +00:00
Yuhang fb149796fa docs: add deploy to zeabur button in readme (#3000) 2024-08-12 16:13:10 +02:00
Piyush Gupta 3939013415 fix: setup shell script, removes input case sensitivity (#3002) 2024-08-12 16:09:37 +02:00
Anantesh G 7fe18e99c3 fix: Open external links in a new tab #2994 (#2995) 2024-08-10 11:08:27 +02:00
Anshuman Pandey 6ddfd29be8 fix: embed survey height (#2990) 2024-08-09 11:26:58 +02:00
Piyush Gupta 46efad94db fix: rating question email embed alignment (#2988) 2024-08-09 10:30:47 +02:00
Johannes b7ea073204 fix: sort features, update wording (#2985) 2024-08-09 08:26:14 +02:00
Matti Nannt 0d9c90ceeb fix: docker image permission issue (#2987)
Co-authored-by: pandeymangg <anshuman.pandey9999@gmail.com>
2024-08-08 17:55:25 +02:00
Johannes 3ba23e1787 fix: fix typo in self-hosting license page (#2980) 2024-08-08 09:46:02 +02:00
Matthias Nannt e365718556 Merge branch 'main' of github.com:formbricks/formbricks 2024-08-07 23:44:27 +02:00
Matthias Nannt d65a49a7e7 fix: data migration type error 2024-08-07 23:40:11 +02:00
Matti Nannt 7960aaf5d5 fix: mls labels not set properly on question create (#2979) 2024-08-07 23:21:59 +02:00
Matti Nannt 32b3a7d1d0 fix: add data-migration fixing invalid jump end jump destination (#2972) 2024-08-07 16:57:13 +02:00
Piyush Gupta 53fb976fb6 feat: adds tls1.2 and 1.3 support, and HSTS config (#2897)
Co-authored-by: Matthias Nannt <mail@matthiasnannt.com>
2024-08-07 16:52:14 +02:00
Johannes fffe71aa7e fix: add products with channel null to list (#2976) 2024-08-07 11:45:48 +00:00
Anshuman Pandey 75b0a3a407 fix: rename surveys to surveyTriggers (#2975) 2024-08-07 10:36:37 +00:00
Adam Gay 158689672a fix: Entra ID / Azure AD docs formatting and images (#2973)
Co-authored-by: Matthias Nannt <mail@matthiasnannt.com>
2024-08-07 12:46:36 +02:00
Dhruwang Jariwala 24e43dd1a2 fix: filtering issue (#2971) 2024-08-07 09:15:18 +00:00
Matthias Nannt b34366aaf7 chore: increase formbricks version to 2.4.1 2024-08-06 14:46:20 +02:00
Matti Nannt 2856c8d125 fix: survey validation failing with custom questionId logic (#2969) 2024-08-06 11:18:01 +02:00
Adam Gay 4ac1e1d798 docs: update and improve Microsoft Entra ID / Azure AD app registration steps (#2965)
Co-authored-by: Matti Nannt <mail@matthiasnannt.com>
2024-08-06 08:44:15 +00:00
Anshuman Pandey b15d23035c fix: segment delete fix (#2967) 2024-08-06 08:38:05 +00:00
Johannes 8b2ea63ccb chore: tweaking product toggle (#2958) 2024-08-06 08:30:29 +00:00
Matti Nannt b0c65c76e6 chore: add environment created posthog event (#2966) 2024-08-05 20:51:25 +02:00
Smriti Doneria c65c1af023 feat: add ability to copy surveys between different environments of different products (#2832)
Co-authored-by: pandeymangg <anshuman.pandey9999@gmail.com>
2024-08-05 15:04:58 +00:00
Matti Nannt f10bd9c0d8 chore: improve posthog tracking with survey created event (#2964) 2024-08-05 17:08:36 +02:00
mdm317 a6ac78294b fix: demo app responsive add favicon (#2960)
Co-authored-by: Matti Nannt <mail@matthiasnannt.com>
2024-08-05 15:36:33 +02:00
Jonas Höbenreich 04c9ead19d fix: fix typos (#2963) 2024-08-05 12:47:25 +00:00
Dhruwang Jariwala 3c3798ee98 feat: Apply filters from question summary (#2940)
Co-authored-by: Johannes <72809645+jobenjada@users.noreply.github.com>
Co-authored-by: Johannes <johannes@formbricks.com>
2024-08-05 09:24:01 +00:00
Matthias Nannt 8df722ab02 fix: data migration docker image doesnt always get latest tag 2024-08-02 22:05:11 +02:00
Matthias Nannt dbe5ca60cd fix: endings migration type error 2024-08-02 21:51:42 +02:00
Ratnadeep ec454dc981 fix: Images are sorted wrong in dashboard #2943 (#2957)
Co-authored-by: Matti Nannt <mail@matthiasnannt.com>
2024-08-02 21:08:32 +02:00
Matti Nannt 0988f2145c chore: prepare 2.4.0 release (#2959) 2024-08-02 20:32:21 +02:00
Sachin Mittal 3416c26bdc fix: color coding in NPS misplaces text (#2953)
Co-authored-by: Johannes <72809645+jobenjada@users.noreply.github.com>
2024-08-02 12:19:38 +02:00
Johannes f1a50b7db3 fix: increase image size for embed mode (#2954) 2024-08-02 12:19:15 +02:00
Dhruwang Jariwala f2fa13ba01 chore: Simplify email verification (#2926)
Co-authored-by: Matthias Nannt <mail@matthiasnannt.com>
2024-08-02 09:44:38 +00:00
Sachin Mittal 93fc3bf39e fix: identation for docker-compose.yml (#2949) 2024-08-02 09:31:47 +00:00
Anshuman Pandey 695180a2ef fix: survey create input schema validations (#2939) 2024-08-02 08:57:27 +00:00
use-tusk[bot] aeed138294 feat: Add Modal component story for Storybook (#2952)
Co-authored-by: use-tusk[bot] <144006087+use-tusk[bot]@users.noreply.github.com>
Co-authored-by: Matthias Nannt <mail@matthiasnannt.com>
2024-08-02 07:46:02 +00:00
Dhruwang Jariwala 5d347096cf feat: multiple end screens (#2863)
Co-authored-by: Matti Nannt <mail@matthiasnannt.com>
Co-authored-by: Johannes <johannes@formbricks.com>
Co-authored-by: Johannes <72809645+jobenjada@users.noreply.github.com>
2024-08-02 04:48:41 +00:00
Matti Nannt 75ade97805 chore: remove client APIs older than v1.6.5 (#2945) 2024-08-01 17:31:01 +02:00
Dhruwang Jariwala 864d4b3cb7 fix: calHost UX and validation in cal question (#2944) 2024-08-01 14:27:14 +00:00
Anshuman Pandey c1492e3429 fix: session token size (#2941)
Co-authored-by: Matthias Nannt <mail@matthiasnannt.com>
2024-08-01 12:27:54 +00:00
Matti Nannt ae266810c2 chore: improve button a11y with storybook (#2938) 2024-08-01 14:15:03 +02:00
Dhruwang Jariwala a1d3fe5e06 feat: Extended logic jumps for picture selection question (#2932)
Co-authored-by: Johannes <72809645+jobenjada@users.noreply.github.com>
2024-08-01 03:32:00 +00:00
Johannes 98886ff074 chore: Add create product link in survey editor (#2937) 2024-07-31 14:23:25 +00:00
Anshuman Pandey b8b7a374a6 fix: action update cache (#2936) 2024-07-31 11:18:33 +00:00
Dhruwang Jariwala 9d3647f38a chore: migrate db package to new linting rules (#2887) 2024-07-31 11:11:09 +00:00
Matthias Nannt 5332eec7aa fix: chromatic storybook action 2024-07-31 12:50:39 +02:00
Matthias Nannt 6bc933532e chore: add chromatic github action to publish storybook 2024-07-31 12:48:01 +02:00
Saurabh Chaddha 55053cd2b8 feat: add LoadingSpinner component to storybook component (#2913)
Co-authored-by: Matthias Nannt <mail@matthiasnannt.com>
2024-07-31 10:29:23 +00:00
Anshuman Pandey 2e4317a80c fix: surveys with no segment fixes (#2903)
Co-authored-by: Dhruwang Jariwala <67850763+Dhruwang@users.noreply.github.com>
2024-07-31 10:04:56 +00:00
Piyush Gupta 5ef61f4621 fix: Dissmissed responses are (but should not be) counted in the summary graph (#2935) 2024-07-31 10:04:11 +00:00
Matthias Nannt 4b47a5030a fix: pageHeader story references deprecated button 2024-07-31 12:08:48 +02:00
Vaishak K 27c2dcbee4 fix: close tag input immediately on keydown and add tag button click (#2911) 2024-07-31 11:16:16 +02:00
Vaishak K e17ab16878 fix: add delete confirmation modal before deleting tags (#2912)
Co-authored-by: Dhruwang <dhruwangjariwala18@gmail.com>
2024-07-31 11:15:44 +02:00
Matti Nannt 8c9fff36c8 chore: send setup completed event to posthog (#2933) 2024-07-31 10:36:25 +02:00
TUSHAR JINDAL c37ea3fbb6 feat: add storybook for PageHeader component (#2906)
Co-authored-by: Piyush Gupta <piyushguptaa2z123@gmail.com>
2024-07-31 08:13:45 +00:00
TUSHAR JINDAL 6d6401d1da feat: add storybook for Label component (#2907)
Co-authored-by: Piyush Gupta <piyushguptaa2z123@gmail.com>
2024-07-31 08:01:50 +00:00
Smriti Doneria 57f90c8b3b feat: add badge component to Storybook (#2899)
Co-authored-by: Matthias Nannt <mail@matthiasnannt.com>
2024-07-31 07:59:25 +00:00
Matti Nannt 53883d290a chore: remove v2 button from ui (#2930) 2024-07-31 09:58:00 +02:00
TUSHAR JINDAL ae0408a6f7 feat: add storybook for card component (#2900)
Co-authored-by: Piyush Gupta <piyushguptaa2z123@gmail.com>
2024-07-30 14:23:51 +00:00
TUSHAR JINDAL 742abc9032 feat: add storybook for Input component (#2904)
Co-authored-by: Piyush Gupta <piyushguptaa2z123@gmail.com>
2024-07-30 14:18:27 +00:00
Matti Nannt 5652965853 fix: remove deprecated actions from segments all list (#2929) 2024-07-30 15:21:14 +02:00
Rakshit Bhardwaj da0c811846 style: Use AdvancedOptionToggle in schedule a call form (#2925)
Signed-off-by: Rakshit Bhardwaj <157364563+Acksout@users.noreply.github.com>
Co-authored-by: Johannes <johannes@formbricks.com>
2024-07-30 11:02:30 +00:00
Johannes d60dd5f281 chore: Streamline Onboarding (#2928) 2024-07-30 10:47:31 +00:00
Dhruwang Jariwala ec70c6c613 fix: recall from hidden fields of in-app surveys (#2917) 2024-07-29 10:30:13 +00:00
Matthias Nannt aa40b916ab chore: remove legacy unlimited prices 2024-07-29 10:19:32 +02:00
fetsorn fe5242174b fix: typo in onboarding (#2914)
Co-authored-by: Matti Nannt <mail@matthiasnannt.com>
2024-07-27 09:23:58 +00:00
Laurens Nienhaus 026cc29e1f docs: unify CRON_SECRET descriptions (#2915)
Co-authored-by: laurens <laurens@users.noreply.github.com>
2024-07-27 09:11:05 +00:00
Dhruwang Jariwala 6055baa0db fix: recall in welcome card (#2918) 2024-07-27 09:06:17 +00:00
Matthias Nannt 469e6da29f fix: typo in test mode banner 2024-07-24 08:14:55 +02:00
Matthias Nannt 6a7fb2d33d chore: bump Formbricks version to 2.3.2 2024-07-17 11:53:59 +02:00
Matti Nannt 271ea89c8d fix: reintroduce NEXTAUTH_URL to fix logout redirect (#2905) 2024-07-17 11:08:10 +02:00
Dhruwang Jariwala f94d7f2b03 fix: 404 on js integration connect page (#2901) 2024-07-17 06:41:08 +00:00
Dhruwang Jariwala f084e64aed chore: add hidden field to response finished email (#2872) 2024-07-16 10:12:23 +00:00
Dhruwang Jariwala 294b817957 chore: added SMTP_REJECT_UNAUTHORIZED_TLS env variable (#2876)
Co-authored-by: Matthias Nannt <mail@matthiasnannt.com>
2024-07-16 09:31:58 +00:00
Dhruwang Jariwala ed85ed394a fix: Added type to ResetProgressButton (#2889) 2024-07-16 06:52:26 +00:00
Dhruwang Jariwala aa495312db fix: notion integration (#2888) 2024-07-15 14:29:42 +00:00
Smriti Doneria 8ac9b23de3 fix: restart functionality (#2885)
Co-authored-by: Dhruwang <dhruwangjariwala18@gmail.com>
2024-07-15 10:33:52 +00:00
Matthias Nannt be7090b29c chore: improve error logging in pipeline 2024-07-15 12:21:06 +02:00
Matthias Nannt 1f9b31a6cd chore: remove kamal configs 2024-07-12 20:30:43 +02:00
Anshuman Pandey e83d27f07c fix: CTA button URL fix (#2881) 2024-07-12 15:22:33 +00:00
Matti Nannt 816cbd2036 chore: simplify person detail page by removing activity timeline (#2878) 2024-07-11 18:42:00 +02:00
Anshuman Pandey ec781969fa fix: survey validation thank you card (#2875)
Co-authored-by: Matthias Nannt <mail@matthiasnannt.com>
2024-07-11 15:22:37 +00:00
Matti Nannt 2fc78c9219 chore: deprecate action filtering in advanced targeting (#2877) 2024-07-11 13:57:03 +02:00
Matti Nannt 7b2470cce6 chore: only store actions on the server when enabled in environment (#2871) 2024-07-10 16:40:52 +02:00
Anshuman Pandey 31c3fac7f5 fix: js package linting (#2868)
Co-authored-by: Matthias Nannt <mail@matthiasnannt.com>
2024-07-10 12:28:27 +00:00
Piyush Gupta 9d5a7b7dbd feat: adds vercel style guide eslint rules to types package (#2869) 2024-07-10 09:58:49 +00:00
Piyush Gupta 614710da69 chore: update local setup links in README.md (#2866)
Co-authored-by: Matti Nannt <mail@matthiasnannt.com>
2024-07-10 12:09:22 +02:00
Dhruwang Jariwala f233066e81 fix: airtable UX (#2865) 2024-07-10 09:53:22 +00:00
Matti Nannt 32ae38ebb2 chore: add react cache to improve render performance (#2867) 2024-07-10 11:43:59 +02:00
Matthias Nannt 1459229dde chore: remove NEXTAUTH_URL from docs 2024-07-09 18:35:24 +02:00
Matthias Nannt b8cd602d7e fix: Add CRON_SECRET to Dockerfile to fix build errors 2024-07-09 18:26:47 +02:00
Anshuman Pandey 647a05f469 fix: survey editor validation (#2749)
Co-authored-by: Matti Nannt <mail@matthiasnannt.com>
Co-authored-by: Johannes <72809645+jobenjada@users.noreply.github.com>
Co-authored-by: Johannes <johannes@formbricks.com>
2024-07-09 14:33:09 +00:00
Anshuman Pandey 7cf9885125 fix: js pkg types (#2821)
Co-authored-by: Matthias Nannt <mail@matthiasnannt.com>
2024-07-09 13:53:16 +00:00
Matti Nannt da72afcd5f chore: update ui npm dependencies (#2862) 2024-07-09 15:39:19 +02:00
Anshuman Pandey 9f0cdb7ac1 fix: build-web github action (#2830) 2024-07-09 13:02:38 +00:00
Piyush Gupta 482a85565f feat: adds vercel style guide in API package (#2861) 2024-07-09 12:39:56 +00:00
Piyush Gupta c563d781d3 fix: Update Access Rights for Product Creation (#2859) 2024-07-09 12:37:08 +00:00
Anshuman Pandey 12a6da6558 fix: adds content type options header (#2824)
Co-authored-by: Matti Nannt <mail@matthiasnannt.com>
2024-07-09 08:28:10 +00:00
Piyush Gupta 54accbbeff feat: Improve auth & permission system (#2845) 2024-07-09 08:08:20 +00:00
Dhruwang Jariwala 6d0bd4a6ed chore: make cron secret required (#2843) 2024-07-09 05:42:40 +00:00
Piyush Gupta 73d403d2f1 fix: Webhook testing is throwing not useful error (#2846)
Co-authored-by: Dhruwang Jariwala <67850763+Dhruwang@users.noreply.github.com>
Co-authored-by: Dhruwang <dhruwangjariwala18@gmail.com>
2024-07-09 05:27:20 +00:00
Johannes b8fa581665 feat: add prolific info and docs page (#2853) 2024-07-08 09:51:24 +00:00
Dhruwang Jariwala 71f661daa4 docs: updated make.com documentation (#2835) 2024-07-08 08:22:55 +00:00
Dhruwang Jariwala 3927867c81 chore: Remove NEXTAUTH_URL (#2840) 2024-07-08 08:16:41 +00:00
Piyush Gupta 60256533e3 fix: run lint on complete project before commit (#2802) 2024-07-08 07:17:47 +00:00
Dhruwang Jariwala 6a0cabf249 fix: invite functionality for providers (#2852) 2024-07-06 09:08:12 +00:00
Dhruwang Jariwala a00c696c1a fix: survey card issues (#2854)
Co-authored-by: Johannes <johannes@formbricks.com>
2024-07-06 04:29:17 +00:00
Anshuman Pandey 7958ef0d1f fix: pnpm github action version (#2851) 2024-07-05 07:57:58 +00:00
Dhruwang Jariwala d935cee4db fix: embed mode toggle and docs (#2841)
Co-authored-by: Piyush Gupta <piyushguptaa2z123@gmail.com>
Co-authored-by: pandeymangg <anshuman.pandey9999@gmail.com>
2024-07-03 11:20:44 +00:00
plant d565160124 fix: delay stacked card container height calculation (#2814)
Co-authored-by: Matti Nannt <mail@matthiasnannt.com>
2024-07-03 08:07:36 +00:00
Alexander Schaber b4cb27cef6 feat: add support for self-hosted cal.com instances (#2799)
Co-authored-by: Matti Nannt <mail@matthiasnannt.com>
Co-authored-by: pandeymangg <anshuman.pandey9999@gmail.com>
2024-07-03 07:31:18 +00:00
Laurens Nienhaus d7c211d98e docs: Fix documentation link (#2839) 2024-07-02 11:54:46 +00:00
Anshuman Pandey c32a358f43 fix: cache headers (#2834) 2024-07-02 06:46:26 +00:00
Anshuman Pandey 1f4b23b105 fix: surveys package tailwind (#2827)
Co-authored-by: Piyush Gupta <piyushguptaa2z123@gmail.com>
2024-07-02 06:44:15 +00:00
Anshuman Pandey 58df9c6edb fix: surveys management api input types (#2837) 2024-07-01 12:04:22 +00:00
Matti Nannt ce4578a829 fix: identify Posthog users in product onboarding (#2836) 2024-07-01 12:51:15 +02:00
Dhruwang Jariwala 1885b3ac2e fix: onboarding survey alignment (#2833) 2024-07-01 08:27:43 +00:00
Johannes 205ddc88cb fix: remove deal cloud (#2829) 2024-07-01 08:24:07 +00:00
Johannes 9da065e1ec docs: tweaking contributor docs (#2818) 2024-06-27 15:14:25 +00:00
Piyush Gupta a40846f6ed chore: improve NPSQuestion component styling (#2825) 2024-06-27 15:10:54 +00:00
Dhruwang Jariwala c3ff6fadc9 fix: spacing in delete dialog (#2823) 2024-06-27 08:53:47 +00:00
Matthias Nannt 601bd5d6e7 docs: fix wrong language code in migration guide 2024-06-26 18:29:19 +02:00
Matthias Nannt 8731f2afe5 docs: fix typo in 2.3 migration guide 2024-06-26 18:13:58 +02:00
Matthias Nannt 323df36a97 docs: fix typo in 2.3 migration guide 2024-06-26 18:13:03 +02:00
Matti Nannt bcf71b583c chore: prepare 2.3 release (#2819) 2024-06-26 18:11:30 +02:00
Anshuman Pandey 9268407429 fix: ee license info banner (#2790)
Co-authored-by: Piyush Gupta <piyushguptaa2z123@gmail.com>
Co-authored-by: Matti Nannt <mail@matthiasnannt.com>
2024-06-26 16:00:50 +00:00
Matti Nannt 1ff87d27ca chore: move redis cache over to redis-strings from redis-stack (#2817) 2024-06-26 13:38:17 +02:00
Piyush Gupta d6e4b7700f fix: UX improvement (#2791)
Co-authored-by: Johannes <72809645+jobenjada@users.noreply.github.com>
Co-authored-by: Dhruwang <dhruwangjariwala18@gmail.com>
2024-06-26 10:29:09 +00:00
Sargam 81a4da6199 fix: initial fix for mail logger (#2798)
Co-authored-by: Matti Nannt <mail@matthiasnannt.com>
2024-06-26 10:07:37 +00:00
Anshuman Pandey b8efc442e3 fix: e2e tests (#2806)
Co-authored-by: Matti Nannt <mail@matthiasnannt.com>
2024-06-26 10:05:01 +00:00
Piyush Gupta e00bdf2f79 feat: Add colors to rating (#2795)
Co-authored-by: Matti Nannt <mail@matthiasnannt.com>
Co-authored-by: Johannes <72809645+jobenjada@users.noreply.github.com>
2024-06-26 08:08:23 +00:00
Dhruwang Jariwala cea5716c48 fix: onboarding survey link (#2815) 2024-06-26 06:36:55 +00:00
yonathan suarez fc150f8860 chore: add the CUSTOM_CACHE_DISABLED variable to the .env.example and documentation (#2746)
Co-authored-by: Matthias Nannt <mail@matthiasnannt.com>
2024-06-25 15:13:14 +00:00
Piyush Gupta 7fdf8a63c8 fix: restricted svg upload in profile image and brand logo (#2813) 2024-06-25 14:56:34 +00:00
Laurens Nienhaus 374f17df63 feat: add column with person.id in CSV to allow backlinking to survey/person URL (#2807)
Co-authored-by: laurens <laurens@users.noreply.github.com>
Co-authored-by: Piyush Gupta <piyushguptaa2z123@gmail.com>
2024-06-25 14:51:13 +00:00
Dhruwang Jariwala d27da8927e chore: Chinese to iso languages (#2794)
Co-authored-by: Piyush Gupta <piyushguptaa2z123@gmail.com>
2024-06-25 14:49:34 +00:00
Johannes 785afd4bda fix: typo (#2812) 2024-06-25 14:18:22 +00:00
Dhruwang Jariwala e28c226308 fix: question form card width issue (#2811) 2024-06-25 12:08:20 +00:00
plant 4170e20e21 docs: fix gitpod url (#2810)
Co-authored-by: Matti Nannt <mail@matthiasnannt.com>
2024-06-25 12:02:40 +00:00
Matthias Nannt af548aa624 docs: fix notion links not working on contributing page 2024-06-25 14:01:11 +02:00
Matthias Nannt 13d68bbac0 chore: remove run-in-postman in docs as this is only possible for team members 2024-06-25 13:51:08 +02:00
Matti Nannt fabea3c813 fix: update cache handler based on official example (#2805)
Co-authored-by: Piyush Gupta <piyushguptaa2z123@gmail.com>
2024-06-25 08:09:11 +02:00
Piyush Gupta db80e7f7cb fix: removes poweredByHeader (#2801) 2024-06-24 11:19:18 +00:00
Dhruwang Jariwala 1ebddbd1de fix: missing branding settings (#2800) 2024-06-24 07:08:15 +00:00
Piyush Gupta 6c6061a123 fix: remove attributes from loading skeleton (#2796) 2024-06-22 05:22:54 +00:00
Matthias Nannt 0bf38aed9f docs: Emphasize the need to open port 80+443 for the one click setup 2024-06-21 14:38:10 +02:00
Anshuman Pandey 8aedbde36a fix: 2.2 data migration for self-hosters (#2792) 2024-06-20 14:43:26 +02:00
Piyush Gupta 17279cb3fe fix: null channel survey type bug (#2788) 2024-06-20 12:55:06 +02:00
Piyush Gupta 1b4823421f fix: google translate issue (#2787) 2024-06-20 10:32:36 +00:00
Piyush Gupta deef604325 feat: adds functionality limit based on channel (#2772)
Co-authored-by: Matthias Nannt <mail@matthiasnannt.com>
Co-authored-by: Johannes <johannes@formbricks.com>
2024-06-20 09:16:59 +02:00
Johannes 22e44b47e6 fix: orange css for offer price (#2786) 2024-06-20 06:39:29 +00:00
Johannes 08052b13cf chore: add launch and pricing ui tweaks (#2782)
Co-authored-by: Matti Nannt <mail@matthiasnannt.com>
2024-06-20 05:54:23 +00:00
Matti Nannt 5e7fe96ef6 chore: prepare 2.2 launch (#2783) 2024-06-19 17:16:57 +02:00
Piyush Gupta 83ff98cd3a fix: Ability to increase file size limit (#2734)
Co-authored-by: Dhruwang Jariwala <67850763+Dhruwang@users.noreply.github.com>
2024-06-19 14:49:16 +00:00
Pranoy Roy eb54230445 feat: added in-page section navigation for docs (#2720)
Co-authored-by: Piyush Gupta <piyushguptaa2z123@gmail.com>
Co-authored-by: Johannes <72809645+jobenjada@users.noreply.github.com>
Co-authored-by: Johannes <johannes@formbricks.com>
Co-authored-by: Matti Nannt <mail@matthiasnannt.com>
2024-06-19 14:23:51 +00:00
Dhruwang Jariwala 59d57c50eb fix: editor text color (#2781) 2024-06-19 12:31:46 +00:00
Dhruwang Jariwala f358254e3c feat: Product onboarding with XM approach (#2770)
Co-authored-by: Johannes <72809645+jobenjada@users.noreply.github.com>
Co-authored-by: Johannes <johannes@formbricks.com>
Co-authored-by: Matthias Nannt <mail@matthiasnannt.com>
2024-06-19 12:29:05 +00:00
Dhruwang Jariwala 3ab8092a82 fix: Loading indicator for question card images (#2778)
Co-authored-by: Piyush Gupta <piyushguptaa2z123@gmail.com>
2024-06-19 12:04:27 +00:00
Anshuman Pandey 3b08b718ff feat: unlimited billing pages (#2777)
Co-authored-by: Matti Nannt <mail@matthiasnannt.com>
2024-06-19 08:44:45 +00:00
Dhruwang Jariwala a473719eee feat: XM template filters (#2745)
Co-authored-by: Johannes <72809645+jobenjada@users.noreply.github.com>
Co-authored-by: Johannes <johannes@formbricks.com>
Co-authored-by: Matti Nannt <mail@matthiasnannt.com>
2024-06-19 08:19:45 +00:00
Dhruwang Jariwala cd40e655fb fix: progress bar issue (#2771)
Co-authored-by: Johannes <72809645+jobenjada@users.noreply.github.com>
2024-06-19 08:04:11 +00:00
Dhruwang Jariwala 5d468b4420 fix: Adjust billing permissions (#2775)
Co-authored-by: Matti Nannt <mail@matthiasnannt.com>
2024-06-19 07:23:28 +00:00
Piyush Gupta 96806c613f fix: fixes notification subscription based on user membership (#2779) 2024-06-19 07:22:05 +00:00
Piyush Gupta 6f2a4b2b03 feat: Full RTL support for Multi-Language (#2727)
Co-authored-by: Johannes <72809645+jobenjada@users.noreply.github.com>
Co-authored-by: Johannes <johannes@formbricks.com>
Co-authored-by: pandeymangg <anshuman.pandey9999@gmail.com>
2024-06-19 07:10:28 +00:00
Piyush Gupta d33efa0274 fix: e2e tests (#2780) 2024-06-19 06:34:16 +00:00
Matthias Nannt 9b35ebc114 fix: re-activate weekly summary cron job on Github Actions 2024-06-18 10:31:30 +02:00
Matthias Nannt dba62157bf fix: temporary simplify getMonthlyActiveOrganizationPeopleCount to solve performance issues 2024-06-17 17:22:08 +02:00
Matthias Nannt 556184f442 fix: remove example survey creation to avoid having multiple example surveys in one environment 2024-06-17 16:48:35 +02:00
Matthias Nannt c33532f952 chore: improve performance of getMonthlyActiveOrganizationPeopleCount 2024-06-17 15:26:49 +02:00
Piyush Gupta 8f61ceb4ea feat: adds separate status indicator for both app and website (#2747)
Co-authored-by: Johannes <johannes@formbricks.com>
2024-06-17 11:07:52 +00:00
Matthias Nannt e19dcdc0c4 chore: improve performance of getMonthlyActiveOrganizationPeopleCount call 2024-06-17 12:07:33 +02:00
Piyush Gupta 65f977786d feat: add file size limit error message for FileUploadQuestionForm (#2769)
Co-authored-by: Johannes <72809645+jobenjada@users.noreply.github.com>
2024-06-17 06:37:57 +00:00
Matthias Nannt 95c13fd9a9 chore: deprecate js/sync endpoint 2024-06-15 10:01:06 +02:00
Matthias Nannt f8adf28df8 chore: refactor getMonthlyActiveOrganizationPeopleCount to optimize performance 2024-06-14 23:08:12 +02:00
Matthias Nannt 9d468379f2 chore: reintroduce getMonthlyActiveOrganizationPeopleCount 2024-06-14 22:27:26 +02:00
Matthias Nannt 8071e82390 fix: reintroduce getMonthlyOrganizationResponseCount 2024-06-14 22:05:57 +02:00
Matthias Nannt 3ce775ec05 fix: performance issues on Formbricks Cloud due to updated billing checks (hotfix) 2024-06-14 21:18:39 +02:00
Anshuman Pandey 1223a30127 fix: wip (#2774) 2024-06-14 17:32:28 +02:00
Anshuman Pandey f3906cab55 fix: getPersonCount (#2773) 2024-06-14 16:45:08 +02:00
Shubham Palriwala d33304e3ad feat: pricing & payments v2 for formbricks cloud (#2648)
Co-authored-by: pandeymangg <anshuman.pandey9999@gmail.com>
Co-authored-by: Matthias Nannt <mail@matthiasnannt.com>
2024-06-14 13:17:33 +00:00
Piyush Gupta ebed950392 fix: product creation bug (#2768) 2024-06-14 05:12:48 +00:00
Piyush Gupta 4e6ab1c2bb feat: adds product config (#2760)
Co-authored-by: Matthias Nannt <mail@matthiasnannt.com>
2024-06-13 12:51:02 +00:00
Dhruwang Jariwala 543d85eb28 feat: Hidden fields and metadata for integrations (#2752)
Co-authored-by: Johannes <72809645+jobenjada@users.noreply.github.com>
2024-06-13 11:14:43 +00:00
Matti Nannt afe01a61ae fix: remove unused telemetry to fix build errors (#2761) 2024-06-13 08:42:14 +02:00
Johannes b4c86835ed fix: survey padding and add report survey (#2763) 2024-06-12 15:58:19 +00:00
Dhruwang Jariwala ab80bc1bf2 feat: language switch (#2692)
Co-authored-by: Johannes <johannes@formbricks.com>
Co-authored-by: Matti Nannt <mail@matthiasnannt.com>
2024-06-12 14:10:22 +00:00
Matti Nannt 5e5a9fac00 chore: rename responses to completed in stats card (#2759) 2024-06-12 15:20:59 +02:00
Dhruwang Jariwala 09b6805886 fix: recall from hidden fields (#2758) 2024-06-12 11:26:17 +00:00
Matti Nannt 33822350fd fix: add missing dependency in ee package (#2757) 2024-06-11 21:41:45 +02:00
Matti Nannt 8c7b5891a2 chore: prepare 2.1 release (#2753) 2024-06-11 17:18:27 +02:00
Piyush Gupta 864b3a34e9 fix: tab toggle component structure (#2755) 2024-06-11 13:19:05 +00:00
Dhruwang Jariwala a382a18d44 fix: responses publish (#2756) 2024-06-11 13:10:56 +00:00
Piyush Gupta 70e77247f6 fix: email url encoding in invite link (#2751) 2024-06-11 09:48:20 +00:00
Piyush Gupta 915fe00434 fix: vercel build error and app reset method (#2750) 2024-06-11 07:57:46 +00:00
Piyush Gupta 2e64b0d54f feat: Revamp No-Code Action Form (#2688)
Co-authored-by: pandeymangg <anshuman.pandey9999@gmail.com>
Co-authored-by: Matthias Nannt <mail@matthiasnannt.com>
2024-06-10 20:29:12 +00:00
Dhruwang Jariwala ed4b885935 feat: Embed mode for link surveys (#2710)
Co-authored-by: Matthias Nannt <mail@matthiasnannt.com>
2024-06-10 19:26:52 +00:00
Dhruwang Jariwala 5bf5825f30 feat: Onboarding for self hosting (#2722)
Co-authored-by: pandeymangg <anshuman.pandey9999@gmail.com>
Co-authored-by: Matthias Nannt <mail@matthiasnannt.com>
2024-06-10 17:56:02 +00:00
Dhruwang Jariwala 9888d128a2 fix: UX improvement for logic jump settings (#2748) 2024-06-10 15:49:53 +00:00
Matti Nannt a143e9d1a3 fix: issues with docker build process (#2744) 2024-06-10 17:52:49 +02:00
Dhruwang Jariwala 4878e8e43a chore: Remove colorSelector component (#2739) 2024-06-10 07:17:40 +00:00
Matthias Nannt b989272bce fix: docker build error due to turborepo pruning 2024-06-09 13:21:38 +02:00
Piyush Gupta df927555e0 feat: adds average rating to rating question (#2735) 2024-06-07 13:31:01 +00:00
Matthias Nannt 5e94d0b4af chore: move comment in StackedCardsContainer to the top 2024-06-07 15:39:17 +02:00
Matti Nannt c73d4e82b5 chore: fix eslint issues in ee & email packages (#2742) 2024-06-07 15:05:46 +02:00
Matti Nannt a269da4e1c chore: upgrade turbo to version 2 (#2738) 2024-06-07 07:59:44 +02:00
Dhruwang Jariwala b49ca8087a fix: modified IS_SMTP_CONFIGURED to only check for port and host (#2740) 2024-06-06 15:04:12 +00:00
Matti Nannt 7649095c03 fix: ee server not reachable behind a proxy (#2741) 2024-06-06 16:49:35 +02:00
Ostap Chervak a8223d2f3c feat: recontactSessions new option to remind about survey for some time (#2443)
Co-authored-by: pandeymangg <anshuman.pandey9999@gmail.com>
Co-authored-by: Matti Nannt <mail@matthiasnannt.com>
2024-06-06 12:53:46 +00:00
Anshuman Pandey 53aef9ce0b fix: js package resolution (#2737)
Co-authored-by: Matthias Nannt <mail@matthiasnannt.com>
2024-06-06 09:26:57 +00:00
Aaryansh Bhardwaj bcceab4858 fix: fixed testimonial image overflowing from it's container (#2731) 2024-06-06 09:04:02 +00:00
Piyush Gupta ac4064503a feat: adds alert component to storybook (#2736)
Co-authored-by: Matthias Nannt <mail@matthiasnannt.com>
2024-06-06 09:01:19 +00:00
Manish Singh Bisht d9b115db37 feat: Replace 'Show survey to % of users' slider (#2719)
Co-authored-by: Piyush Gupta <piyushguptaa2z123@gmail.com>
2024-06-06 05:10:23 +00:00
Hicham El Bouaaichi a61f294eea fix: Deprecated docker-compose command (#2732) 2024-06-05 13:07:38 +00:00
Dhruwang Jariwala 7b4db30efd fix: Slack integration pagination issue (#2733) 2024-06-05 10:34:03 +00:00
Matti Nannt c8aece8003 fix: storybook app (#2729)
Co-authored-by: Piyush Gupta <piyushguptaa2z123@gmail.com>
2024-06-05 10:06:20 +00:00
Dhruwang Jariwala ad8d473a2d fix: Autoclose progress bar showing on all cards (#2701)
Co-authored-by: Matti Nannt <mail@matthiasnannt.com>
2024-06-05 08:36:39 +00:00
Piyush Gupta 55db14e758 fix: Internal Server Error with survey duplication (#2728) 2024-06-04 15:54:38 +00:00
Piyush Gupta bbfdba7615 feat: Add hiddenFields to app & website surveys (#2628)
Co-authored-by: pandeymangg <anshuman.pandey9999@gmail.com>
2024-06-04 11:19:47 +00:00
Anshuman Pandey 681c559c79 fix: targeting ui dir structure (#2708)
Co-authored-by: Dhruwang <dhruwangjariwala18@gmail.com>
2024-06-04 04:56:38 +00:00
Anshuman Pandey 4e39f45446 fix: settings forms (#2700)
Co-authored-by: Matti Nannt <mail@matthiasnannt.com>
2024-06-03 15:26:30 +00:00
Hicham El Bouaaichi 62c514acf2 feat: rework loading in Settings pages (#2650)
Co-authored-by: Piyush Gupta <piyushguptaa2z123@gmail.com>
Co-authored-by: pandeymangg <anshuman.pandey9999@gmail.com>
2024-06-03 15:10:46 +00:00
Dhruwang Jariwala 48638e8ca2 fix: added support for date, matrix, address and cal question to notion integration (#2726) 2024-06-03 15:06:50 +00:00
Dhruwang Jariwala cb44b575c2 fix: Question card fixes (#2714) 2024-06-03 14:36:57 +00:00
Matti Nannt 1565fd33f7 docs: add tutorial for custom SSL certificates (#2724) 2024-06-03 12:02:48 +02:00
Anshuman Pandey 2bf04e9818 feat: change question type (#2646)
Co-authored-by: Matthias Nannt <mail@matthiasnannt.com>
2024-06-03 08:53:12 +00:00
Piyush Gupta a5f6ecb992 docs: adds documentation table for team roles (#2709)
Co-authored-by: Matthias Nannt <mail@matthiasnannt.com>
2024-05-31 08:09:19 +00:00
Anshuman Pandey a211e64f0e fix: product styling form (#2696) 2024-05-30 12:00:14 +00:00
Piyush Gupta 9d33aa034a feat: Filter Responses by hidden field values (#2662) 2024-05-30 11:00:09 +00:00
Dhruwang Jariwala a91c9db4e0 chore: optimized survey card animation (#2707) 2024-05-30 08:43:34 +00:00
Dhruwang Jariwala 291f628415 feat: Added recall highlighting to summary header (#2672)
Co-authored-by: Matthias Nannt <mail@matthiasnannt.com>
2024-05-29 12:51:42 +00:00
Piyush Gupta d53ceaaaac docs: adds skipPrefilled docs (#2705) 2024-05-29 12:47:15 +00:00
Piyush Gupta aa981fd891 chore: Increase maxDuration for cron functions to 180 seconds (#2706) 2024-05-29 12:44:07 +00:00
kiran alex ch b50bda8488 feat: Rework the loading.tsx on PRODUCT pages (#2666)
Co-authored-by: Matti Nannt <mail@matthiasnannt.com>
2024-05-28 19:27:18 +00:00
Anshuman Pandey 0d36e11bf4 fix: tootip position single response card (#2702) 2024-05-28 18:18:36 +00:00
Matti Nannt 102cdb4589 chore: update to next 15 rc (#2690) 2024-05-28 13:23:38 +00:00
Dhruwang Jariwala 5b78487b94 feat: recall from hidden fields and attributes (#2601)
Co-authored-by: Johannes <72809645+jobenjada@users.noreply.github.com>
Co-authored-by: Johannes <johannes@formbricks.com>
Co-authored-by: pandeymangg <anshuman.pandey9999@gmail.com>
Co-authored-by: Matthias Nannt <mail@matthiasnannt.com>
2024-05-27 15:28:43 +00:00
Parth Gupta f917d2171e feat: rework the loading.tsx on Actions page (#2660)
Co-authored-by: Johannes <72809645+jobenjada@users.noreply.github.com>
Co-authored-by: Johannes <johannes@formbricks.com>
2024-05-27 07:27:32 +00:00
Piyush Gupta 295754480e chore: Rename Teams to Organizations (#2656)
Co-authored-by: Matthias Nannt <mail@matthiasnannt.com>
2024-05-27 05:41:21 +00:00
1593 changed files with 83113 additions and 49844 deletions
+1 -1
View File
@@ -22,7 +22,7 @@
// Use 'postCreateCommand' to run commands after the container is created. // Use 'postCreateCommand' to run commands after the container is created.
"postCreateCommand": "cp .env.example .env && sed -i '/^ENCRYPTION_KEY=/c\\ENCRYPTION_KEY='$(openssl rand -hex 32) .env && sed -i '/^NEXTAUTH_SECRET=/c\\NEXTAUTH_SECRET='$(openssl rand -hex 32) .env && pnpm install && pnpm db:migrate:dev", "postCreateCommand": "cp .env.example .env && sed -i '/^ENCRYPTION_KEY=/c\\ENCRYPTION_KEY='$(openssl rand -hex 32) .env && sed -i '/^NEXTAUTH_SECRET=/c\\NEXTAUTH_SECRET='$(openssl rand -hex 32) .env && pnpm install && pnpm db:migrate:dev",
"postAttachCommand": "pnpm dev --filter=web... --filter=demo...", "postAttachCommand": "pnpm dev --filter=@formbricks/web... --filter=@formbricks/demo...",
// Comment out to connect as root instead. More info: https://aka.ms/vscode-remote/containers/non-root. // Comment out to connect as root instead. More info: https://aka.ms/vscode-remote/containers/non-root.
"remoteUser": "node" "remoteUser": "node"
+2
View File
@@ -35,3 +35,5 @@ yarn-error.log*
.vscode .vscode
.github .github
**/.turbo **/.turbo
.env
+25 -26
View File
@@ -8,8 +8,8 @@
WEBAPP_URL=http://localhost:3000 WEBAPP_URL=http://localhost:3000
# Set this if you want to have a shorter link for surveys # Required for next-auth. Should be the same as WEBAPP_URL
SHORT_URL_BASE= NEXTAUTH_URL=http://localhost:3000
# Encryption keys # Encryption keys
# Please set both for now, we will change this in the future # Please set both for now, we will change this in the future
@@ -17,24 +17,20 @@ SHORT_URL_BASE=
# You can use: `openssl rand -hex 32` to generate one # You can use: `openssl rand -hex 32` to generate one
ENCRYPTION_KEY= ENCRYPTION_KEY=
# @see: https://next-auth.js.org/configuration/options#nextauth_secret
# You can use: `openssl rand -hex 32` to generate a secure one
NEXTAUTH_SECRET=
# API Secret for running cron jobs. (mandatory)
# You can use: `openssl rand -hex 32` to generate a secure one
CRON_SECRET=
############## ##############
# DATABASE # # DATABASE #
############## ##############
DATABASE_URL='postgresql://postgres:postgres@localhost:5432/formbricks?schema=public' DATABASE_URL='postgresql://postgres:postgres@localhost:5432/formbricks?schema=public'
###############
# NEXT AUTH #
###############
# @see: https://next-auth.js.org/configuration/options#nextauth_secret
# You can use: `openssl rand -hex 32` to generate one
NEXTAUTH_SECRET=RANDOM_STRING
# Set this to your public-facing URL, e.g., https://example.com
# You do not need the NEXTAUTH_URL environment variable in Vercel.
NEXTAUTH_URL=http://localhost:3000
################ ################
# MAIL SETUP # # MAIL SETUP #
################ ################
@@ -50,6 +46,9 @@ SMTP_SECURE_ENABLED=0
SMTP_USER=smtpUser SMTP_USER=smtpUser
SMTP_PASSWORD=smtpPassword SMTP_PASSWORD=smtpPassword
# If set to 0, the server will accept connections without requiring authorization from the list of supplied CAs (default is 1).
# SMTP_REJECT_UNAUTHORIZED_TLS=0
######################################################################## ########################################################################
# ------------------------------ OPTIONAL -----------------------------# # ------------------------------ OPTIONAL -----------------------------#
######################################################################## ########################################################################
@@ -71,6 +70,8 @@ S3_BUCKET_NAME=
# Configure a third party S3 compatible storage service endpoint like StorJ leave empty if you use Amazon S3 # Configure a third party S3 compatible storage service endpoint like StorJ leave empty if you use Amazon S3
# e.g., https://gateway.storjshare.io # e.g., https://gateway.storjshare.io
S3_ENDPOINT_URL= S3_ENDPOINT_URL=
# Force path style for S3 compatible storage (0 for disabled, 1 for enabled)
S3_FORCE_PATH_STYLE=0
##################### #####################
# Disable Features # # Disable Features #
@@ -83,12 +84,13 @@ EMAIL_VERIFICATION_DISABLED=1
PASSWORD_RESET_DISABLED=1 PASSWORD_RESET_DISABLED=1
# Signup. Disable the ability for new users to create an account. # Signup. Disable the ability for new users to create an account.
# Note: This variable is only available to the SaaS setup of Formbricks Cloud. Signup is disable by default for self-hosting.
# SIGNUP_DISABLED=1 # SIGNUP_DISABLED=1
# Email login. Disable the ability for users to login with email. # Email login. Disable the ability for users to login with email.
# EMAIL_AUTH_DISABLED=1 # EMAIL_AUTH_DISABLED=1
# Team Invite. Disable the ability for invited users to create an account. # Organization Invite. Disable the ability for invited users to create an account.
# INVITE_DISABLED=1 # INVITE_DISABLED=1
########## ##########
@@ -120,9 +122,6 @@ AZUREAD_TENANT_ID=
# OIDC_DISPLAY_NAME= # OIDC_DISPLAY_NAME=
# OIDC_SIGNING_ALGORITHM= # OIDC_SIGNING_ALGORITHM=
# Cron Secret
CRON_SECRET=
# Configure this when you want to ship JS & CSS files from a complete URL instead of the current domain # Configure this when you want to ship JS & CSS files from a complete URL instead of the current domain
# ASSET_PREFIX_URL= # ASSET_PREFIX_URL=
@@ -154,14 +153,11 @@ SLACK_CLIENT_SECRET=
# Enterprise License Key # Enterprise License Key
ENTERPRISE_LICENSE_KEY= ENTERPRISE_LICENSE_KEY=
# Automatically assign new users to a specific team and role within that team # Automatically assign new users to a specific organization and role within that organization
# Insert an existing team id or generate a valid CUID for a new one at https://www.getuniqueid.com/cuid (e.g. cjld2cjxh0000qzrmn831i7rn) # Insert an existing organization id or generate a valid CUID for a new one at https://www.getuniqueid.com/cuid (e.g. cjld2cjxh0000qzrmn831i7rn)
# (Role Management is an Enterprise feature) # (Role Management is an Enterprise feature)
# DEFAULT_TEAM_ID= # DEFAULT_ORGANIZATION_ID=
# DEFAULT_TEAM_ROLE=admin # DEFAULT_ORGANIZATION_ROLE=admin
# set to 1 to skip onboarding for new users
# ONBOARDING_DISABLED=1
# Send new users to customer.io # Send new users to customer.io
# CUSTOMER_IO_API_KEY= # CUSTOMER_IO_API_KEY=
@@ -177,7 +173,10 @@ ENTERPRISE_LICENSE_KEY=
UNSPLASH_ACCESS_KEY= UNSPLASH_ACCESS_KEY=
# The below is used for Next Caching (uses In-Memory from Next Cache if not provided) # The below is used for Next Caching (uses In-Memory from Next Cache if not provided)
# REDIS_URL: # REDIS_URL=redis://localhost:6379
# The below is used for Rate Limiting (uses In-Memory LRU Cache if not provided) (You can use a service like Webdis for this) # The below is used for Rate Limiting (uses In-Memory LRU Cache if not provided) (You can use a service like Webdis for this)
# REDIS_HTTP_URL: # REDIS_HTTP_URL:
# Disable custom cache handler if necessary (e.g. if deployed on Vercel)
# CUSTOM_CACHE_DISABLED=1
+2
View File
@@ -0,0 +1,2 @@
node_modules/
packages/config-eslint/
-10
View File
@@ -1,10 +0,0 @@
module.exports = {
root: true,
// This tells ESLint to load the config from the package `eslint-config-formbricks`
extends: ["formbricks"],
settings: {
next: {
rootDir: ["apps/*/"],
},
},
};
@@ -0,0 +1,33 @@
name: oss.gg hack submission 🕹️
description: "Submit your contribution for the for the oss.gg hackathon"
title: "[🕹️]"
labels: 🕹️ oss.gg, player submission, hacktoberfest
assignees: []
body:
- type: textarea
id: contribution-name
attributes:
label: What side quest or challenge are you solving?
description: Add the name of the side quest or challenge.
validations:
required: true
- type: textarea
id: points
attributes:
label: Points
description: How many points are assigned to this contribution?
validations:
required: true
- type: textarea
id: description
attributes:
label: Description
description: What's the task your performed?
validations:
- type: textarea
id: proof
attributes:
label: Provide proof that you've completed the task
description: Screenshots, loom recordings, links to the content you shared or interacted with.
validations:
required: true
+13 -11
View File
@@ -30,6 +30,10 @@ runs:
**/dist/** **/dist/**
key: ${{ runner.os }}-${{ env.cache-name }}-${{ env.key-1 }}-${{ env.key-2 }} key: ${{ runner.os }}-${{ env.cache-name }}-${{ env.key-1 }}-${{ env.key-2 }}
- name: Set Cache Hit Status
run: echo "cache-hit=${{ steps.cache-build.outputs.cache-hit }}" >> "$GITHUB_OUTPUT"
shell: bash
- name: Setup Node.js 20.x - name: Setup Node.js 20.x
uses: actions/setup-node@v3 uses: actions/setup-node@v3
with: with:
@@ -37,7 +41,7 @@ runs:
if: steps.cache-build.outputs.cache-hit != 'true' if: steps.cache-build.outputs.cache-hit != 'true'
- name: Install pnpm - name: Install pnpm
uses: pnpm/action-setup@v2 uses: pnpm/action-setup@v4
if: steps.cache-build.outputs.cache-hit != 'true' if: steps.cache-build.outputs.cache-hit != 'true'
- name: Install dependencies - name: Install dependencies
@@ -49,20 +53,18 @@ runs:
run: cp .env.example .env run: cp .env.example .env
shell: bash shell: bash
- name: Add E2E Testing Mode - name: Fill ENCRYPTION_KEY, ENTERPRISE_LICENSE_KEY and E2E_TESTING in .env
run: | run: |
echo "E2E_TESTING=${{ inputs.e2e_testing_mode }}" >> $GITHUB_ENV RANDOM_KEY=$(openssl rand -hex 32)
shell: bash sed -i "s/ENCRYPTION_KEY=.*/ENCRYPTION_KEY=${RANDOM_KEY}/" .env
sed -i "s/CRON_SECRET=.*/CRON_SECRET=${RANDOM_KEY}/" .env
- name: Generate Random ENCRYPTION_KEY sed -i "s/NEXTAUTH_SECRET=.*/NEXTAUTH_SECRET=${RANDOM_KEY}/" .env
run: | sed -i "s/ENTERPRISE_LICENSE_KEY=.*/ENTERPRISE_LICENSE_KEY=${RANDOM_KEY}/" .env
SECRET=$(openssl rand -hex 32) echo "E2E_TESTING=${{ inputs.e2e_testing_mode }}" >> .env
echo "ENCRYPTION_KEY=$SECRET" >> $GITHUB_ENV
echo "ENTERPRISE_LICENSE_KEY=$SECRET" >> $GITHUB_ENV
shell: bash shell: bash
- run: | - run: |
pnpm build --filter=web... pnpm build --filter=@formbricks/web...
if: steps.cache-build.outputs.cache-hit != 'true' if: steps.cache-build.outputs.cache-hit != 'true'
shell: bash shell: bash
+4 -20
View File
@@ -11,24 +11,8 @@ jobs:
- uses: actions/checkout@v3 - uses: actions/checkout@v3
- uses: ./.github/actions/dangerous-git-checkout - uses: ./.github/actions/dangerous-git-checkout
- name: Setup Node.js 20.x - name: Build & Cache Web Binaries
uses: actions/setup-node@v3 uses: ./.github/actions/cache-build-web
id: cache-build-web
with: with:
node-version: 20.x e2e_testing_mode: "0"
- name: Install pnpm
uses: pnpm/action-setup@v2
- name: Install dependencies
run: pnpm install --config.platform=linux --config.architecture=x64
- name: create .env
run: cp .env.example .env
- name: Generate Random ENCRYPTION_KEY
run: |
SECRET=$(openssl rand -hex 32)
echo "ENCRYPTION_KEY=$SECRET" >> $GITHUB_ENV
- name: Build Formbricks-web
run: pnpm build --filter=web...
+30
View File
@@ -0,0 +1,30 @@
name: "Chromatic"
on:
push:
branches:
- main
workflow_dispatch:
jobs:
chromatic:
name: Run Chromatic
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: actions/setup-node@v4
with:
node-version: 20
- name: Install pnpm
uses: pnpm/action-setup@v4
- name: Install dependencies
run: pnpm install --config.platform=linux --config.architecture=x64
- name: Run Chromatic
uses: chromaui/action@latest
with:
# ⚠️ Make sure to configure a `CHROMATIC_PROJECT_TOKEN` repository secret
projectToken: ${{ secrets.CHROMATIC_PROJECT_TOKEN }}
workingDir: apps/storybook
@@ -1,24 +0,0 @@
name: Cron - Report usage to Stripe
on:
workflow_dispatch:
# "Scheduled workflows run on the latest commit on the default or base branch."
# — https://docs.github.com/en/actions/learn-github-actions/events-that-trigger-workflows#schedule
# schedule:
# This will run the job at 20:00 UTC every day of every month.
# - cron: "0 20 * * *"
jobs:
cron-reportUsageToStripe:
env:
APP_URL: ${{ secrets.APP_URL }}
CRON_SECRET: ${{ secrets.CRON_SECRET }}
runs-on: ubuntu-latest
steps:
- name: cURL request
if: ${{ env.APP_URL && env.CRON_SECRET }}
run: |
curl ${{ env.APP_URL }}/api/cron/report-usage \
-X POST \
-H 'x-api-key: ${{ env.CRON_SECRET }}' \
-H 'Cache-Control: no-cache' \
--fail
+3 -3
View File
@@ -4,9 +4,9 @@ on:
workflow_dispatch: workflow_dispatch:
# "Scheduled workflows run on the latest commit on the default or base branch." # "Scheduled workflows run on the latest commit on the default or base branch."
# — https://docs.github.com/en/actions/learn-github-actions/events-that-trigger-workflows#schedule # — https://docs.github.com/en/actions/learn-github-actions/events-that-trigger-workflows#schedule
# schedule: schedule:
# Runs “At 08:00 on Monday.” (see https://crontab.guru) # Runs “At 08:00 on Monday.” (see https://crontab.guru)
# - cron: "0 8 * * 1" - cron: "0 8 * * 1"
jobs: jobs:
cron-weeklySummary: cron-weeklySummary:
env: env:
+50 -34
View File
@@ -2,67 +2,83 @@ name: E2E Tests
on: on:
workflow_call: workflow_call:
workflow_dispatch: workflow_dispatch:
env:
TELEMETRY_DISABLED: 1
jobs: jobs:
build: build:
name: Run E2E Tests name: Run E2E Tests
runs-on: ubuntu-latest runs-on: ubuntu-latest
timeout-minutes: 60 timeout-minutes: 60
services:
postgres:
image: postgres:latest
env:
POSTGRES_DB: postgres
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
ports:
- 5432:5432
options: >-
--health-cmd="pg_isready -U testuser"
--health-interval=10s
--health-timeout=5s
--health-retries=5
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v3
- uses: ./.github/actions/dangerous-git-checkout - uses: ./.github/actions/dangerous-git-checkout
- name: Build & Cache Web Binaries - name: Setup Node.js 20.x
uses: ./.github/actions/cache-build-web uses: actions/setup-node@v3
with: with:
e2e_testing_mode: "1" node-version: 20.x
- name: Install pnpm - name: Install pnpm
uses: pnpm/action-setup@v2 uses: pnpm/action-setup@v4
- name: Install dependencies - name: Install dependencies
run: pnpm install run: pnpm install --config.platform=linux --config.architecture=x64
shell: bash
- name: Start PostgreSQL - name: create .env
run: cp .env.example .env
shell: bash
- name: Fill ENCRYPTION_KEY, ENTERPRISE_LICENSE_KEY and E2E_TESTING in .env
run: | run: |
cd packages/database && pnpm db:up & RANDOM_KEY=$(openssl rand -hex 32)
for attempt in {1..20}; do sed -i "s/ENCRYPTION_KEY=.*/ENCRYPTION_KEY=${RANDOM_KEY}/" .env
if nc -zv localhost 5432; then sed -i "s/CRON_SECRET=.*/CRON_SECRET=${RANDOM_KEY}/" .env
echo "Ready" sed -i "s/NEXTAUTH_SECRET=.*/NEXTAUTH_SECRET=${RANDOM_KEY}/" .env
break sed -i "s/ENTERPRISE_LICENSE_KEY=.*/ENTERPRISE_LICENSE_KEY=${RANDOM_KEY}/" .env
fi echo "E2E_TESTING=1" >> .env
echo "Waiting..." shell: bash
sleep 5
done - name: Build App
pnpm db:migrate:dev
- name: Serve packages for lazy loading
run: | run: |
cd packages/surveys && pnpm serve & pnpm build --filter=@formbricks/web...
- name: Apply Prisma Migrations
run: |
pnpm prisma migrate deploy
- name: Run App - name: Run App
run: | run: |
NODE_ENV=test pnpm start --filter=web & NODE_ENV=test pnpm start --filter=@formbricks/web &
for attempt in {1..20}; do sleep 10 # Optional: gives some buffer for the app to start
for attempt in {1..10}; do
if [ $(curl -o /dev/null -s -w "%{http_code}" http://localhost:3000/health) -eq 200 ]; then if [ $(curl -o /dev/null -s -w "%{http_code}" http://localhost:3000/health) -eq 200 ]; then
echo "Ready" echo "Application is ready."
break break
fi fi
echo "Waiting..." if [ $attempt -eq 10 ]; then
echo "Application failed to start in time."
exit 1
fi
echo "Still waiting for the application to be ready..."
sleep 10 sleep 10
done done
- name: Test Serve endpoints
run: |
curl -s http://localhost:3003
- name: Cache Playwright
uses: actions/cache@v3
id: playwright-cache
with:
path: ~/.cache/ms-playwright
key: ${{ runner.os }}-playwright-${{ hashFiles('pnpm-lock.yaml') }}
- name: Install Playwright - name: Install Playwright
if: steps.playwright-cache.outputs.cache-hit != 'true'
run: pnpm exec playwright install --with-deps run: pnpm exec playwright install --with-deps
- name: Run E2E Tests - name: Run E2E Tests
+8 -6
View File
@@ -11,13 +11,13 @@ jobs:
- uses: actions/checkout@v3 - uses: actions/checkout@v3
- uses: ./.github/actions/dangerous-git-checkout - uses: ./.github/actions/dangerous-git-checkout
- name: Setup Node.js 18.x - name: Setup Node.js 20.x
uses: actions/setup-node@v3 uses: actions/setup-node@v3
with: with:
node-version: 18.x node-version: 20.x
- name: Install pnpm - name: Install pnpm
uses: pnpm/action-setup@v2 uses: pnpm/action-setup@v4
- name: Install dependencies - name: Install dependencies
run: pnpm install --config.platform=linux --config.architecture=x64 run: pnpm install --config.platform=linux --config.architecture=x64
@@ -25,10 +25,12 @@ jobs:
- name: create .env - name: create .env
run: cp .env.example .env run: cp .env.example .env
- name: Generate Random ENCRYPTION_KEY - name: Generate Random ENCRYPTION_KEY, CRON_SECRET & NEXTAUTH_SECRET and fill in .env
run: | run: |
SECRET=$(openssl rand -hex 32) RANDOM_KEY=$(openssl rand -hex 32)
echo "ENCRYPTION_KEY=$SECRET" >> $GITHUB_ENV sed -i "s/ENCRYPTION_KEY=.*/ENCRYPTION_KEY=${RANDOM_KEY}/" .env
sed -i "s/CRON_SECRET=.*/CRON_SECRET=${RANDOM_KEY}/" .env
sed -i "s/NEXTAUTH_SECRET=.*/NEXTAUTH_SECRET=${RANDOM_KEY}/" .env
- name: Lint - name: Lint
run: pnpm lint run: pnpm lint
+4 -3
View File
@@ -1,9 +1,10 @@
name: Release Changesets name: Release Changesets
on: on:
push: workflow_dispatch:
branches: #push:
- main # branches:
# - main
concurrency: ${{ github.workflow }}-${{ github.ref }} concurrency: ${{ github.workflow }}-${{ github.ref }}
@@ -1,10 +1,5 @@
name: Docker for Data Migrations name: Docker for Data Migrations
# This workflow uses actions that are not certified by GitHub.
# They are provided by a third-party and are governed by
# separate terms of service, privacy policy, and support
# documentation.
on: on:
workflow_dispatch: workflow_dispatch:
push: push:
@@ -12,7 +7,6 @@ on:
- "v*" - "v*"
env: env:
# Use docker.io for Docker Hub if empty
REGISTRY: ghcr.io REGISTRY: ghcr.io
IMAGE_NAME: formbricks/data-migrations IMAGE_NAME: formbricks/data-migrations
DATABASE_URL: "postgresql://postgres:postgres@postgres:5432/formbricks?schema=public" DATABASE_URL: "postgresql://postgres:postgres@postgres:5432/formbricks?schema=public"
@@ -23,8 +17,6 @@ jobs:
permissions: permissions:
contents: read contents: read
packages: write packages: write
# This is used to complete the identity challenge
# with sigstore/fulcio when running outside of PRs.
id-token: write id-token: write
steps: steps:
@@ -50,6 +42,7 @@ jobs:
tags: | tags: |
type=ref,event=tag type=ref,event=tag
type=raw,value=${{ github.ref_name }} type=raw,value=${{ github.ref_name }}
type=raw,value=latest
- name: Build and push Docker image - name: Build and push Docker image
uses: docker/build-push-action@v3 uses: docker/build-push-action@v3
@@ -66,3 +59,4 @@ jobs:
if: ${{ github.event_name != 'pull_request' }} if: ${{ github.event_name != 'pull_request' }}
run: | run: |
cosign sign --yes ghcr.io/${{ env.IMAGE_NAME }}:${{ github.ref_name }} cosign sign --yes ghcr.io/${{ env.IMAGE_NAME }}:${{ github.ref_name }}
cosign sign --yes ghcr.io/${{ env.IMAGE_NAME }}:latest
@@ -0,0 +1,91 @@
name: Docker Release to Github Experimental
# This workflow uses actions that are not certified by GitHub.
# They are provided by a third-party and are governed by
# separate terms of service, privacy policy, and support
# documentation.
on:
workflow_dispatch:
env:
# Use docker.io for Docker Hub if empty
REGISTRY: ghcr.io
# github.repository as <account>/<repo>
IMAGE_NAME: ${{ github.repository }}-experimental
TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }}
TURBO_TEAM: ${{ secrets.TURBO_TEAM }}
DATABASE_URL: "postgresql://postgres:postgres@localhost:5432/formbricks?schema=public"
jobs:
build:
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
# This is used to complete the identity challenge
# with sigstore/fulcio when running outside of PRs.
id-token: write
steps:
- name: Checkout repository
uses: actions/checkout@v3
- name: Set up Depot CLI
uses: depot/setup-action@v1
# Install the cosign tool except on PR
# https://github.com/sigstore/cosign-installer
- name: Install cosign
if: github.event_name != 'pull_request'
uses: sigstore/cosign-installer@v3.5.0
# Login against a Docker registry except on PR
# https://github.com/docker/login-action
- name: Log into registry ${{ env.REGISTRY }}
if: github.event_name != 'pull_request'
uses: docker/login-action@v3 # v3.0.0
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
# Extract metadata (tags, labels) for Docker
# https://github.com/docker/metadata-action
- name: Extract Docker metadata
id: meta
uses: docker/metadata-action@v5 # v5.0.0
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
# Build and push Docker image with Buildx (don't push on PR)
# https://github.com/docker/build-push-action
- name: Build and push Docker image
id: build-and-push
uses: depot/build-push-action@v1
with:
project: tw0fqmsx3c
token: ${{ secrets.DEPOT_PROJECT_TOKEN }}
context: .
file: ./apps/web/Dockerfile
platforms: linux/amd64,linux/arm64
push: ${{ github.event_name != 'pull_request' }}
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
cache-from: type=gha
cache-to: type=gha,mode=max
# Sign the resulting Docker image digest except on PRs.
# This will only write to the public Rekor transparency log when the Docker
# repository is public to avoid leaking data. If you would like to publish
# transparency data even for private images, pass --force to cosign below.
# https://github.com/sigstore/cosign
- name: Sign the published Docker image
if: ${{ github.event_name != 'pull_request' }}
env:
# https://docs.github.com/en/actions/security-guides/security-hardening-for-github-actions#using-an-intermediate-environment-variable
TAGS: ${{ steps.meta.outputs.tags }}
DIGEST: ${{ steps.build-and-push.outputs.digest }}
# This step uses the identity token to provision an ephemeral certificate
# against the sigstore community Fulcio instance.
run: echo "${TAGS}" | xargs -I {} cosign sign --yes {}@${DIGEST}
@@ -20,6 +20,20 @@ jobs:
id: lint_pr_title id: lint_pr_title
env: env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
types: |
fix
feat
chore
docs
style
refactor
perf
test
build
ci
revert
ossgg
- uses: marocchino/sticky-pull-request-comment@v2 - uses: marocchino/sticky-pull-request-comment@v2
# When the previous steps fails, the workflow would stop. By adding this # When the previous steps fails, the workflow would stop. By adding this
+6 -4
View File
@@ -17,7 +17,7 @@ jobs:
node-version: 20.x node-version: 20.x
- name: Install pnpm - name: Install pnpm
uses: pnpm/action-setup@v2 uses: pnpm/action-setup@v4
- name: Install dependencies - name: Install dependencies
run: pnpm install --config.platform=linux --config.architecture=x64 run: pnpm install --config.platform=linux --config.architecture=x64
@@ -25,10 +25,12 @@ jobs:
- name: create .env - name: create .env
run: cp .env.example .env run: cp .env.example .env
- name: Generate Random ENCRYPTION_KEY - name: Generate Random ENCRYPTION_KEY, CRON_SECRET & NEXTAUTH_SECRET and fill in .env
run: | run: |
SECRET=$(openssl rand -hex 32) RANDOM_KEY=$(openssl rand -hex 32)
echo "ENCRYPTION_KEY=$SECRET" >> $GITHUB_ENV sed -i "s/ENCRYPTION_KEY=.*/ENCRYPTION_KEY=${RANDOM_KEY}/" .env
sed -i "s/CRON_SECRET=.*/CRON_SECRET=${RANDOM_KEY}/" .env
sed -i "s/NEXTAUTH_SECRET=.*/NEXTAUTH_SECRET=${RANDOM_KEY}/" .env
- name: Test - name: Test
run: pnpm test run: pnpm test
+1 -1
View File
@@ -56,5 +56,5 @@ Zone.Identifier
packages/lib/uploads packages/lib/uploads
# Vite Timestamps # Vite Timestamps
vite.config.*.timestamp-* *vite.config.*.timestamp-*
-1
View File
@@ -33,7 +33,6 @@ tasks:
gp sync-await init && gp sync-await init &&
cp .env.example .env && cp .env.example .env &&
sed -i -r "s#^(WEBAPP_URL=).*#\1 $(gp url 3000)#" .env && sed -i -r "s#^(WEBAPP_URL=).*#\1 $(gp url 3000)#" .env &&
sed -i -r "s#^(NEXTAUTH_URL=).*#\1 $(gp url 3000)#" .env &&
RANDOM_ENCRYPTION_KEY=$(openssl rand -hex 32) RANDOM_ENCRYPTION_KEY=$(openssl rand -hex 32)
sed -i 's/^ENCRYPTION_KEY=.*/ENCRYPTION_KEY='"$RANDOM_ENCRYPTION_KEY"'/' .env sed -i 's/^ENCRYPTION_KEY=.*/ENCRYPTION_KEY='"$RANDOM_ENCRYPTION_KEY"'/' .env
turbo --filter "@formbricks/web" go turbo --filter "@formbricks/web" go
-3
View File
@@ -1,4 +1 @@
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"
pnpm lint-staged pnpm lint-staged
-14
View File
@@ -1,14 +0,0 @@
#!/bin/sh
# A sample post-deploy hook
#
# These environment variables are available:
# KAMAL_RECORDED_AT
# KAMAL_PERFORMER
# KAMAL_VERSION
# KAMAL_HOSTS
# KAMAL_ROLE (if set)
# KAMAL_DESTINATION (if set)
# KAMAL_RUNTIME
echo "$KAMAL_PERFORMER deployed $KAMAL_VERSION to $KAMAL_DESTINATION in $KAMAL_RUNTIME seconds"
-3
View File
@@ -1,3 +0,0 @@
#!/bin/sh
echo "Rebooted Traefik on $KAMAL_HOSTS"
-51
View File
@@ -1,51 +0,0 @@
#!/bin/sh
# A sample pre-build hook
#
# Checks:
# 1. We have a clean checkout
# 2. A remote is configured
# 3. The branch has been pushed to the remote
# 4. The version we are deploying matches the remote
#
# These environment variables are available:
# KAMAL_RECORDED_AT
# KAMAL_PERFORMER
# KAMAL_VERSION
# KAMAL_HOSTS
# KAMAL_ROLE (if set)
# KAMAL_DESTINATION (if set)
if [ -n "$(git status --porcelain)" ]; then
echo "Git checkout is not clean, aborting..." >&2
git status --porcelain >&2
exit 1
fi
first_remote=$(git remote)
if [ -z "$first_remote" ]; then
echo "No git remote set, aborting..." >&2
exit 1
fi
current_branch=$(git branch --show-current)
if [ -z "$current_branch" ]; then
echo "Not on a git branch, aborting..." >&2
exit 1
fi
remote_head=$(git ls-remote $first_remote --tags $current_branch | cut -f1)
if [ -z "$remote_head" ]; then
echo "Branch not pushed to remote, aborting..." >&2
exit 1
fi
if [ "$KAMAL_VERSION" != "$remote_head" ]; then
echo "Version ($KAMAL_VERSION) does not match remote HEAD ($remote_head), aborting..." >&2
exit 1
fi
exit 0
-47
View File
@@ -1,47 +0,0 @@
#!/usr/bin/env ruby
# A sample pre-connect check
#
# Warms DNS before connecting to hosts in parallel
#
# These environment variables are available:
# KAMAL_RECORDED_AT
# KAMAL_PERFORMER
# KAMAL_VERSION
# KAMAL_HOSTS
# KAMAL_ROLE (if set)
# KAMAL_DESTINATION (if set)
# KAMAL_RUNTIME
hosts = ENV["KAMAL_HOSTS"].split(",")
results = nil
max = 3
elapsed = Benchmark.realtime do
results = hosts.map do |host|
Thread.new do
tries = 1
begin
Socket.getaddrinfo(host, 0, Socket::AF_UNSPEC, Socket::SOCK_STREAM, nil, Socket::AI_CANONNAME)
rescue SocketError
if tries < max
puts "Retrying DNS warmup: #{host}"
tries += 1
sleep rand
retry
else
puts "DNS warmup failed: #{host}"
host
end
end
tries
end
end.map(&:value)
end
retries = results.sum - hosts.size
nopes = results.count { |r| r == max }
puts "Prewarmed %d DNS lookups in %.2f sec: %d retries, %d failures" % [ hosts.size, elapsed, retries, nopes ]
-109
View File
@@ -1,109 +0,0 @@
#!/usr/bin/env ruby
# A sample pre-deploy hook
#
# Checks the Github status of the build, waiting for a pending build to complete for up to 720 seconds.
#
# Fails unless the combined status is "success"
#
# These environment variables are available:
# KAMAL_RECORDED_AT
# KAMAL_PERFORMER
# KAMAL_VERSION
# KAMAL_HOSTS
# KAMAL_COMMAND
# KAMAL_SUBCOMMAND
# KAMAL_ROLE (if set)
# KAMAL_DESTINATION (if set)
# Only check the build status for production deployments
if ENV["KAMAL_COMMAND"] == "rollback" || ENV["KAMAL_DESTINATION"] != "production"
exit 0
end
require "bundler/inline"
# true = install gems so this is fast on repeat invocations
gemfile(true, quiet: true) do
source "https://rubygems.org"
gem "octokit"
gem "faraday-retry"
end
MAX_ATTEMPTS = 72
ATTEMPTS_GAP = 10
def exit_with_error(message)
$stderr.puts message
exit 1
end
class GithubStatusChecks
attr_reader :remote_url, :git_sha, :github_client, :combined_status
def initialize
@remote_url = `git config --get remote.origin.url`.strip.delete_prefix("https://github.com/")
@git_sha = `git rev-parse HEAD`.strip
@github_client = Octokit::Client.new(access_token: ENV["GITHUB_TOKEN"])
refresh!
end
def refresh!
@combined_status = github_client.combined_status(remote_url, git_sha)
end
def state
combined_status[:state]
end
def first_status_url
first_status = combined_status[:statuses].find { |status| status[:state] == state }
first_status && first_status[:target_url]
end
def complete_count
combined_status[:statuses].count { |status| status[:state] != "pending"}
end
def total_count
combined_status[:statuses].count
end
def current_status
if total_count > 0
"Completed #{complete_count}/#{total_count} checks, see #{first_status_url} ..."
else
"Build not started..."
end
end
end
$stdout.sync = true
puts "Checking build status..."
attempts = 0
checks = GithubStatusChecks.new
begin
loop do
case checks.state
when "success"
puts "Checks passed, see #{checks.first_status_url}"
exit 0
when "failure"
exit_with_error "Checks failed, see #{checks.first_status_url}"
when "pending"
attempts += 1
end
exit_with_error "Checks are still pending, gave up after #{MAX_ATTEMPTS * ATTEMPTS_GAP} seconds" if attempts == MAX_ATTEMPTS
puts checks.current_status
sleep(ATTEMPTS_GAP)
checks.refresh!
end
rescue Octokit::NotFound
exit_with_error "Build status could not be found"
end
-3
View File
@@ -1,3 +0,0 @@
#!/bin/sh
echo "Rebooting Traefik on $KAMAL_HOSTS..."
+1 -1
View File
@@ -1,4 +1,4 @@
const baseConfig = require("./packages/prettier-config/prettier-preset"); const baseConfig = require("./packages/config-prettier/prettier-preset");
module.exports = { module.exports = {
...baseConfig, ...baseConfig,
+2 -2
View File
@@ -1,9 +1,9 @@
Copyright (c) 2023 Formbricks GmbH Copyright (c) 2024 Formbricks GmbH
Portions of this software are licensed as follows: Portions of this software are licensed as follows:
- All content that resides under the "packages/ee/" directory of this repository, if that directory exists, is licensed under the license defined in "packages/ee/LICENSE". - All content that resides under the "packages/ee/" directory of this repository, if that directory exists, is licensed under the license defined in "packages/ee/LICENSE".
- All content that resides under the "packages/js/", "packages/errors/" and "packages/api/" directories of this repository, if that directories exist, is licensed under the "MIT" license as defined in the "LICENSE" files of these packages. - All content that resides under the "packages/js/", "packages/react-native/" and "packages/api/" directories of this repository, if that directories exist, is licensed under the "MIT" license as defined in the "LICENSE" files of these packages.
- All third party components incorporated into the Formbricks Software are licensed under the original license provided by the owner of the applicable component. - All third party components incorporated into the Formbricks Software are licensed under the original license provided by the owner of the applicable component.
- Content outside of the above mentioned directories or restrictions above is available under the "AGPLv3" license as defined below. - Content outside of the above mentioned directories or restrictions above is available under the "AGPLv3" license as defined below.
+9 -3
View File
@@ -82,7 +82,7 @@ Formbricks is both a free and open source survey platform - and a privacy-first
- 🔗 Create shareable **link surveys**. - 🔗 Create shareable **link surveys**.
- 👨‍👩‍👦 Invite your team members to **collaborate** on your surveys. - 👨‍👩‍👦 Invite your organization members to **collaborate** on your surveys.
- 🔌 Integrate Formbricks with **Slack, Notion, Zapier, n8n and more**. - 🔌 Integrate Formbricks with **Slack, Notion, Zapier, n8n and more**.
@@ -144,6 +144,12 @@ Or you can also deploy Formbricks on [RepoCloud](https://repocloud.io) using the
[![Deploy on RepoCloud](https://d16t0pc4846x52.cloudfront.net/deploy.png)](https://repocloud.io/details/?app_id=254) [![Deploy on RepoCloud](https://d16t0pc4846x52.cloudfront.net/deploy.png)](https://repocloud.io/details/?app_id=254)
##### Zeabur
Or you can also deploy Formbricks on [Zeabur](https://zeabur.com) using the button below.
[![Deploy to Zeabur](https://zeabur.com/button.svg)](https://zeabur.com/templates/G4TUJL)
<a id="development"></a> <a id="development"></a>
## 👨‍💻 Development ## 👨‍💻 Development
@@ -160,7 +166,7 @@ Here is what you need to be able to run Formbricks:
### Local Setup ### Local Setup
To get started locally, we've got a [guide to help you](https://formbricks.com/docs/contributing/setup). To get started locally, we've got a [guide to help you](https://formbricks.com/docs/developer-docs/contributing/get-started#local-machine-setup).
### Gitpod Setup ### Gitpod Setup
@@ -184,7 +190,7 @@ Here are a few options:
- Upvote issues with 👍 reaction so we know what the demand for a particular issue is to prioritize it within the roadmap. - Upvote issues with 👍 reaction so we know what the demand for a particular issue is to prioritize it within the roadmap.
Please check out [our contribution guide](https://formbricks.com/docs/contributing/introduction) and our [list of open issues](https://github.com/formbricks/formbricks/issues) for more information. Please check out [our contribution guide](https://formbricks.com/docs/developer-docs/contributing/get-started) and our [list of open issues](https://github.com/formbricks/formbricks/issues) for more information.
## All Thanks To Our Contributors ## All Thanks To Our Contributors
+2
View File
@@ -0,0 +1,2 @@
EXPO_PUBLIC_API_HOST=http://192.168.178.20:3000
EXPO_PUBLIC_FORMBRICKS_ENVIRONMENT_ID=clzr04nkd000bcdl110j0ijyq
+7
View File
@@ -0,0 +1,7 @@
module.exports = {
extends: ["@formbricks/eslint-config/react.js"],
parserOptions: {
project: "tsconfig.json",
tsconfigRootDir: __dirname,
},
};
+35
View File
@@ -0,0 +1,35 @@
# Learn more https://docs.github.com/en/get-started/getting-started-with-git/ignoring-files
# dependencies
node_modules/
# Expo
.expo/
dist/
web-build/
# Native
*.orig.*
*.jks
*.p8
*.p12
*.key
*.mobileprovision
# Metro
.metro-health-check*
# debug
npm-debug.*
yarn-debug.*
yarn-error.*
# macOS
.DS_Store
*.pem
# local env files
.env*.local
# typescript
*.tsbuildinfo
View File
+34
View File
@@ -0,0 +1,34 @@
{
"expo": {
"name": "react-native-demo",
"slug": "react-native-demo",
"version": "1.0.0",
"orientation": "portrait",
"icon": "./assets/icon.png",
"userInterfaceStyle": "light",
"splash": {
"image": "./assets/splash.png",
"resizeMode": "contain",
"backgroundColor": "#ffffff"
},
"jsEngine": "hermes",
"assetBundlePatterns": ["**/*"],
"ios": {
"supportsTablet": true,
"infoPlist": {
"NSCameraUsageDescription": "Take pictures for certain activities.",
"NSPhotoLibraryUsageDescription": "Select pictures for certain activities.",
"NSMicrophoneUsageDescription": "Need microphone access for recording videos."
}
},
"android": {
"adaptiveIcon": {
"foregroundImage": "./assets/adaptive-icon.png",
"backgroundColor": "#ffffff"
}
},
"web": {
"favicon": "./assets/favicon.png"
}
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

+6
View File
@@ -0,0 +1,6 @@
module.exports = function babel(api) {
api.cache(true);
return {
presets: ["babel-preset-expo"],
};
};
+7
View File
@@ -0,0 +1,7 @@
import { registerRootComponent } from "expo";
import { LogBox } from "react-native";
import App from "./src/app";
registerRootComponent(App);
LogBox.ignoreAllLogs();
+21
View File
@@ -0,0 +1,21 @@
// Learn more https://docs.expo.io/guides/customizing-metro
const path = require("node:path");
const { getDefaultConfig } = require("expo/metro-config");
// Find the workspace root, this can be replaced with `find-yarn-workspace-root`
const workspaceRoot = path.resolve(__dirname, "../..");
const projectRoot = __dirname;
const config = getDefaultConfig(projectRoot);
// 1. Watch all files within the monorepo
config.watchFolders = [workspaceRoot];
// 2. Let Metro know where to resolve packages, and in what order
config.resolver.nodeModulesPaths = [
path.resolve(projectRoot, "node_modules"),
path.resolve(workspaceRoot, "node_modules"),
];
// 3. Force Metro to resolve (sub)dependencies only from the `nodeModulesPaths`
config.resolver.disableHierarchicalLookup = true;
module.exports = config;
+28
View File
@@ -0,0 +1,28 @@
{
"name": "@formbricks/demo-react-native",
"version": "1.0.0",
"main": "./index.js",
"scripts": {
"dev": "expo start",
"android": "expo start --android",
"ios": "expo start --ios",
"web": "expo start --web",
"eject": "expo eject",
"clean": "rimraf .turbo node_modules .expo"
},
"dependencies": {
"@formbricks/js": "workspace:*",
"@formbricks/react-native": "workspace:*",
"expo": "^51.0.26",
"expo-status-bar": "~1.12.1",
"react": "^18.2.0",
"react-native": "^0.74.4",
"react-native-webview": "13.8.6"
},
"devDependencies": {
"@babel/core": "^7.25.2",
"@types/react": "~18.2.79",
"typescript": "^5.3.3"
},
"private": true
}
+52
View File
@@ -0,0 +1,52 @@
import { StatusBar } from "expo-status-bar";
import { Button, LogBox, StyleSheet, Text, View } from "react-native";
import Formbricks, { track } from "@formbricks/react-native";
LogBox.ignoreAllLogs();
export default function App(): JSX.Element {
if (!process.env.EXPO_PUBLIC_FORMBRICKS_ENVIRONMENT_ID) {
throw new Error("EXPO_PUBLIC_FORMBRICKS_ENVIRONMENT_ID is required");
}
if (!process.env.EXPO_PUBLIC_API_HOST) {
throw new Error("EXPO_PUBLIC_API_HOST is required");
}
const config = {
environmentId: process.env.EXPO_PUBLIC_FORMBRICKS_ENVIRONMENT_ID,
apiHost: process.env.EXPO_PUBLIC_API_HOST,
userId: "random-user-id",
attributes: {
language: "en",
testAttr: "attr-test",
},
};
return (
<View style={styles.container}>
<Text>Formbricks React Native SDK Demo</Text>
<Button
title="Trigger Code Action"
onPress={() => {
track("code").catch((error: unknown) => {
// eslint-disable-next-line no-console -- logging is allowed in demo apps
console.error("Error tracking event:", error);
});
}}
/>
<StatusBar style="auto" />
<Formbricks initConfig={config} />
</View>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
backgroundColor: "#fff",
alignItems: "center",
justifyContent: "center",
},
});
+6
View File
@@ -0,0 +1,6 @@
{
"extends": "expo/tsconfig.base",
"compilerOptions": {
"strict": true
}
}
+1 -2
View File
@@ -1,4 +1,3 @@
module.exports = { module.exports = {
root: true, extends: ["@formbricks/eslint-config/legacy-next.js"],
extends: ["formbricks"],
}; };
-1
View File
@@ -9,7 +9,6 @@ import {
ShieldCheckIcon, ShieldCheckIcon,
UsersIcon, UsersIcon,
} from "lucide-react"; } from "lucide-react";
import { classNames } from "../lib/utils"; import { classNames } from "../lib/utils";
const navigation = [ const navigation = [
+10 -17
View File
@@ -1,5 +1,3 @@
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@formbricks/ui/Select";
interface SurveySwitchProps { interface SurveySwitchProps {
value: "website" | "app"; value: "website" | "app";
formbricks: any; formbricks: any;
@@ -7,23 +5,18 @@ interface SurveySwitchProps {
export const SurveySwitch = ({ value, formbricks }: SurveySwitchProps) => { export const SurveySwitch = ({ value, formbricks }: SurveySwitchProps) => {
return ( return (
<Select <select
value={value} value={value}
onValueChange={(v) => { onChange={(v) => {
formbricks.logout(); formbricks.logout();
window.location.href = `/${v}`; window.location.href = `/${v.target.value}`;
}}> }}>
<SelectTrigger className="w-[180px] px-4"> <option value="website" className="h-10 px-4 hover:bg-slate-100">
<SelectValue placeholder="Theme" /> Website Surveys
</SelectTrigger> </option>
<SelectContent> <option value="app" className="hover:bg-slate-10 h-10 px-4">
<SelectItem value="website" className="h-10 px-4 hover:bg-slate-100"> App Surveys
Website Surveys </option>
</SelectItem> </select>
<SelectItem value="app" className="hover:bg-slate-10 h-10 px-4">
App Surveys
</SelectItem>
</SelectContent>
</Select>
); );
}; };
@@ -1,7 +1,6 @@
/** @type {import('next').NextConfig} */ /** @type {import('next').NextConfig} */
const nextConfig = { const nextConfig = {
reactStrictMode: true, reactStrictMode: true,
transpilePackages: ["@formbricks/ui"],
async redirects() { async redirects() {
return [ return [
{ {
@@ -25,4 +24,4 @@ const nextConfig = {
}, },
}; };
module.exports = nextConfig; export default nextConfig;
+4 -4
View File
@@ -13,13 +13,13 @@
"dependencies": { "dependencies": {
"@formbricks/js": "workspace:*", "@formbricks/js": "workspace:*",
"@formbricks/ui": "workspace:*", "@formbricks/ui": "workspace:*",
"lucide-react": "^0.378.0", "lucide-react": "^0.418.0",
"next": "14.2.3", "next": "14.2.5",
"react": "18.3.1", "react": "18.3.1",
"react-dom": "18.3.1" "react-dom": "18.3.1"
}, },
"devDependencies": { "devDependencies": {
"eslint-config-formbricks": "workspace:*", "@formbricks/eslint-config": "workspace:*",
"@formbricks/tsconfig": "workspace:*" "@formbricks/config-typescript": "workspace:*"
} }
} }
+1 -2
View File
@@ -1,7 +1,6 @@
import type { AppProps } from "next/app"; import type { AppProps } from "next/app";
import Head from "next/head"; import Head from "next/head";
import "@formbricks/ui/globals.css";
import "../styles/globals.css";
const App = ({ Component, pageProps }: AppProps) => { const App = ({ Component, pageProps }: AppProps) => {
return ( return (
+8 -10
View File
@@ -1,9 +1,7 @@
import Image from "next/image"; import Image from "next/image";
import { useRouter } from "next/router"; import { useRouter } from "next/router";
import { useEffect, useState } from "react"; import { useEffect, useState } from "react";
import formbricks from "@formbricks/js/app"; import formbricks from "@formbricks/js/app";
import { SurveySwitch } from "../../components/SurveySwitch"; import { SurveySwitch } from "../../components/SurveySwitch";
import fbsetup from "../../public/fb-setup.png"; import fbsetup from "../../public/fb-setup.png";
@@ -59,12 +57,12 @@ const AppPage = ({}) => {
router.events.off("routeChangeComplete", handleRouteChange); router.events.off("routeChangeComplete", handleRouteChange);
}; };
} }
}); }, []);
return ( return (
<div className="h-screen bg-white px-12 py-6 dark:bg-slate-800"> <div className="min-h-screen bg-white px-12 py-6 dark:bg-slate-800">
<div className="flex flex-col justify-between md:flex-row"> <div className="flex flex-col justify-between md:flex-row">
<div className="flex items-center gap-2"> <div className="flex flex-col items-center gap-2 sm:flex-row">
<SurveySwitch value="app" formbricks={formbricks} /> <SurveySwitch value="app" formbricks={formbricks} />
<div> <div>
<h1 className="text-2xl font-bold text-slate-900 dark:text-white"> <h1 className="text-2xl font-bold text-slate-900 dark:text-white">
@@ -119,7 +117,7 @@ const AppPage = ({}) => {
</div> </div>
<div className="md:grid md:grid-cols-3"> <div className="md:grid md:grid-cols-3">
<div className="col-span-3 self-start rounded-lg border border-slate-300 bg-slate-100 p-6 dark:border-slate-600 dark:bg-slate-800"> <div className="col-span-3 self-start rounded-lg border border-slate-300 bg-slate-100 p-6 dark:border-slate-600 dark:bg-slate-900">
<h3 className="text-lg font-semibold dark:text-white"> <h3 className="text-lg font-semibold dark:text-white">
Reset person / pull data from Formbricks app Reset person / pull data from Formbricks app
</h3> </h3>
@@ -142,7 +140,7 @@ const AppPage = ({}) => {
<div className="p-6"> <div className="p-6">
<div> <div>
<button className="mb-4 rounded-lg bg-slate-800 px-6 py-3 text-white hover:bg-slate-700 dark:bg-slate-700 dark:hover:bg-slate-600"> <button className="mb-4 rounded-lg bg-slate-800 px-6 py-3 text-white hover:bg-slate-700 dark:bg-slate-700 dark:hover:bg-slate-600">
No-Code Action No-Code Action
</button> </button>
</div> </div>
@@ -171,7 +169,7 @@ const AppPage = ({}) => {
onClick={() => { onClick={() => {
formbricks.setAttribute("Plan", "Free"); formbricks.setAttribute("Plan", "Free");
}} }}
className="mb-4 rounded-lg bg-slate-800 px-6 py-3 text-white hover:bg-slate-700 dark:bg-slate-700 dark:hover:bg-slate-600"> className="mb-4 rounded-lg bg-slate-800 px-6 py-3 text-white hover:bg-slate-700 dark:bg-slate-700 dark:hover:bg-slate-600">
Set Plan to &apos;Free&apos; Set Plan to &apos;Free&apos;
</button> </button>
</div> </div>
@@ -194,7 +192,7 @@ const AppPage = ({}) => {
onClick={() => { onClick={() => {
formbricks.setAttribute("Plan", "Paid"); formbricks.setAttribute("Plan", "Paid");
}} }}
className="mb-4 rounded-lg bg-slate-800 px-6 py-3 text-white hover:bg-slate-700 dark:bg-slate-700 dark:hover:bg-slate-600"> className="mb-4 rounded-lg bg-slate-800 px-6 py-3 text-white hover:bg-slate-700 dark:bg-slate-700 dark:hover:bg-slate-600">
Set Plan to &apos;Paid&apos; Set Plan to &apos;Paid&apos;
</button> </button>
</div> </div>
@@ -217,7 +215,7 @@ const AppPage = ({}) => {
onClick={() => { onClick={() => {
formbricks.setEmail("test@web.com"); formbricks.setEmail("test@web.com");
}} }}
className="mb-4 rounded-lg bg-slate-800 px-6 py-3 text-white hover:bg-slate-700 dark:bg-slate-700 dark:hover:bg-slate-600"> className="mb-4 rounded-lg bg-slate-800 px-6 py-3 text-white hover:bg-slate-700 dark:bg-slate-700 dark:hover:bg-slate-600">
Set Email Set Email
</button> </button>
</div> </div>
+6 -7
View File
@@ -1,9 +1,7 @@
import Image from "next/image"; import Image from "next/image";
import { useRouter } from "next/router"; import { useRouter } from "next/router";
import { useEffect, useState } from "react"; import { useEffect, useState } from "react";
import formbricks from "@formbricks/js/website"; import formbricks from "@formbricks/js/website";
import { SurveySwitch } from "../../components/SurveySwitch"; import { SurveySwitch } from "../../components/SurveySwitch";
import fbsetup from "../../public/fb-setup.png"; import fbsetup from "../../public/fb-setup.png";
@@ -36,7 +34,7 @@ const AppPage = ({}) => {
if (process.env.NEXT_PUBLIC_FORMBRICKS_ENVIRONMENT_ID && process.env.NEXT_PUBLIC_FORMBRICKS_API_HOST) { if (process.env.NEXT_PUBLIC_FORMBRICKS_ENVIRONMENT_ID && process.env.NEXT_PUBLIC_FORMBRICKS_API_HOST) {
const defaultAttributes = { const defaultAttributes = {
language: "de", language: "en",
}; };
formbricks.init({ formbricks.init({
@@ -58,9 +56,9 @@ const AppPage = ({}) => {
}); });
return ( return (
<div className="h-screen bg-white px-12 py-6 dark:bg-slate-800"> <div className="min-h-screen bg-white px-12 py-6 dark:bg-slate-800">
<div className="flex flex-col items-center justify-between md:flex-row"> <div className="flex flex-col justify-between md:flex-row">
<div className="flex items-center gap-2"> <div className="flex flex-col items-center gap-2 sm:flex-row">
<SurveySwitch value="website" formbricks={formbricks} /> <SurveySwitch value="website" formbricks={formbricks} />
<div> <div>
<h1 className="text-2xl font-bold text-slate-900 dark:text-white"> <h1 className="text-2xl font-bold text-slate-900 dark:text-white">
@@ -115,7 +113,7 @@ const AppPage = ({}) => {
</div> </div>
<div className="md:grid md:grid-cols-3"> <div className="md:grid md:grid-cols-3">
<div className="col-span-3 self-start rounded-lg border border-slate-300 bg-slate-100 p-6 dark:border-slate-600 dark:bg-slate-800"> <div className="col-span-3 self-start rounded-lg border border-slate-300 bg-slate-100 p-6 dark:border-slate-600 dark:bg-slate-900">
<h3 className="text-lg font-semibold dark:text-white"> <h3 className="text-lg font-semibold dark:text-white">
Reset person / pull data from Formbricks app Reset person / pull data from Formbricks app
</h3> </h3>
@@ -130,6 +128,7 @@ const AppPage = ({}) => {
}}> }}>
Reset Reset
</button> </button>
<p className="text-xs text-slate-700 dark:text-slate-300"> <p className="text-xs text-slate-700 dark:text-slate-300">
If you made a change in Formbricks app and it does not seem to work, hit &apos;Reset&apos; and If you made a change in Formbricks app and it does not seem to work, hit &apos;Reset&apos; and
try again. try again.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 15 KiB

-26
View File
@@ -1,26 +0,0 @@
@tailwind base;
@tailwind components;
@tailwind utilities;
/* Example on overriding packages/js colors */
.dark {
--fb-brand-color: red;
--fb-brand-text-color: white;
--fb-border-color: green;
--fb-border-color-highlight: var(--slate-500);
--fb-focus-color: red;
--fb-heading-color: yellow;
--fb-subheading-color: green;
--fb-info-text-color: orange;
--fb-signature-text-color: blue;
--fb-survey-background-color: black;
--fb-accent-background-color: rgb(13, 13, 12);
--fb-accent-background-color-selected: red;
--fb-placeholder-color: white;
--fb-shadow-color: yellow;
--fb-rating-fill: var(--yellow-300);
--fb-rating-hover: var(--yellow-500);
--fb-back-btn-border: currentColor;
--fb-submit-btn-border: transparent;
--fb-rating-selected: black;
}
+1 -1
View File
@@ -1,5 +1,5 @@
{ {
"extends": "@formbricks/tsconfig/nextjs.json", "extends": "@formbricks/config-typescript/nextjs.json",
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"], "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"],
"exclude": ["node_modules"] "exclude": ["node_modules"]
} }
+1 -2
View File
@@ -1,4 +1,3 @@
module.exports = { module.exports = {
root: true, extends: ["@formbricks/eslint-config/legacy-next.js"],
extends: ["formbricks"],
}; };
Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 53 KiB

+32 -25
View File
@@ -4,25 +4,20 @@ import I1 from "./images/I1.webp";
import I2 from "./images/I2.webp"; import I2 from "./images/I2.webp";
export const metadata = { export const metadata = {
title: "Using Actions in Formbricks | Fine-tuning User Moments", title: "Using Actions in Formbricks",
description: description:
"Dive deep into how actions in Formbricks help products and teams to engage users at precise moments in their journey. Discover the power of actions, from coding to no-code setups, to refine user targeting and generate richer, more detailed user insights.", "Dive deep into how actions in Formbricks help products and organizations to engage users at precise moments in their journey. Discover the power of actions, from coding to no-code setups, to refine user targeting and generate richer, more detailed user insights.",
}; };
#### App Surveys #### App Surveys
# Actions & Targeting # Actions
Understanding user thoughts and feelings at critical moments in their journey is pivotal. To achieve this, Formbricks uses user-centric actions that trigger surveys at precisely the right time. Actions are essentially notifications sent from your application to Formbricks when predefined user activities occur, making it possible to gather insights during key interactions. Actions are predefined events within your app that prompt Formbricks to display a survey when triggered. These are detected by the Formbricks widget, which then presents the appropriate survey based on your predefined settings.
<Note>
Ensure that youve **initialized Formbricks with a userId** to fully utilize this feature along with other
app survey capabilities.
</Note>
## **How Do Actions Work?** ## **How Do Actions Work?**
Actions in Formbricks App Surveys are deeply integrated with user activities within your app. When a user performs a specified action, the Formbricks widget detects this activity and can present a survey to that specific user if the trigger conditions match of that survey, while also recording the event. This capability ensures that surveys are not only triggered at the right time but are also tailored to the users recent interactions within the app. You can set up these actions through a user-friendly No-Code interface within the Formbricks dashboard. Actions in Formbricks App Surveys are deeply integrated with user activities within your app. When a user performs a specified action, the Formbricks widget detects this activity and can present a survey to that specific user if the trigger conditions match for that survey. This capability ensures that surveys are triggered at the right time. You can set up these actions through a user-friendly No-Code interface within the Formbricks dashboard.
## **Why Are Actions Useful?** ## **Why Are Actions Useful?**
@@ -30,8 +25,7 @@ Actions are invaluable for enhancing survey relevance and effectiveness:
- **Personalized Engagement**: Surveys triggered by user actions ensure content is highly relevant and engaging, matching each users current context. - **Personalized Engagement**: Surveys triggered by user actions ensure content is highly relevant and engaging, matching each users current context.
- **User Attributes**: By tying surveys to specific user attributes, such as activity levels or feature usage, you can customize the survey experience to reflect individual user profiles. - **User Attributes**: By tying surveys to specific user attributes, such as activity levels or feature usage, you can customize the survey experience to reflect individual user profiles.
- **User Segments**: Analyze action data to create detailed user segments, targeting specific groups with surveys that are pertinent to their behaviors or interactions within the app. - **User Targeting**: Precise targeting based on user attributes ensures that surveys are shown only to users who meet certain criteria, enhancing the relevance and effectiveness of each survey.
- **User Targeting**: Precise targeting based on user actions and attributes ensures that surveys are shown only to users who meet certain criteria, enhancing the relevance and effectiveness of each survey.
## **Setting Up No-Code Actions** ## **Setting Up No-Code Actions**
@@ -57,12 +51,35 @@ To add a No-Code Action:
className="max-w-full rounded-lg sm:max-w-3xl" className="max-w-full rounded-lg sm:max-w-3xl"
/> />
Here are three types of No-Code actions you can set up: Here are four types of No-Code actions you can set up:
### **1. Page URL Action** ### **1. Click Action**
Click Action is triggered when a user clicks on a specific element within your application. You can define the element's inner text or CSS selector to trigger the survey.
- **Inner Text**: Checks if the innerText of a clicked HTML element, like a button label, matches a specific text. This action allows you to display a survey based on text interactions within your application.
- **CSS Selector**: Verifies if a clicked HTML element matches a provided CSS selector, such as a class, ID, or any other CSS selector used in your website. It enables survey triggers based on element interactions.
### **2. Page view Action**
This action is triggered when a user visits a page within your application.
### **3. Exit Intent Action**
This action is triggered when a user is about to leave your application. It helps capture user feedback before they exit, providing valuable insights into user experiences and potential improvements.
### **4. 50% Scroll Action**
This action is triggered when a user scrolls through 50% of a page within your application. It helps capture user feedback at a specific point in their journey, enabling you to gather insights based on user interactions.
This action is triggered when a user visits a specific page within your application. You can define the URL match conditions as follows: This action is triggered when a user visits a specific page within your application. You can define the URL match conditions as follows:
<Note>
You can combine the url filters with any of the no-code actions to trigger the survey based on the URL match conditions.
### **URL Match Conditions**
- **exactMatch**: Triggers the action when the URL exactly matches the specified string. - **exactMatch**: Triggers the action when the URL exactly matches the specified string.
- **contains**: Activates when the URL contains the specified substring. - **contains**: Activates when the URL contains the specified substring.
- **startsWith**: Fires when the URL starts with the specified string. - **startsWith**: Fires when the URL starts with the specified string.
@@ -70,15 +87,7 @@ This action is triggered when a user visits a specific page within your applicat
- **notMatch**: Triggers when the URL does not match the specified condition. - **notMatch**: Triggers when the URL does not match the specified condition.
- **notContains**: Activates when the URL does not contain the specified substring. - **notContains**: Activates when the URL does not contain the specified substring.
### **2. innerText Action** </Note>
Checks if the innerText of a clicked HTML element, like a button label, matches a specific text. This action allows you to display a survey based on text interactions within your application.
### **3. CSS Selector Action**
This action verifies if a clicked HTML element matches a provided CSS selector, such as a class, ID, or any other CSS selector used in your website. It enables survey triggers based on element interactions.
<Note>You can have an action use combination of the 3 types as you wish</Note>
## **Setting Up Code Actions** ## **Setting Up Code Actions**
@@ -112,5 +121,3 @@ return <button onClick={handleClick}>Click Me</button>;
</CodeGroup> </CodeGroup>
</Col> </Col>
This documentation frames actions around user interactions, emphasizing the connection between the user's activities and the survey experience. By leveraging user-centric actions, you can create highly targeted and timely surveys that resonate with users and yield valuable insights.
@@ -1,34 +1,18 @@
import { MdxImage } from "@/components/MdxImage";
import { ResponsiveVideo } from "@/components/ResponsiveVideo";
import GermansGpt from "./germans-gpt.webp";
import Hni from "./hni.webp";
import PowerUsers from "./power-users.webp";
import RideHailing from "./ride-hailing.webp";
import UpsellMiro from "./upsell-miro.webp";
export const metadata = { export const metadata = {
title: "Advanced Targeting in Surveys | Formbricks", title: "Advanced Targeting for App Surveys | Formbricks",
description: description:
"Advanced Targeting allows you to show surveys to just the right group of people. You can target surveys based on user attributes, user events, metadata , literally anything! This helps you get more relevant feedback and make data-driven decisions. All of this without writing a single line of code.", "Advanced Targeting allows you to show surveys to just the right group of people. You can target surveys based on user attributes, metadata, and other segments. This helps you get more relevant feedback and make data-driven decisions.",
}; };
#### App Surveys #### App Surveys
# Advanced Targeting # Advanced Targeting
Advanced Targeting allows you to show surveys to the right group of people. You can target surveys based on user attributes, user events, and more instead of spraying and praying. This helps you get more relevant feedback and make data-driven decisions. All of this without writing a single line of code. Advanced Targeting allows you to show surveys to the right group of people. You can target surveys based on user attributes, device type, and more instead of spraying and praying. This helps you get more relevant feedback and make data-driven decisions. All of this without writing a single line of code.
<ResponsiveVideo title="Formbricks Multi-language Surveys" # How to setup Advanced Targeting
src="https://www.youtube-nocookie.com/embed/0BQp6N4cXzU?si=KeBM7G7Ch1xtrsOm&amp;controls=0" />
<Note>Advanced Targeting is only available on the Pro plan!</Note>
## How to setup Advanced Targeting
<Note>
Advanced Targeting is available on the Pro plan! Don't worry, you just need to enter your credit card
details to start the freemium plan.
</Note>
1. On the Formbricks dashboard, click on **People** tab from the top navigation bar. 1. On the Formbricks dashboard, click on **People** tab from the top navigation bar.
@@ -36,7 +20,7 @@ Advanced Targeting allows you to show surveys to the right group of people. You
3. Give your segment a title & a description to help you remember what this segment is about. 3. Give your segment a title & a description to help you remember what this segment is about.
4. Now click on the **Add Filter** button to add a filter. You can filter based on actions, user attributes, other segments, devices, and more. 4. Now click on the **Add Filter** button to add a filter. You can filter based on user attributes, other segments, devices, and more.
5. To group a set of filters together, click on the Three Dots icon on the right side of the filter and click on **Create Group**. 5. To group a set of filters together, click on the Three Dots icon on the right side of the filter and click on **Create Group**.
@@ -45,50 +29,3 @@ Advanced Targeting allows you to show surveys to the right group of people. You
7. Once you are happy with the segment, click on **Save Segment**. 7. Once you are happy with the segment, click on **Save Segment**.
8. Now, when you create a survey, you can select this segment to target your survey to. 8. Now, when you create a survey, you can select this segment to target your survey to.
## Examples:
1. Let's say you want to upsell to: Miro, Loom, Figma, Slack and Asana.
<MdxImage
src={UpsellMiro}
alt="Upselling Opportunity"
quality="100"
className="max-w-full rounded-lg sm:max-w-3xl"
/>
2. Post-experience surveying for a ride hailing app where users who have taken more than 1 ride are shown a survey.
<MdxImage
src={RideHailing}
alt="Ride Hailing Targeting"
quality="100"
className="max-w-full rounded-lg sm:max-w-3xl"
/>
3. Target High Value users who have $100k+ in their bank account, own 20+ stocks, and have are an active user.
<MdxImage
src={Hni}
alt="Target Active High Net Worth Individuals"
quality="100"
className="max-w-full rounded-lg sm:max-w-3xl"
/>
4. Target Germans on mobile phones who have regenerated chatGPT answers frequently in the last quarter and did so today.
<MdxImage
src={GermansGpt}
alt="Target Germans on Mobile Phones who have regenerated chatGPT answers frequently in the last quarter and did so today"
quality="100"
className="max-w-full rounded-lg sm:max-w-3xl"
/>
5. Sneak Peak: How we at Formbricks automate inviting power users to chat with us
<MdxImage
src={PowerUsers}
alt="Automate inviting power users to chat with us at Formbricks"
quality="100"
className="max-w-full rounded-lg sm:max-w-3xl"
/>
@@ -31,12 +31,18 @@ const libraries = [
description: "Simply add us to your router change and sit back!", description: "Simply add us to your router change and sit back!",
logo: logoVueJs, logo: logoVueJs,
}, },
{
href: "#react-native",
name: "React Native",
description: "Easily integrate our SDK with your React Native app for seamless survey support!",
logo: logoReactJs,
},
]; ];
export const Libraries = () => { export const Libraries = () => {
return ( return (
<div className="my-16 xl:max-w-none"> <div className="my-16 xl:max-w-none">
<div className="not-prose mt-4 grid grid-cols-1 gap-x-6 gap-y-10 border-slate-900/5 sm:grid-cols-2 xl:max-w-none xl:grid-cols-3 dark:border-white/5"> <div className="not-prose mt-4 grid grid-cols-1 gap-x-6 gap-y-10 border-slate-900/5 xl:max-w-none xl:grid-cols-2 2xl:grid-cols-3 dark:border-white/5">
{libraries.map((library) => ( {libraries.map((library) => (
<a <a
key={library.name} key={library.name}
@@ -69,18 +69,18 @@ Refer to our [Example HTML project](https://github.com/formbricks/examples/tree/
## ReactJS ## ReactJS
Install the Formbricks SDK using one of the package managers ie `npm`,`pnpm`,`yarn`. Install the Formbricks SDK using one of the package managers ie `npm`,`pnpm`,`yarn`. Note that zod is required as a peer dependency must also be installed in your project.
<Col> <Col>
<CodeGroup title="Install Formbricks JS library"> <CodeGroup title="Install Formbricks JS library">
```shell {{ title: 'npm' }} ```shell {{ title: 'npm' }}
npm install @formbricks/js npm install @formbricks/js zod
``` ```
```shell {{ title: 'pnpm' }} ```shell {{ title: 'pnpm' }}
pnpm add @formbricks/js pnpm add @formbricks/js zod
``` ```
```shell {{ title: 'yarn' }} ```shell {{ title: 'yarn' }}
yarn add @formbricks/js yarn add @formbricks/js zod
``` ```
</CodeGroup> </CodeGroup>
@@ -142,13 +142,13 @@ Code snippets for the integration for both conventions are provided to further a
<Col> <Col>
<CodeGroup title="Install Formbricks JS library"> <CodeGroup title="Install Formbricks JS library">
```shell {{ title: 'npm' }} ```shell {{ title: 'npm' }}
npm install @formbricks/js npm install @formbricks/js zod
``` ```
```shell {{ title: 'pnpm' }} ```shell {{ title: 'pnpm' }}
pnpm add @formbricks/js pnpm add @formbricks/js zod
``` ```
```shell {{ title: 'yarn' }} ```shell {{ title: 'yarn' }}
yarn add @formbricks/js yarn add @formbricks/js zod
``` ```
</CodeGroup> </CodeGroup>
@@ -164,7 +164,6 @@ yarn add @formbricks/js
import { usePathname, useSearchParams } from "next/navigation"; import { usePathname, useSearchParams } from "next/navigation";
import { useEffect } from "react"; import { useEffect } from "react";
import formbricks from "@formbricks/js/app"; import formbricks from "@formbricks/js/app";
export default function FormbricksProvider() { export default function FormbricksProvider() {
@@ -218,7 +217,6 @@ Refer to our [Example NextJS App Directory project](https://github.com/formbrick
// other import // other import
import { useRouter } from "next/router"; import { useRouter } from "next/router";
import { useEffect } from "react"; import { useEffect } from "react";
import formbricks from "@formbricks/js/app"; import formbricks from "@formbricks/js/app";
if (typeof window !== "undefined") { if (typeof window !== "undefined") {
@@ -348,6 +346,66 @@ router.afterEach((to, from) => {
Refer to our [Example VueJs project](https://github.com/formbricks/examples/tree/main/vuejs) for more help! Now visit the [Validate your Setup](#validate-your-setup) section to verify your setup! Refer to our [Example VueJs project](https://github.com/formbricks/examples/tree/main/vuejs) for more help! Now visit the [Validate your Setup](#validate-your-setup) section to verify your setup!
## React Native
Install the Formbricks React Native SDK using one of the package managers, i.e., npm, pnpm, or yarn.
<Col>
<CodeGroup title="Install Formbricks JS library">
```shell {{ title: 'npm' }}
npm install @formbricks/react-native
```
```shell {{ title: 'pnpm' }}
pnpm add @formbricks/react-native
```
```shell {{ title: 'yarn' }}
yarn add @formbricks/react-native
```
</CodeGroup>
</Col>
Now, update your App.js/App.tsx file to initialize Formbricks:
<Col>
<CodeGroup title="src/App.js">
```js
// other imports
import Formbricks from "@formbricks/react-native";
const config = {
environmentId: "<environment-id>",
apiHost: "<api-host>",
userId: "<user-id>",
};
export default function App() {
return (
<>
{/* Your app content */}
<Formbricks initConfig={config} />
</>
);
}
```
</CodeGroup>
</Col>
### Required customizations to be made
<Properties>
<Property name="environment-id" type="string">
Formbricks Environment ID.
</Property>
<Property name="api-host" type="string">
URL of the hosted Formbricks instance.
</Property>
<Property name="userId" type="string">
User ID of the user who has active session.
</Property>
</Properties>
---
## Validate your setup ## Validate your setup
Once you have completed the steps above, you can validate your setup by checking the **Setup Checklist** in the Settings. Your widget status indicator should go from this: Once you have completed the steps above, you can validate your setup by checking the **Setup Checklist** in the Settings. Your widget status indicator should go from this:
Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 34 KiB

@@ -19,7 +19,7 @@ export const metadata = {
# Quickstart # Quickstart
App surveys have 6-10x better conversion rates than emailed out surveys. This tutorial explains how to run an app survey in your web app in 10 to 15 minutes. Lets go! App surveys have 6-10x better conversion rates than emailed surveys. This tutorial explains how to run a survey in both your web app and mobile app (React Native) in just 10 to 15 minutes. Lets go!
<Note> <Note>
App Surveys are ideal for websites that **have a user authentication** system. If you are looking to run App Surveys are ideal for websites that **have a user authentication** system. If you are looking to run
@@ -37,7 +37,7 @@ App surveys have 6-10x better conversion rates than emailed out surveys. This tu
src={I1} src={I1}
alt="Choose website survey from survey type" alt="Choose website survey from survey type"
quality="100" quality="100"
className="max-w-full rounded-lg sm:max-w-3xl " className="max-w-full rounded-lg sm:max-w-3xl"
/> />
2. **Connect your App/Website**: Once you get through a couple of onboarding steps, youll be asked to connect your app or website. This is where youll find the code snippet for both HTML as well as the npm package which you need to embed in your app: 2. **Connect your App/Website**: Once you get through a couple of onboarding steps, youll be asked to connect your app or website. This is where youll find the code snippet for both HTML as well as the npm package which you need to embed in your app:
@@ -41,9 +41,7 @@ To run the Churn Survey in your app you want to proceed as follows:
4. Prevent that churn! 4. Prevent that churn!
<Note> <Note>
## Formbricks Widget running? ## Formbricks Widget running? We assume that you have already installed the Formbricks Widget in your web app. Its required to display messages and surveys in your app. If not, please follow the [Quick Start Guide (takes 15mins max.)](/app-surveys/quickstart)
We assume that you have already installed the Formbricks Widget in your web app. Its required to display messages and surveys in your app. If not, please follow the [Quick Start Guide
(takes 15mins max.)](/app-surveys/quickstart)
</Note> </Note>
### 1. Create new Churn Survey ### 1. Create new Churn Survey
@@ -80,9 +78,9 @@ In this case, you dont really need to pre-segment your audience. You likely w
### 4. Set up a trigger ### 4. Set up a trigger
To create the trigger for your Churn Survey, you have two options to choose from: To create the trigger for your Churn Survey, you have three options to choose from:
1. **Trigger by innerText:** You likely have a “Cancel Subscription” button in your app. You can setup a user Action with the according `innerText` to trigger the survey, like so: 1. **Trigger by Inner Text:** You likely have a “Cancel Subscription” button in your app. You can setup a user Action with the according `Inner Text` to trigger the survey, like so:
<MdxImage <MdxImage
src={TriggerInnerText} src={TriggerInnerText}
@@ -100,7 +98,7 @@ To create the trigger for your Churn Survey, you have two options to choose from
className="max-w-full rounded-lg sm:max-w-3xl" className="max-w-full rounded-lg sm:max-w-3xl"
/> />
3. **Trigger by pageURL:** Lastly, you could also display your survey on a subpage “/subscription-cancelled” where you forward users once they cancelled the trial subscription. You can then create a user Action with the type `pageURL` with the following settings: 1. **Trigger by page view filters:** Lastly, you could also display your survey on a subpage “/subscription-cancelled” where you forward users once they cancelled the trial subscription. You can then create a user Action with the type `Page View` and add select `Limit to specific pages` to add url filters, with the following settings:
<MdxImage <MdxImage
src={TriggerPageUrl} src={TriggerPageUrl}
@@ -111,7 +109,7 @@ To create the trigger for your Churn Survey, you have two options to choose from
Whenever a user visits this page, matches the filter conditions above and the recontact options (below) the survey will be displayed ✅ Whenever a user visits this page, matches the filter conditions above and the recontact options (below) the survey will be displayed ✅
Here is our complete [Actions manual](/actions/why) covering [Code](/actions/code) and [No-Code](/actions/no-code) Actions. Here is our complete [Actions manual](/app-surveys/actions/) covering [No-Code](/app-surveys/actions#setting-up-no-code-actions) and [Code](/app-surveys/actions#setting-up-code-actions) Actions.
<Note> <Note>
## Pre-churn flow coming soon Were currently building full-screen survey pop-ups. Youll be able to prevent ## Pre-churn flow coming soon Were currently building full-screen survey pop-ups. Youll be able to prevent
Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 55 KiB

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 45 KiB

After

Width:  |  Height:  |  Size: 59 KiB

@@ -129,10 +129,8 @@ Locate that file. We are using the [Tailwind Template “Syntax”](https://tail
```tsx ```tsx
import { useRouter } from "next/router"; import { useRouter } from "next/router";
import { useState } from "react"; import { useState } from "react";
import { Button } from "@formbricks/ui/components/Button";
import { Button } from "@formbricks/ui/Button"; import { Popover, PopoverContent, PopoverTrigger } from "@formbricks/ui/components/Popover";
import { Popover, PopoverContent, PopoverTrigger } from "@formbricks/ui/Popover";
import { handleFeedbackSubmit, updateFeedback } from "../../lib/handleFeedbackSubmit"; import { handleFeedbackSubmit, updateFeedback } from "../../lib/handleFeedbackSubmit";
export const DocsFeedback = () => { export const DocsFeedback = () => {
Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 59 KiB

@@ -38,9 +38,10 @@ To run the Feature Chaser survey in your app you want to proceed as follows:
2. Setup a user action to display survey at the right point in time 2. Setup a user action to display survey at the right point in time
<Note> <Note>
## Formbricks Widget running? ## Formbricks Widget running?
We assume that you have already installed the Formbricks Widget in your web wapp. Its required to display messages and surveys in your app. If not, please follow the [Quick Start Guide We assume that you have already installed the Formbricks Widget in your web
(takes 15mins max.)](/app-surveys/quickstart) wapp. Its required to display messages and surveys in your app. If not, please follow the [Quick Start
Guide (takes 15mins max.)](/app-surveys/quickstart)
</Note> </Note>
### 1. Create new Feature Chaser ### 1. Create new Feature Chaser
@@ -73,11 +74,11 @@ Save, and move over to where the magic happens: The “Audience” tab.
Before setting the right trigger, you need to identify a user action in your app which signals, that they have just used the feature you want to understand better. In most cases, it is clicking a specific button in your product. Before setting the right trigger, you need to identify a user action in your app which signals, that they have just used the feature you want to understand better. In most cases, it is clicking a specific button in your product.
You can create [Code Actions](/actions/code) and [No Code Actions](/actions/no-code) to follow users through your app. In this example, we will create a No Code Action. You can create [Code Actions](/app-surveys/actions#setting-up-code-actions) and [No Code Actions](/app-surveys/actions#setting-up-no-code-actions) to follow users through your app. In this example, we will create a No Code Action.
There are two ways to track a button: There are two ways to track a button:
1. **Trigger by innerText:** You might have a button with a unique text at the end of your feature e.g. "Export Report". You can setup a user Action with the according `innerText` to trigger the survey, like so: 1. **Trigger by Inner Text:** You might have a button with a unique text at the end of your feature e.g. "Export Report". You can setup a user Action with the according `Inner Text` to trigger the survey, like so:
<MdxImage <MdxImage
src={ActionText} src={ActionText}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

After

Width:  |  Height:  |  Size: 57 KiB

@@ -65,19 +65,18 @@ Change the questions and answer options according to your preference:
### 3. Create user action to trigger Feedback Box: ### 3. Create user action to trigger Feedback Box:
Go to the “Audience” tab, find the “When to send” card and choose “Add Action”. We will now use our super cool No-Code User Action Tracker: Go to the “Audience” tab, find the “When to send” card and choose “Add Action”. We will now use our super cool User Action Tracker:
<MdxImage src={AddAction} alt="Add action" quality="100" className="max-w-full rounded-lg sm:max-w-3xl" /> <MdxImage src={AddAction} alt="Add action" quality="100" className="max-w-full rounded-lg sm:max-w-3xl" />
We have two options to track the Feedback Button in your application: innerText and CSS-Selector: We have two options to track the Feedback Button in your application: innerText and CSS-Selector:
1. **innerText:** This means that whenever a user clicks any HTML item in your app which has an `innerText` of `Feedback` the Feedback Box will be displayed. 1. **Inner Text:** This means that whenever a user clicks any HTML item in your app which has an `Inner Text` of `Feedback` the Feedback Box will be displayed.
2. **CSS-Selector:** This means that when an element with a specific CSS-Selector like `#feedback-button` is clicked, your Feedback Box is triggered.
<div className="grid max-w-full grid-cols-2 space-x-2 sm:max-w-3xl"> <MdxImage src={ActionText} alt="Add HTML action" quality="100" className="rounded-lg" />
<MdxImage src={ActionText} alt="Add HTML action" quality="100" className="rounded-lg" />
<MdxImage src={ActionCSS} alt="Add CSS action" quality="100" className="rounded-lg" /> 2. **CSS Selector:** This means that when an element with a specific CSS-Selector like `#feedback-button` is clicked, your Feedback Box is triggered.
</div> <MdxImage src={ActionCSS} alt="Add CSS action" quality="100" className="rounded-lg" />
### 4. Select action in the “When to ask” card ### 4. Select action in the “When to ask” card
Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

After

Width:  |  Height:  |  Size: 64 KiB

@@ -38,9 +38,8 @@ To display the Trial Conversion Survey in your app you want to proceed as follow
3. Print that 💸 3. Print that 💸
<Note> <Note>
## Formbricks Widget running? ## Formbricks Widget running?
We assume that you have already installed the Formbricks Widget in your web app. Its required to display messages and surveys in your app. If not, please follow the [Quick Start Guide We assume that you have already installed the Formbricks Widget in your web app. Its required to display messages and surveys in your app. If not, please follow the [Quick Start Guide (takes 15mins max.)](/app-surveys/quickstart)
(takes 15mins max.)](/app-surveys/quickstart)
</Note> </Note>
### 1. Create new Trial Conversion Survey ### 1. Create new Trial Conversion Survey
@@ -84,7 +83,7 @@ Pre-segmentation isn't relevant for this survey because you likely want to solve
How you trigger your survey depends on your product. There are two options: How you trigger your survey depends on your product. There are two options:
1. **Trigger by pageURL:** Lets say you have a page under “/trial-cancelled” where you forward users once they cancelled the trial subscription. You can then create an user Action with the type `pageURL` with the following settings: 1. **Trigger by Page view:** Lets say you have a page under “/trial-cancelled” where you forward users once they cancelled the trial subscription. You can then create an user Action with the type `Page View` and add select `Limit to specific pages` to add url filters, with the following settings:
<MdxImage <MdxImage
src={ActionPageurl} src={ActionPageurl}
@@ -95,7 +94,7 @@ How you trigger your survey depends on your product. There are two options:
Whenever a user visits this page, the survey will be displayed ✅ Whenever a user visits this page, the survey will be displayed ✅
2. **Trigger by Button Click:** In a different case, you have a “Cancel Trial button in your app. You can setup a user Action with the according `innerText` like so: 2. **Trigger by Button Click:** In a different case, you have a “Cancel Trial" button in your app. You can setup a user Action with the according `Inner Text` like so:
<MdxImage <MdxImage
src={ActionText} src={ActionText}
@@ -104,7 +103,7 @@ Whenever a user visits this page, the survey will be displayed ✅
className="max-w-full rounded-lg sm:max-w-3xl" className="max-w-full rounded-lg sm:max-w-3xl"
/> />
Please have a look at our complete [Actions manual](/actions/why) if you have questions. Please have a look at our complete [Actions manual](/app-surveys/actions/) if you have questions.
### 5. Select Action in the “When to ask” card ### 5. Select Action in the “When to ask” card
Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 48 KiB

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 34 KiB

@@ -43,9 +43,8 @@ To display an Interview Prompt in your app you want to proceed as follows:
3. Thats it! 🎉 3. Thats it! 🎉
<Note> <Note>
## Formbricks Widget running? ## Formbricks Widget running?
We assume that you have already installed the Formbricks Widget in your web app. Its required to display messages and surveys in your app. If not, please follow the [Quick Start Guide We assume that you have already installed the Formbricks Widget in your web app. Its required to display messages and surveys in your app. If not, please follow the [Quick Start Guide (15mins).](/app-surveys/quickstart)
(15mins).](/app-surveys/quickstart)
</Note> </Note>
### 1. Create new Interview Prompt ### 1. Create new Interview Prompt
@@ -86,9 +85,7 @@ Save, and move over to the “Audience” tab.
### 3. Pre-segment your audience (coming soon) ### 3. Pre-segment your audience (coming soon)
<Note> <Note>
## Filter by attribute coming soon. ## Filter by attribute coming soon. We're working on pre-segmenting users by attributes. We will update this manual in the next few days.
We're working on pre-segmenting users by attributes. We will update this
manual in the next few days.
</Note> </Note>
Once you clicked over to the “Audience” tab you can change the settings. In the **Who To Send** card, select “Filter audience by attribute”. This allows you to only show the prompt to a specific segment of your user base. Once you clicked over to the “Audience” tab you can change the settings. In the **Who To Send** card, select “Filter audience by attribute”. This allows you to only show the prompt to a specific segment of your user base.
@@ -99,13 +96,13 @@ Great, now only the “Power User” segment will see our Interview Prompt. But
### 4. Set up a trigger for the Interview Prompt: ### 4. Set up a trigger for the Interview Prompt:
To create the trigger to show your Interview Prompt, go to the “Audience” tab, find the “When to send” card and choose “Add Action”. We will now use our super cool No-Code User Action Tracker: To create the trigger to show your Interview Prompt, go to the “Audience” tab, find the “When to send” card and choose “Add Action”. We will now use our super cool User Action Tracker:
<MdxImage src={AddAction} alt="Add action" quality="100" className="max-w-full rounded-lg sm:max-w-3xl" /> <MdxImage src={AddAction} alt="Add action" quality="100" className="max-w-full rounded-lg sm:max-w-3xl" />
Generally, we have two types of user actions: Page views and clicks. The Interview Prompt, youll likely want to display it on a page visit since you already filter who sees the prompt by attributes. Generally, we have two types of user actions: Page views and clicks. The Interview Prompt, youll likely want to display it on a page visit since you already filter who sees the prompt by attributes.
1. **pageURL:** Whenever a user visits a page the survey will be displayed, as long as the other conditions match. Other conditions are pre-segmentation, if this user has seen a survey in the past 2 weeks, etc. 1. **Page view:** Whenever a user visits a page the survey will be displayed, as long as the other conditions match. Other conditions are pre-segmentation, if this user has seen a survey in the past 2 weeks, etc.
<MdxImage <MdxImage
src={ActionPageurl} src={ActionPageurl}
@@ -114,7 +111,7 @@ Generally, we have two types of user actions: Page views and clicks. The Intervi
className="max-w-full rounded-lg sm:max-w-3xl" className="max-w-full rounded-lg sm:max-w-3xl"
/> />
2. **innerText & CSS-Selector:** When a user clicks an element (like a button) with a specific text content or CSS selector, the prompt will be displayed as long as the other conditions also match. 2. **Click(Inner Text & CSS Selector):** When a user clicks an element (like a button) with a specific text content or CSS selector, the prompt will be displayed as long as the other conditions also match.
<div className="grid max-w-full grid-cols-2 space-x-2 sm:max-w-3xl"> <div className="grid max-w-full grid-cols-2 space-x-2 sm:max-w-3xl">
<MdxImage src={ActionCSS} alt="Add CSS action" quality="100" className="rounded-lg" /> <MdxImage src={ActionCSS} alt="Add CSS action" quality="100" className="rounded-lg" />
@@ -146,8 +143,7 @@ Scroll down to “Recontact Options”. Here you have to choose the correct sett
<MdxImage src={Publish} alt="Publish survey" quality="100" className="max-w-full rounded-lg sm:max-w-3xl" /> <MdxImage src={Publish} alt="Publish survey" quality="100" className="max-w-full rounded-lg sm:max-w-3xl" />
<Note> <Note>
## Formbricks Widget running? ## Formbricks Widget running? You need to have the Formbricks Widget installed to display the Feedback Box in your app. Please follow [this tutorial (Step 4 onwards)](/app-surveys/quickstart) to install the widget.
You need to have the Formbricks Widget installed to display the Feedback Box in your app. Please follow [this tutorial (Step 4 onwards)](/app-surveys/quickstart) to install the widget.
</Note> </Note>
### ###
Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 48 KiB

After

Width:  |  Height:  |  Size: 55 KiB

@@ -37,8 +37,8 @@ To display the Product-Market Fit survey in your app you want to proceed as foll
3. Setup the user action to display survey at good point in time 3. Setup the user action to display survey at good point in time
<Note> <Note>
## Formbricks Widget running? ## Formbricks Widget running? We assume that you have already installed the Formbricks Widget in your web
We assume that you have already installed the Formbricks Widget in your web app. Its required to display messages and surveys in your app. If not, please follow the [Quick Start Guide app. Its required to display messages and surveys in your app. If not, please follow the [Quick Start Guide
(15mins).](/app-surveys/quickstart) (15mins).](/app-surveys/quickstart)
</Note> </Note>
@@ -70,28 +70,15 @@ _Want to change the button color? You can do so in the product settings!_
Save, and move over to where the magic happens: The “Audience” tab. Save, and move over to where the magic happens: The “Audience” tab.
### 3. Pre-segment your audience (coming soon) ### 3. Pre-segment your audience
<Note>
## Filter by attribute coming soon We're working on pre-segmenting users by attributes. We will update this
manual in the next days.
</Note>
To run this survey properly, you should pre-segment your user base. As touched upon earlier: if you ask every user youll get lots of opinions which are often misleading. You only want to gather feedback from people who invested the time to get to know and use your product: To run this survey properly, you should pre-segment your user base. As touched upon earlier: if you ask every user youll get lots of opinions which are often misleading. You only want to gather feedback from people who invested the time to get to know and use your product:
**Filter by attribute**: You can keep the logic to decide if a user has (or has not) experienced value in your application. This makes most sense if you want to use historic usage data to decide if a user qualifies or not. Create your logic and if it applies, send an attribute to Formbricks by e.g. `formbricks.setAttribute("Loyalty", "Experienced Value");` Here is the full manual on how to [set attributes](/app-surveys/user-identification). **Filter by attribute**: You can keep the logic to decide if a user has (or has not) experienced value in your application. This makes most sense if you want to use historic usage data to decide if a user qualifies or not. Create your logic and if it applies, send an attribute to Formbricks by e.g. `formbricks.setAttribute("Loyalty", "Experienced Value");` Here is the full manual on how to [set attributes](/app-surveys/user-identification).
**Filter by actions (coming soon)**: Later, you can also segment users based on events tracked with Formbricks. However, this makes it impossible to use historic usage data (pre Formbricks usage). Here we will have a few options to achieve that:
- Check the time passed since sign-up (e.g. signed up 4 weeks ago)
- User has performed a specific action a certain number of times or (e.g. created 5 reports)
- User has performed a combination of actions (e.g. created a report **and** invited a team member)
This way you make sure that you separate potentially misleading opinions from valuable insights.
### 4. Set up a trigger for the Product-Market Fit survey: ### 4. Set up a trigger for the Product-Market Fit survey:
You need a trigger to display the survey but in this case, the filtering does all the work. Its up to you to decide to display the survey after the user viewed a specific subpage (pageURL) or after clicking an element. Have a look at the [Actions manual](/actions/why) if you are not sure how to set them up: You need a trigger to display the survey but in this case, the filtering does all the work. Its up to you to decide to display the survey after the user viewed a specific subpage (pageURL) or after clicking an element. Have a look at the [Actions manual](/app-surveys/actions/) if you are not sure how to set them up:
<Col> <Col>
@@ -79,28 +79,6 @@ Promise<{ id: string }, NetworkError | Error>
</CodeGroup> </CodeGroup>
</Col> </Col>
- Update Display
<Col>
<CodeGroup title="Update Display">
```javascript {{ title: 'Update Display Method Call'}}
await api.client.display.update(
displayId: "<your-display-id>",
{
userId: "<your-user-id>", // optional
responseId: "<your-response-id>", // optional
},
);
```
```javascript {{ title: 'Update Display Method Return Type' }}
Promise<{ }, NetworkError | Error]>
```
</CodeGroup>
</Col>
## Responses ## Responses
- Create Response - Create Response
@@ -173,29 +151,6 @@ Promise<{ }, NetworkError | Error]>
</CodeGroup> </CodeGroup>
</Col> </Col>
## Action
- Create Action:
<Note> An environment cannot have 2 actions with the same name. </Note>
<Col>
<CodeGroup title="Create Action">
```javascript {{ title: 'Create Action Method Call'}}
await api.client.action.create({
name: "<your-action-name>", // required
userId: "<your-user-id>", // required
});
```
```javascript {{ title: 'Create Action Method Return Type' }}
Promise<{ }, NetworkError | Error]>
```
</CodeGroup>
</Col>
## Attribute ## Attribute
- Update Attribute - Update Attribute
Binary file not shown.

Before

Width:  |  Height:  |  Size: 80 KiB

After

Width:  |  Height:  |  Size: 56 KiB

@@ -7,16 +7,16 @@ import I3 from "./images/3-survey-logs-in-app-survey-popup.webp";
export const metadata = { export const metadata = {
title: "Formbricks App Survey SDK", title: "Formbricks App Survey SDK",
description: description:
"An overview of all available methods & how to integrate Formbricks App Surveys for frontend developers in web applications. Learn the key methods, configuration settings, and best practices.", "Integrate Formbricks App Surveys into your web apps with the Formbricks JS SDK for App Surveys. Learn how to initialize Formbricks, set attributes, track actions, and troubleshoot common issues.",
}; };
#### Developer Docs #### Developer Docs
# SDK: App Survey # SDK: Run Surveys Inside Your Web Apps
### Overview ### Overview
The Formbricks JS SDK is a 2-in-1 SDK for seamlessly integrating both App Surveys and Website Surveys into your projects. In this section, we'll explore how to leverage the SDK specifically for **app** surveys. Its available on npm [here](https://www.npmjs.com/package/@formbricks/js/). The Formbricks JS SDK is a 2-in-1 SDK for seamlessly integrating both App Surveys and Website Surveys into your projects. In this section, we'll explore how to leverage the SDK specifically for **app** surveys. Its available on npm [here](https://www.npmjs.com/package/@formbricks/js/).
### Install ### Install
@@ -26,9 +26,11 @@ The Formbricks JS SDK is a 2-in-1 SDK for seamlessly integrating both App Survey
```js {{ title: 'npm' }} ```js {{ title: 'npm' }}
npm install @formbricks/js npm install @formbricks/js
``` ```
```js {{ title: 'yarn' }} ```js {{ title: 'yarn' }}
yarn add @formbricks/js yarn add @formbricks/js
``` ```
```js {{ title: 'pnpm' }} ```js {{ title: 'pnpm' }}
pnpm add @formbricks/js pnpm add @formbricks/js
``` ```
@@ -51,9 +53,10 @@ import formbricks from "@formbricks/js/app";
formbricks.init({ formbricks.init({
environmentId: "<your-environment-id>", // required environmentId: "<your-environment-id>", // required
apiHost: "<your-api-host>", // required apiHost: "<your-api-host>", // required
userId: "<user-id>" // required userId: "<user-id>", // required
}); });
``` ```
</CodeGroup> </CodeGroup>
</Col> </Col>
@@ -67,15 +70,16 @@ Formbricks JS is a client SDK meant to be run client-side in their browser so ma
```js ```js
if (window !== undefined) { if (window !== undefined) {
formbricks.init({ formbricks.init({
environmentId: "<your-environment-id>", environmentId: "<your-environment-id>",
apiHost: "<your-api-host>", apiHost: "<your-api-host>",
userId: "<user-id>" userId: "<user-id>",
}); });
} else { } else {
console.error("Window object not accessible to init Formbricks"); console.error("Window object not accessible to init Formbricks");
} }
``` ```
</CodeGroup> </CodeGroup>
</Col> </Col>
@@ -91,6 +95,7 @@ You can set custom attributes for the identified user. This can be helpful for s
```js ```js
formbricks.setAttribute("Plan", "Paid"); formbricks.setAttribute("Plan", "Paid");
``` ```
</CodeGroup> </CodeGroup>
</Col> </Col>
@@ -104,10 +109,10 @@ Track user actions to trigger surveys based on user interactions, such as button
```js ```js
formbricks.track("Clicked on Claim"); formbricks.track("Clicked on Claim");
``` ```
</CodeGroup> </CodeGroup>
</Col> </Col>
### Logout ### Logout
To log out and deinitialize Formbricks, use the formbricks.logout() function. This action clears the current initialization configuration and erases stored frontend information, such as the surveys a user has viewed or completed. It's an important step when a user logs out of your application or when you want to reset Formbricks. To log out and deinitialize Formbricks, use the formbricks.logout() function. This action clears the current initialization configuration and erases stored frontend information, such as the surveys a user has viewed or completed. It's an important step when a user logs out of your application or when you want to reset Formbricks.
@@ -118,6 +123,7 @@ To log out and deinitialize Formbricks, use the formbricks.logout() function. Th
```js ```js
formbricks.logout(); formbricks.logout();
``` ```
</CodeGroup> </CodeGroup>
</Col> </Col>
@@ -133,6 +139,7 @@ Reset the current instance and fetch the latest surveys and state again:
```js ```js
formbricks.reset(); formbricks.reset();
``` ```
</CodeGroup> </CodeGroup>
</Col> </Col>
@@ -140,7 +147,11 @@ formbricks.reset();
Listen for page changes and dynamically show surveys configured via no-code actions in the Formbricks app: Listen for page changes and dynamically show surveys configured via no-code actions in the Formbricks app:
<Note> This is only needed when your framework has a custom routing system and you want to trigger surveys on route changes. For example: NextJs</Note> <Note>
{" "}
This is only needed when your framework has a custom routing system and you want to trigger surveys on route
changes. For example: NextJs
</Note>
<Col> <Col>
<CodeGroup> <CodeGroup>
@@ -148,6 +159,7 @@ Listen for page changes and dynamically show surveys configured via no-code acti
```js ```js
formbricks.registerRouteChange(); formbricks.registerRouteChange();
``` ```
</CodeGroup> </CodeGroup>
</Col> </Col>
@@ -167,7 +179,7 @@ In case you dont see your survey right away, here's what you can do. Go throu
### Formbricks Cloud and your app are not connected properly. ### Formbricks Cloud and your app are not connected properly.
Go back to [app.formbricks.com](http://app.formbricks.com) or your self-hosted instance's URL and go to the Setup Checklist in the Settings. If the status is still indicated as “Not connected” your app hasn't yet pinged the Formbricks Cloud: Go back to [app.formbricks.com](http://app.formbricks.com) or your self-hosted instance's URL and go to the App connection in the Configuration. If the status is still indicated as “Not connected” your app hasn't yet pinged the Formbricks Cloud:
<MdxImage <MdxImage
src={I1} src={I1}

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Before

Width:  |  Height:  |  Size: 62 KiB

After

Width:  |  Height:  |  Size: 62 KiB

@@ -0,0 +1,66 @@
import { MdxImage } from "@/components/MdxImage";
import GithubCodespaceLoading from "./images/loading.webp";
import GithubCodespaceNew from "./images/new.webp";
import GithubCodespacePorts from "./images/ports.webp";
export const metadata = {
title: "Formbricks Open Source Contribution Guide: How to Enhance yourself and Contribute to Formbricks",
description:
"Join the Formbricks community and learn how to effectively contribute. From raising issues and feature requests to creating PRs, discover the best practices and communicate with our responsive team on Discord",
};
#### Contributing
# Github Codespaces Guide
1. After clicking the one-click setup button, you will be redirected to the Github Codespaces page. Review the configuration and click on the 'Create Codespace' button to create a new Codespace.
<MdxImage
src={GithubCodespaceNew}
alt="New Github Codespace"
quality="100"
className="max-w-full rounded-lg sm:max-w-3xl"
/>
2. This will start loading the Codespace. Keep in mind this might take a few minutes to complete depending on your internet connection and the instance availability.
<MdxImage
src={GithubCodespaceLoading}
alt="Loading Github Codespace"
quality="100"
className="max-w-full rounded-lg sm:max-w-3xl"
/>
3. Once the Codespace is loaded, you will be redirected to the VSCode editor. You can start working on your project in this environment.
4. Monitor the logs in the terminal and once you see the following, you are good to go!
<Col>
<CodeGroup title="The WebApp is running">
```bash
@formbricks/web:dev: ▲ Next.js 13.5.6
@formbricks/web:dev: - Local: http://localhost:3000
@formbricks/web:dev: - Environments: .env
@formbricks/web:dev: - Experiments (use at your own risk):
@formbricks/web:dev: · serverActions
@formbricks/web:dev:
@formbricks/web:dev: ✓ Ready in 9.4s
```
</CodeGroup>
</Col>
5. Right next to the Terminal, you will see a **Ports** tab, click on it to see the ports and their respective URLs. Now access the Forwarded Address for port 3000 and you should be able to visit your Formbricks App!
<MdxImage
src={GithubCodespacePorts}
alt="Github Codespace Ports"
quality="100"
className="max-w-full rounded-lg sm:max-w-3xl"
/>
Now make the changes you want to and see them live in action!
@@ -1,5 +1,9 @@
import { Accordion, AccordionContent, AccordionItem, AccordionTrigger } from "@formbricks/ui/Accordion"; import {
Accordion,
AccordionContent,
AccordionItem,
AccordionTrigger,
} from "@formbricks/ui/components/Accordion";
import { FaqJsonLdComponent } from "./FAQPageJsonLd"; import { FaqJsonLdComponent } from "./FAQPageJsonLd";
const FAQ_DATA = [ const FAQ_DATA = [
@@ -0,0 +1,170 @@
import { MdxImage } from "@/components/MdxImage";
export const metadata = {
title: "Formbricks Open Source Contribution Guide: How to Enhance yourself and Contribute to Formbricks",
description:
"Join the Formbricks community and learn how to effectively contribute. From raising issues and feature requests to creating PRs, discover the best practices and communicate with our responsive team on Discord",
};
#### Contributing
# Get started
We are so happy that you are interested in contributing to Formbricks 🤗 There are many ways to contribute to Formbricks like writing issues, fixing bugs, building new features or updating the docs.
- **Issues**: Spotted a bug? Has deployment gone wrong? Do you have user feedback? [Raise an issue](https://github.com/formbricks/formbricks/issues/new/choose) for the fastest response.
- **Feature requests**: Raise an issue for these and tag it as an Enhancement. We love every idea. Please [open a feature request](https://github.com/formbricks/formbricks/issues/new?assignees=&labels=enhancement&projects=&template=feature_request.yml&title=%5BFEATURE%5D) clearly describing the problem you want to solve.
- **How we Code at Formbricks**: [View this Notion document](https://formbricks.notion.site/How-we-code-at-Formbricks-8bcaa0304a20445db4871831149c0cf5?pvs=4) and understand the coding practises we follow so that you can adhere to them for uniformity.
- **Creating a PR**: Please fork the repository, make your changes and create a new pull request if you want to make an update.
- **E2E Tests**: [Understand how we write E2E tests](https://formbricks.notion.site/Formbricks-End-to-End-Tests-06dc830d71604deaa8da24714540f7ab?pvs=4) and make sure to consider writing a test whenever you ship a feature.
- **New Question Types**:[Follow this guide](https://formbricks.notion.site/Guidelines-for-Implementing-a-New-Question-Type-9ac0d1c362714addb24b9abeb326d1c1?pvs=4) to keep everything in mind when you want to add a new question type.
- **How to create a service**: [Read this document to understand how we use services](https://formbricks.notion.site/How-to-create-a-service-8e0c035704bb40cb9ea5e5beeeeabd67?pvs=4). This is particulalry important when you need to write a new one.
## Talk to us first
We highly recommend connecting with us on [Discord server](https://formbricks.com/discord) before you ship a contribution. This will increase the likelihood of your PR being merged. And it will decrease the likelihood of you wasting your time :)
## Contributor License Agreement (CLA)
To be able to keep working on Formbricks over the coming years, we need to collect a CLA from all relevant contributors.
Once you open a PR, you will get a message from the CLA bot to fill out the form. Please note that we can only get your contribution merged when we have a CLA signed by you.
## Setup Dev Environment
We currently officially support the below methods to set up your development environment for Formbricks:
- [Gitpod](/docs/developer-docs/contributing/gitpod)
- [GitHub Codespaces](/docs/developer-docs/contributing/codespaces)
- [Local Machine Setup](#local-machine-setup)
Both Gitpod and GitHub Codespaces have a **generous free tier** to explore and develop. For junior developers we suggest using either of these, because you can dive into coding within minutes, not hours.
## Local Machine Setup
<Note>
The below only works for **Mac**, **Linux** & **WSL2** on Windows (not on pure Windows)!
This method is recommended **only for advanced users** & we won't be able to provide official support for this.
</Note>
To get the project running locally on your machine you need to have the following development tools installed:
- Node.JS (we recommend v20)
- [pnpm](https://pnpm.io/)
- [Docker](https://www.docker.com/) (to run PostgreSQL / MailHog)
1. Clone the project & move into the directory:
<Col>
<CodeGroup title="Git clone Formbricks monorepo">
```bash
git clone https://github.com/formbricks/formbricks && cd formbricks
```
</CodeGroup>
</Col>
2. Install Node.JS packages via pnpm. Don't have pnpm? Get it [here](https://pnpm.io/installation)
<Col>
<CodeGroup title="Install dependencies via pnpm">
```bash
pnpm install
```
</CodeGroup>
</Col>
3. Create a `.env` file based on `.env.example`. It's already preset to work with the local development setup but you can also change values if needed.
<Col>
<CodeGroup title="Define environment variables">
```bash
cp .env.example .env
```
</CodeGroup>
</Col>
4. Generate & set some secret values mandatory for the `ENCRYPTION_KEY`, `NEXTAUTH_SECRET` and `CRON_SECRET` in the .env file. You can use the following command to generate the random string of required length:
- For Linux
<Col>
<CodeGroup title="For Linux">
```bash
sed -i '/^ENCRYPTION_KEY=/c\ENCRYPTION_KEY='$(openssl rand -hex 32) .env
sed -i '/^NEXTAUTH_SECRET=/c\NEXTAUTH_SECRET='$(openssl rand -hex 32) .env
sed -i '/^CRON_SECRET=/c\CRON_SECRET='$(openssl rand -hex 32) .env
```
</CodeGroup>
</Col>
- For Mac
<Col>
<CodeGroup title="For Mac">
```bash
sed -i '' '/^ENCRYPTION_KEY=/s|.*|ENCRYPTION_KEY='$(openssl rand -hex 32)'|' .env
sed -i '' '/^NEXTAUTH_SECRET=/s|.*|NEXTAUTH_SECRET='$(openssl rand -hex 32)'|' .env
sed -i '' '/^CRON_SECRET=/s|.*|CRON_SECRET='$(openssl rand -hex 32)'|' .env
```
</CodeGroup>
</Col>
5. Make sure you have [`Docker`](https://docs.docker.com/compose/) & [`docker-compose`](https://docs.docker.com/compose/) installed and running on your machine. Then run the following command to start the Formbricks dev setup:
<Col>
<CodeGroup title="Start Formbricks Dev Setup">
```bash
pnpm go
```
</CodeGroup>
</Col>
This starts the Formbricks main app (plus all its dependencies) as well as the following services using Docker:
- A `postgres` container for hosting your database,
- A `mailhog` container that acts as a mock SMTP server and shows received mails in a web UI (forwarded to your host's `localhost:8025`)
- Demo App at [http://localhost:3002](http://localhost:3002)
- Landing Page at [http://localhost:3001](http://localhost:3001)
<Note>
**WSL2 users**: If you encounter connection issues with Prisma, ensure your WSL2 instance's PostgreSQL
service is stopped before running `pnpm go`. Use the command `sudo systemctl stop postgresql` to stop the
service.
</Note>
**You can now access the Formbricks app on [http://localhost:3000](http://localhost:3000)**. You will be automatically redirected to the login. To use your local installation of formbricks, create a new account.
{" "}
<Note>
A fresh setup does not have a default account. Please create a new account and proceed accordingly.
</Note>
For viewing the emails sent by the system, you can access mailhog at [http://localhost:8025](http://localhost:8025)
### Build
To build all apps and packages and check for build errors, run the following command:
<Col>
<CodeGroup title="Build Formbricks stack">
```bash
pnpm build
```
</CodeGroup>
</Col>

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 22 KiB

Before

Width:  |  Height:  |  Size: 40 KiB

After

Width:  |  Height:  |  Size: 40 KiB

Some files were not shown because too many files have changed in this diff Show More